From b6cd8b230eec8e700b533c2912092a6bf9bf325c Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 22 Jun 2020 12:25:46 -0700 Subject: [PATCH 001/483] TMCStepper 0.7.0 followup (#18388) --- Marlin/src/feature/tmc_util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 805385f23f8f..4bf68c474524 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -197,7 +197,7 @@ class TMCMarlin : public TMC220 TMCMarlin(Stream * SerialPort, const float RS, const uint8_t addr) : TMC2209Stepper(SerialPort, RS, addr) {} - TMCMarlin(const uint16_t RX, const uint16_t TX, const float RS, const uint8_t addr, const bool) : + TMCMarlin(const uint16_t RX, const uint16_t TX, const float RS, const uint8_t addr) : TMC2209Stepper(RX, TX, RS, addr) {} uint8_t get_address() { return slave_address; } From 819e48972d9cb321275a37fcfccaf2a990f4f222 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 22 Jun 2020 13:27:01 -0700 Subject: [PATCH 002/483] Improve U8G+SPI delay override (#18386) Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_LCD.h | 12 ++------ .../dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 19 +++++++++--- Marlin/src/pins/mega/pins_PICA.h | 6 ++-- .../src/pins/ramps/pins_FORMBOT_TREX2PLUS.h | 21 +++++++------ .../src/pins/sanguino/pins_MELZI_CREALITY.h | 12 ++++++-- Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h | 12 ++++++-- Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h | 12 ++++++-- Marlin/src/pins/sanguino/pins_MELZI_V2.h | 14 ++++++--- .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 30 +++++++++++-------- .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 16 ++++++---- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 4 +-- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 4 +-- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 12 ++++++-- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 12 ++++++-- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 18 +++++++---- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 12 ++++++-- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 19 ++++++++---- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 21 ++++++++----- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 9 +++--- .../src/pins/stm32f4/pins_GENERIC_STM32F4.h | 12 ++++++-- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 12 ++++++-- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 12 ++++++-- Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 6 ++-- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 2 +- 27 files changed, 206 insertions(+), 109 deletions(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index c54687a2d5ab..71b5d7a89aa4 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -106,15 +106,9 @@ #elif ENABLED(CR10_STOCKDISPLAY) #define IS_RRD_FG_SC - #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(125) - #endif + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) #elif ENABLED(MKS_12864OLED) diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index 4e38e554a2da..ea65b972eb9e 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -34,19 +34,30 @@ #include "ultralcd_st7920_u8glib_rrd_AVR.h" #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 CPU_ST7920_DELAY_1 + #ifdef BOARD_ST7920_DELAY_1 + #define ST7920_DELAY_1 BOARD_ST7920_DELAY_1 + #else + #define ST7920_DELAY_1 CPU_ST7920_DELAY_1 + #endif #endif #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 CPU_ST7920_DELAY_2 + #ifdef BOARD_ST7920_DELAY_2 + #define ST7920_DELAY_2 BOARD_ST7920_DELAY_2 + #else + #define ST7920_DELAY_2 CPU_ST7920_DELAY_2 + #endif #endif #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 CPU_ST7920_DELAY_3 + #ifdef BOARD_ST7920_DELAY_3 + #define ST7920_DELAY_3 BOARD_ST7920_DELAY_3 + #else + #define ST7920_DELAY_3 CPU_ST7920_DELAY_3 + #endif #endif // Optimize this code with -O3 #pragma GCC optimize (3) - #ifdef ARDUINO_ARCH_STM32F1 #define ST7920_DAT(V) !!((V) & 0x80) #else diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h index 69974773ee2f..490316b624cb 100644 --- a/Marlin/src/pins/mega/pins_PICA.h +++ b/Marlin/src/pins/mega/pins_PICA.h @@ -49,9 +49,9 @@ // // Servos // -#define SERVO0_PIN 3 -#define SERVO1_PIN 4 -#define SERVO2_PIN 5 +#define SERVO0_PIN 3 +#define SERVO1_PIN 4 +#define SERVO2_PIN 5 // // Limit Switches // diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h index d9286e4a01da..c98ba6aff406 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h @@ -21,15 +21,6 @@ */ #pragma once -/** - * Override default LCD timing for Formbot T-Rex 2+ machines. - * The long LCD cables and the routing near electrically noisy stepper motors - * requires a slightly longer setup and hold time on the signals. - */ -#define BOARD_ST7920_DELAY_1 DELAY_NS(200) -#define BOARD_ST7920_DELAY_2 DELAY_NS(200) -#define BOARD_ST7920_DELAY_3 DELAY_NS(200) - /** * Formbot pin assignments */ @@ -205,3 +196,15 @@ #define LCD_PINS_D6 27 #define LCD_PINS_D7 29 #endif + +#if HAS_GRAPHICAL_LCD + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(200) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(200) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(200) + #endif +#endif diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index 75c52b397171..0428c17e21a7 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -37,9 +37,15 @@ // Alter timing for graphical display #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif #endif #include "pins_MELZI.h" diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h index 1ceb8b920e5a..1b14d6efb0fc 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h @@ -29,9 +29,15 @@ // Alter timing for graphical display #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif #endif #include "pins_MELZI.h" diff --git a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h index 8da60593ab94..1221c20806d7 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h @@ -28,9 +28,15 @@ #define BOARD_INFO_NAME "Melzi (Tronxy)" #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #define BOARD_ST7920_DELAY_3 DELAY_NS(0) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(0) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(0) + #endif #endif #include "pins_MELZI.h" diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h index 7db9a2e81052..33462d102a42 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_V2.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_V2.h @@ -24,10 +24,16 @@ #define BOARD_INFO_NAME "Melzi V2" -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) - #define BOARD_ST7920_DELAY_2 DELAY_NS(188) - #define BOARD_ST7920_DELAY_3 DELAY_NS(0) +#if HAS_GRAPHICAL_LCD + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(0) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(188) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(0) + #endif #endif #include "pins_MELZI.h" diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index e63fa7f9cbf7..661fbdb5e84d 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -163,15 +163,27 @@ #else // !FYSETC_MINI_12864 - #define LCD_PINS_D4 PC13 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PB7 - #define LCD_PINS_D6 PC15 - #define LCD_PINS_D7 PC14 - #endif + #define LCD_PINS_D4 PC13 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PB7 + #define LCD_PINS_D6 PC15 + #define LCD_PINS_D7 PC14 + #endif #endif // !FYSETC_MINI_12864 + #if HAS_GRAPHICAL_LCD + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif + #endif + #endif #endif // HAS_SPI_LCD @@ -203,9 +215,3 @@ #endif #define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card - -#if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#endif diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index 6cfa4e21449f..0978369e0b4c 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -43,9 +43,9 @@ // #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE 0x800U // 2KB + #define EEPROM_PAGE_SIZE 0x800U // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -143,9 +143,15 @@ // Alter timing for graphical display #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif #endif // diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 5dd9202d8bfd..fc95d6c0b62e 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -42,9 +42,9 @@ // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE) #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif // diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 176ccc86793f..15c01e872779 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -46,9 +46,9 @@ // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE) #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif // diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index f2a45e652e82..b50be3307935 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -119,7 +119,7 @@ #define SD_DETECT_PIN PC7 #define SDCARD_CONNECTION ONBOARD #define ON_BOARD_SPI_DEVICE 1 -#define ONBOARD_SD_CS_PIN PA4 // SDSS +#define ONBOARD_SD_CS_PIN PA4 // SDSS #define SDIO_SUPPORT #if ENABLED(RET6_12864_LCD) diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index e7e71977c068..a3645aff6e7c 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -159,9 +159,15 @@ #endif #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #endif #endif #endif // HAS_SPI_LCD diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index e7e71977c068..a3645aff6e7c 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -159,9 +159,15 @@ #endif #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #endif #endif #endif // HAS_SPI_LCD diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 25d954f0f091..b575b2483f0e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -42,7 +42,7 @@ #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index 4c10a310bf7d..07630160ba18 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -111,6 +111,18 @@ #endif // !MKS_MINI_12864 + #if HAS_GRAPHICAL_LCD + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif + #endif + #endif // HAS_SPI_LCD // Motor current PWM pins @@ -129,9 +141,3 @@ #define MISO_PIN P1B4 #define MOSI_PIN P1B5 #define SS_PIN PA15 - -#if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 8a6afcc0f5ef..a7594458f3cc 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -237,9 +237,15 @@ // Alter timing for graphical display #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #endif #endif #endif // HAS_SPI_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index e2ecdae8005c..4ecee9ce1dc1 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -328,9 +328,10 @@ #define LCD_PINS_ENABLE PG5 #define LCD_PINS_D4 PG7 - //#undef ST7920_DELAY_1 - //#undef ST7920_DELAY_2 - //#undef ST7920_DELAY_3 + // CR10_STOCKDISPLAY default timing is too fast + #undef BOARD_ST7920_DELAY_1 + #undef BOARD_ST7920_DELAY_2 + #undef BOARD_ST7920_DELAY_3 #else @@ -377,9 +378,15 @@ // Alter timing for graphical display #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #endif #endif //#define DOGLCD_CS PB12 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index dec630aac0f0..1f2c8d94ea6b 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -275,11 +275,10 @@ #define LCD_PINS_ENABLE PG7 #define LCD_PINS_D4 PG3 - // CR10_Stock Display needs a different delay setting on SKR PRO v1.1, so undef it here. - // It will be defined again at the #HAS_GRAPHICAL_LCD section below. - #undef ST7920_DELAY_1 - #undef ST7920_DELAY_2 - #undef ST7920_DELAY_3 + // CR10_STOCKDISPLAY default timing is too fast + #undef BOARD_ST7920_DELAY_1 + #undef BOARD_ST7920_DELAY_2 + #undef BOARD_ST7920_DELAY_3 #elif ENABLED(MKS_MINI_12864) #define DOGLCD_A0 PG6 @@ -328,9 +327,15 @@ // Alter timing for graphical display #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) + #endif #endif #endif // HAS_SPI_LCD diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 989521322922..2d931f378393 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -191,11 +191,10 @@ #define LCD_PINS_ENABLE PD1 #define LCD_PINS_D4 PC12 - // CR10_Stock Display needs a different delay setting on SKR PRO v1.1, so undef it here. - // It will be defined again at the #HAS_GRAPHICAL_LCD section below. - #undef ST7920_DELAY_1 - #undef ST7920_DELAY_2 - #undef ST7920_DELAY_3 + // CR10_STOCKDISPLAY default timing is too fast + #undef BOARD_ST7920_DELAY_1 + #undef BOARD_ST7920_DELAY_2 + #undef BOARD_ST7920_DELAY_3 #else diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h index 0d9356ce52cb..355d1eb54ff0 100644 --- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h +++ b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h @@ -185,7 +185,13 @@ // ST7920 Delays // #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 3d274b1dc42a..35ad324b58a2 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -173,7 +173,13 @@ // ST7920 Delays // #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 436381e4fe5a..04588bee253e 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -170,7 +170,13 @@ // ST7920 Delays // #if HAS_GRAPHICAL_LCD - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(715) + #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h index 521f7203b31b..118b8d875f0e 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h @@ -37,7 +37,7 @@ #if NO_EEPROM_SELECTED #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif #if ENABLED(FLASH_EEPROM_EMULATION) diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 8d2a103b6159..50c9949f3273 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -44,10 +44,10 @@ // TIM7 is used for SERVO // TIMER_SERIAL defaults to TIM7 so we'll override it here // -#define STEP_TIMER 10 -#define TEMP_TIMER 14 +#define STEP_TIMER 10 +#define TEMP_TIMER 14 #define TIMER_SERIAL TIM9 -#define HAL_TIMER_RATE F_CPU +#define HAL_TIMER_RATE F_CPU // // Limit Switches diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index f5f05ddeaf16..c0e089a11244 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -246,7 +246,7 @@ //#define MOSI 22 // 12 B2 ICSP-03 EXP2-05 //#define MISO 23 // 13 B3 ICSP-06 EXP2-05 - // increase delays + // Alter timing for graphical display #define BOARD_ST7920_DELAY_1 DELAY_NS(313) #define BOARD_ST7920_DELAY_2 DELAY_NS(313) #define BOARD_ST7920_DELAY_3 DELAY_NS(313) From e52afa8b19baf13fe0e6b1818a62fc658b2600c5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 22 Jun 2020 13:30:45 -0700 Subject: [PATCH 003/483] Better STM32 Tone timer int priority (#18385) --- Marlin/src/HAL/STM32/timers.cpp | 9 +++++++++ platformio.ini | 1 + 2 files changed, 10 insertions(+) diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index 1228c465d3ec..5383c82212d4 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -36,6 +36,15 @@ #define TEMP_TIMER_IRQ_PRIO 14 // 14 = after hardware ISRs #endif +// Ensure the default timer priority is somewhere between the STEP and TEMP priorities. +// The STM32 framework defaults to interrupt 14 for all timers. This should be increased so that +// timing-sensitive operations such as speaker output are note impacted by the long-running +// temperature ISR. This must be defined in the platformio.ini file or the board's variant.h, +// so that it will be consumed by framework code. +#if !(TIM_IRQ_PRIO > STEP_TIMER_IRQ_PRIO && TIM_IRQ_PRIO < TEMP_TIMER_IRQ_PRIO) + #error "Default timer interrupt priority is unspecified or set to a value which may degrade performance." +#endif + #if HAS_TMC_SW_SERIAL #include #ifndef SWSERIAL_TIMER_IRQ_PRIO diff --git a/platformio.ini b/platformio.ini index 2c18fd54b292..3461d195cc59 100644 --- a/platformio.ini +++ b/platformio.ini @@ -329,6 +329,7 @@ build_flags = ${common.build_flags} -IMarlin/src/HAL/STM32 -std=gnu++14 -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 + -DTIM_IRQ_PRIO=13 build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + From 3bfbd47c6dba54b3628e55135fd93b87938d9881 Mon Sep 17 00:00:00 2001 From: MoellerDi Date: Mon, 22 Jun 2020 22:37:14 +0200 Subject: [PATCH 004/483] Fix 3-point middle point (#18383) --- Marlin/src/module/probe.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 0f8ce4a35ec0..abab33bf7114 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -190,7 +190,7 @@ class Probe { #else points[0].set(min_x(), min_y()); points[1].set(max_x(), min_y()); - points[2].set((max_x() - min_x()) / 2, max_y()); + points[2].set((min_x() + max_x()) / 2, max_y()); #endif #endif } From 07966ea82b6bde36c13aa2265165a9d4883d8445 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 23 Jun 2020 08:38:51 +1200 Subject: [PATCH 005/483] Fix LPC176x RGB NEOPIXEL startup (#18380) --- Marlin/src/feature/leds/neopixel.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 892ebe15cbc7..3c2c0b44fc77 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -71,13 +71,11 @@ void Marlin_NeoPixel::set_color_startup(const uint32_t color) { } void Marlin_NeoPixel::init() { - SET_OUTPUT(NEOPIXEL_PIN); set_brightness(NEOPIXEL_BRIGHTNESS); // 0 - 255 range begin(); show(); // initialize to all off #if ENABLED(NEOPIXEL_STARTUP_TEST) - safe_delay(1000); set_color_startup(adaneo1.Color(255, 0, 0, 0)); // red safe_delay(1000); set_color_startup(adaneo1.Color(0, 255, 0, 0)); // green From e65e2f33f1e4a0a8f47a444b1c14fe659f3bfd26 Mon Sep 17 00:00:00 2001 From: RudolphRiedel <31180093+RudolphRiedel@users.noreply.github.com> Date: Mon, 22 Jun 2020 22:41:01 +0200 Subject: [PATCH 006/483] Fix ExtUI automatic font scaling (#18377) --- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h index 9c0a4c318af1..73aec64a8c22 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h @@ -315,7 +315,7 @@ class CommandProcessor : public CLCD::CommandFifo { #ifdef TOUCH_UI_USE_UTF8 const bool is_utf8 = has_utf8_chars(text); #endif - for (;font >= 26;) { + for (;font > 26;) { int16_t width, height; #ifdef TOUCH_UI_USE_UTF8 if (is_utf8) { From 7434d40f8d39fe0e5cf0f06a2164d3ebb1d88714 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 23 Jun 2020 00:06:49 +0000 Subject: [PATCH 007/483] [cron] Bump distribution date (2020-06-23) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 5f17ef66d731..54f69910c61f 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-22" + #define STRING_DISTRIBUTION_DATE "2020-06-23" #endif /** From 1ea4e393c9e955ac71455ef5f5d703eb9f9028e0 Mon Sep 17 00:00:00 2001 From: Kirill Vergun <647149+o-nix@users.noreply.github.com> Date: Mon, 22 Jun 2020 03:39:01 +0300 Subject: [PATCH 008/483] No 'probing failed' with retry (#18379) --- Marlin/src/module/probe.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 6aefcfa8ac7b..6a75ef46856c 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -727,7 +727,9 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise if (isnan(measured_z)) { stow(); LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); - SERIAL_ERROR_MSG(STR_ERR_PROBING_FAILED); + #if DISABLED(G29_RETRY_AND_RECOVER) + SERIAL_ERROR_MSG(STR_ERR_PROBING_FAILED); + #endif } if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< Probe::probe_at_point"); From 25c7c43a829e3bbc581aae20d24b724a7ad8fbdb Mon Sep 17 00:00:00 2001 From: Fabio Santos Date: Mon, 22 Jun 2020 19:12:45 -0700 Subject: [PATCH 009/483] Add SERIAL_FLOAT_PRECISION option (#18367) --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/core/debug_out.h | 3 +++ Marlin/src/core/macros.h | 2 +- Marlin/src/core/serial.cpp | 4 ++-- Marlin/src/core/serial.h | 6 ++++++ Marlin/src/core/utility.cpp | 4 ++-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/feature/encoder_i2c.cpp | 2 +- Marlin/src/feature/encoder_i2c.h | 4 ++-- Marlin/src/feature/powerloss.cpp | 6 +++--- Marlin/src/gcode/config/M92.cpp | 2 +- Marlin/src/gcode/feature/advance/M900.cpp | 2 +- Marlin/src/gcode/probe/G30.cpp | 2 +- Marlin/src/module/probe.cpp | 7 ++----- 15 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 15297f7e6403..07736c91ca6b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1901,6 +1901,9 @@ // This option inserts short delays between lines of serial output. #define SERIAL_OVERRUN_PROTECTION +// For serial echo, the number of digits after the decimal point +//#define SERIAL_FLOAT_PRECISION 4 + // @section extras /** diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index aceb0af58f0d..744e63724921 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -857,7 +857,7 @@ void setup() { #if ENABLED(MARLIN_DEV_MODE) auto log_current_ms = [&](PGM_P const msg) { SERIAL_ECHO_START(); - SERIAL_CHAR('['); SERIAL_ECHO(millis()); SERIAL_ECHO("] "); + SERIAL_CHAR('['); SERIAL_ECHO(millis()); SERIAL_ECHOPGM("] "); serialprintPGM(msg); SERIAL_EOL(); }; diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index b7506a8304df..8be6523ca770 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -31,6 +31,7 @@ #undef DEBUG_ERROR_START #undef DEBUG_CHAR #undef DEBUG_ECHO +#undef DEBUG_DECIMAL #undef DEBUG_ECHO_F #undef DEBUG_ECHOLN #undef DEBUG_ECHOPGM @@ -57,6 +58,7 @@ #define DEBUG_ERROR_START SERIAL_ERROR_START #define DEBUG_CHAR SERIAL_CHAR #define DEBUG_ECHO SERIAL_ECHO + #define DEBUG_DECIMAL SERIAL_DECIMAL #define DEBUG_ECHO_F SERIAL_ECHO_F #define DEBUG_ECHOLN SERIAL_ECHOLN #define DEBUG_ECHOPGM SERIAL_ECHOPGM @@ -82,6 +84,7 @@ #define DEBUG_ERROR_START() NOOP #define DEBUG_CHAR(...) NOOP #define DEBUG_ECHO(...) NOOP + #define DEBUG_DECIMAL(...) NOOP #define DEBUG_ECHO_F(...) NOOP #define DEBUG_ECHOLN(...) NOOP #define DEBUG_ECHOPGM(...) NOOP diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index cf0fc2c5dba1..2f9273ec80ed 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -270,7 +270,7 @@ #define NEAR(x,y) NEAR_ZERO((x)-(y)) #define RECIPROCAL(x) (NEAR_ZERO(x) ? 0 : (1 / float(x))) -#define FIXFLOAT(f) ({__typeof__(f) _f = (f); _f + (_f < 0 ? -0.00005f : 0.00005f);}) +#define FIXFLOAT(f) ({__typeof__(f) _f = (f); _f + (_f < 0 ? -0.0000005f : 0.0000005f);}) // // Maths macros that can be overridden by HAL diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 313d6ce20eb9..dee452d954ac 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -42,8 +42,8 @@ void serial_echopair_PGM(PGM_P const s_P, const char *v) { serialprintPGM(s_P) void serial_echopair_PGM(PGM_P const s_P, char v) { serialprintPGM(s_P); SERIAL_CHAR(v); } void serial_echopair_PGM(PGM_P const s_P, int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_PGM(PGM_P const s_P, long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(PGM_P const s_P, float v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(PGM_P const s_P, double v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(PGM_P const s_P, float v) { serialprintPGM(s_P); SERIAL_DECIMAL(v); } +void serial_echopair_PGM(PGM_P const s_P, double v) { serialprintPGM(s_P); SERIAL_DECIMAL(v); } void serial_echopair_PGM(PGM_P const s_P, unsigned int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_echopair_PGM(PGM_P const s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index be4c000b52c8..8b72e46a7580 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -286,6 +286,12 @@ extern uint8_t marlin_debug_flags; #define SERIAL_ECHO_TERNARY(TF, PRE, ON, OFF, POST) serial_ternary(TF, PSTR(PRE), PSTR(ON), PSTR(OFF), PSTR(POST)) +#if SERIAL_FLOAT_PRECISION + #define SERIAL_DECIMAL(V) SERIAL_PRINT(V, SERIAL_FLOAT_PRECISION) +#else + #define SERIAL_DECIMAL(V) SERIAL_ECHO(V) +#endif + // // Functions for serial printing from PROGMEM. (Saves loads of SRAM.) // diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index 62e79e42ea8a..e64d6fb5e6d3 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -123,10 +123,10 @@ void safe_delay(millis_t ms) { #if ABL_PLANAR SERIAL_ECHOPGM("ABL Adjustment X"); LOOP_XYZ(a) { - float v = planner.get_axis_position_mm(AxisEnum(a)) - current_position[a]; + const float v = planner.get_axis_position_mm(AxisEnum(a)) - current_position[a]; SERIAL_CHAR(' ', XYZ_CHAR(a)); if (v > 0) SERIAL_CHAR('+'); - SERIAL_ECHO(v); + SERIAL_DECIMAL(v); } #else #if ENABLED(AUTO_BED_LEVELING_UBL) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 95addd6c1257..3c604168a603 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -433,7 +433,7 @@ if (g29_verbose_level > 1) { SERIAL_ECHOPAIR("Probing around (", g29_pos.x); SERIAL_CHAR(','); - SERIAL_ECHO(g29_pos.y); + SERIAL_DECIMAL(g29_pos.y); SERIAL_ECHOLNPGM(").\n"); } const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index cfac36a5d167..d5a8f168db48 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -107,7 +107,7 @@ void I2CPositionEncoder::update() { SERIAL_ECHOLNPAIR("New zero-offset of ", zeroOffset); SERIAL_ECHOPAIR("New position reads as ", get_position()); SERIAL_CHAR('('); - SERIAL_ECHO(mm_from_count(get_position())); + SERIAL_DECIMAL(mm_from_count(get_position())); SERIAL_ECHOLNPGM(")"); #endif } diff --git a/Marlin/src/feature/encoder_i2c.h b/Marlin/src/feature/encoder_i2c.h index 0665ee809d41..f404954cae53 100644 --- a/Marlin/src/feature/encoder_i2c.h +++ b/Marlin/src/feature/encoder_i2c.h @@ -280,13 +280,13 @@ class I2CPositionEncodersMgr { static void set_ec_threshold(const int8_t idx, const float newThreshold, const AxisEnum axis) { CHECK_IDX(); encoders[idx].set_ec_threshold(newThreshold); - SERIAL_ECHOLNPAIR("Error correct threshold for ", axis_codes[axis], " axis set to ", FIXFLOAT(newThreshold), "mm."); + SERIAL_ECHOLNPAIR("Error correct threshold for ", axis_codes[axis], " axis set to ", newThreshold, "mm."); } static void get_ec_threshold(const int8_t idx, const AxisEnum axis) { CHECK_IDX(); const float threshold = encoders[idx].get_ec_threshold(); - SERIAL_ECHOLNPAIR("Error correct threshold for ", axis_codes[axis], " axis is ", FIXFLOAT(threshold), "mm."); + SERIAL_ECHOLNPAIR("Error correct threshold for ", axis_codes[axis], " axis is ", threshold, "mm."); } static int8_t idx_from_axis(const AxisEnum axis) { diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 12de2d26ff9e..0ae1280213cf 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -472,7 +472,7 @@ void PrintJobRecovery::resume() { DEBUG_ECHOPGM("current_position: "); LOOP_XYZE(i) { if (i) DEBUG_CHAR(','); - DEBUG_ECHO(info.current_position[i]); + DEBUG_DECIMAL(info.current_position[i]); } DEBUG_EOL(); @@ -480,7 +480,7 @@ void PrintJobRecovery::resume() { DEBUG_ECHOPGM("home_offset: "); LOOP_XYZ(i) { if (i) DEBUG_CHAR(','); - DEBUG_ECHO(info.home_offset[i]); + DEBUG_DECIMAL(info.home_offset[i]); } DEBUG_EOL(); #endif @@ -489,7 +489,7 @@ void PrintJobRecovery::resume() { DEBUG_ECHOPGM("position_shift: "); LOOP_XYZ(i) { if (i) DEBUG_CHAR(','); - DEBUG_ECHO(info.position_shift[i]); + DEBUG_DECIMAL(info.position_shift[i]); } DEBUG_EOL(); #endif diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp index bc86ff4d3256..4f7279fc34b3 100644 --- a/Marlin/src/gcode/config/M92.cpp +++ b/Marlin/src/gcode/config/M92.cpp @@ -105,7 +105,7 @@ void GcodeSuite::M92() { if (wanted) { const float best = uint16_t(wanted / z_full_step_mm) * z_full_step_mm; SERIAL_ECHOPAIR(", best:[", best); - if (best != wanted) { SERIAL_CHAR(','); SERIAL_ECHO(best + z_full_step_mm); } + if (best != wanted) { SERIAL_CHAR(','); SERIAL_DECIMAL(best + z_full_step_mm); } SERIAL_CHAR(']'); } SERIAL_ECHOLNPGM(" }"); diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp index b3985401cf1a..683f6fff1b12 100644 --- a/Marlin/src/gcode/feature/advance/M900.cpp +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -134,7 +134,7 @@ void GcodeSuite::M900() { SERIAL_ECHOPGM("Advance K"); LOOP_L_N(i, EXTRUDERS) { SERIAL_CHAR(' ', '0' + i, ':'); - SERIAL_ECHO(planner.extruder_advance_K[i]); + SERIAL_DECIMAL(planner.extruder_advance_K[i]); } SERIAL_EOL(); #endif diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index 5a01289deae4..0d8049158c57 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -53,7 +53,7 @@ void GcodeSuite::G30() { const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; const float measured_z = probe.probe_at_point(pos, raise_after, 1); if (!isnan(measured_z)) - SERIAL_ECHOLNPAIR("Bed X: ", FIXFLOAT(pos.x), " Y: ", FIXFLOAT(pos.y), " Z: ", FIXFLOAT(measured_z)); + SERIAL_ECHOLNPAIR("Bed X: ", pos.x, " Y: ", pos.y, " Z: ", measured_z); restore_feedrate_and_scaling(); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 6a75ef46856c..08aa53fc9676 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -715,11 +715,8 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise else if (raise_after == PROBE_PT_STOW) if (stow()) measured_z = NAN; // Error on stow? - if (verbose_level > 2) { - SERIAL_ECHOPAIR_F("Bed X: ", LOGICAL_X_POSITION(rx), 3); - SERIAL_ECHOPAIR_F( " Y: ", LOGICAL_Y_POSITION(ry), 3); - SERIAL_ECHOLNPAIR_F( " Z: ", measured_z, 3); - } + if (verbose_level > 2) + SERIAL_ECHOLNPAIR("Bed X: ", LOGICAL_X_POSITION(rx), " Y: ", LOGICAL_Y_POSITION(ry), " Z: ", measured_z); } feedrate_mm_s = old_feedrate_mm_s; From 2139141f99d94cfaa4bf5ec06605542a2601e9ee Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 22 Jun 2020 21:32:42 -0500 Subject: [PATCH 010/483] Graphical LCD note --- Marlin/Configuration.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 9109e723d068..7c8222f014d5 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1928,6 +1928,8 @@ // IMPORTANT: The U8glib library is required for Graphical Display! // https://github.com/olikraus/U8glib_Arduino // +// NOTE: If the LCD is unresponsive you may need to reverse the plugs. +// // // RepRapDiscount FULL GRAPHIC Smart Controller From 40fce56585594647ae0da610682909048f084eff Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 22 Jun 2020 16:43:21 -0500 Subject: [PATCH 011/483] Move tests up one level --- buildroot/{share => }/tests/ARMED-tests | 0 buildroot/{share => }/tests/BIGTREE_BTT002-tests | 0 buildroot/{share => }/tests/BIGTREE_GTR_V1_0-tests | 0 buildroot/{share => }/tests/BIGTREE_SKR_PRO-tests | 0 buildroot/{share => }/tests/DUE-tests | 0 buildroot/{share => }/tests/FLYF407ZG-tests | 0 buildroot/{share => }/tests/FYSETC_F6_13-tests | 0 buildroot/{share => }/tests/FYSETC_S6-tests | 0 buildroot/{share => }/tests/LPC1768-tests | 0 buildroot/{share => }/tests/LPC1769-tests | 0 buildroot/{share => }/tests/SAMD51_grandcentral_m4-tests | 0 buildroot/{share => }/tests/STM32F070RB_malyan-tests | 0 buildroot/{share => }/tests/STM32F103CB_malyan-tests | 0 buildroot/{share => }/tests/STM32F103RC_btt-tests | 0 buildroot/{share => }/tests/STM32F103RC_btt_USB-tests | 0 buildroot/{share => }/tests/STM32F103RC_fysetc-tests | 0 buildroot/{share => }/tests/STM32F103RC_meeb-tests | 0 buildroot/{share => }/tests/STM32F103RE-tests | 0 buildroot/{share => }/tests/STM32F103RET6_creality-tests | 0 buildroot/{share => }/tests/STM32F103RE_btt-tests | 0 buildroot/{share => }/tests/STM32F103RE_btt_USB-tests | 0 buildroot/{share => }/tests/STM32F103VE_longer-tests | 0 buildroot/{share => }/tests/STM32F4-tests | 0 buildroot/{share => }/tests/STM32F401VE_STEVAL-tests | 0 buildroot/{share => }/tests/STM32F407VE_black-tests | 0 buildroot/{share => }/tests/STM32F7-tests | 0 buildroot/{share => }/tests/at90usb1286_cdc-tests | 0 buildroot/{share => }/tests/at90usb1286_dfu-tests | 0 buildroot/{share => }/tests/esp32-tests | 0 buildroot/{share => }/tests/jgaurora_a5s_a1-tests | 0 buildroot/{share => }/tests/linux_native-tests | 0 buildroot/{share => }/tests/malyan_M300-tests | 0 buildroot/{share => }/tests/mega1280-tests | 0 buildroot/{share => }/tests/mega2560-tests | 0 buildroot/{share => }/tests/mks_robin-tests | 0 buildroot/{share => }/tests/mks_robin_lite-tests | 0 buildroot/{share => }/tests/mks_robin_mini-tests | 0 buildroot/{share => }/tests/mks_robin_nano-tests | 0 buildroot/{share => }/tests/mks_robin_pro-tests | 0 buildroot/{share => }/tests/rambo-tests | 0 buildroot/{share => }/tests/rumba32-tests | 0 buildroot/{share => }/tests/run_tests | 0 buildroot/{share => }/tests/sanguino1284p-tests | 0 buildroot/{share => }/tests/sanguino644p-tests | 0 buildroot/{share => }/tests/teensy31-tests | 0 buildroot/{share => }/tests/teensy35-tests | 0 46 files changed, 0 insertions(+), 0 deletions(-) rename buildroot/{share => }/tests/ARMED-tests (100%) rename buildroot/{share => }/tests/BIGTREE_BTT002-tests (100%) rename buildroot/{share => }/tests/BIGTREE_GTR_V1_0-tests (100%) rename buildroot/{share => }/tests/BIGTREE_SKR_PRO-tests (100%) rename buildroot/{share => }/tests/DUE-tests (100%) rename buildroot/{share => }/tests/FLYF407ZG-tests (100%) rename buildroot/{share => }/tests/FYSETC_F6_13-tests (100%) rename buildroot/{share => }/tests/FYSETC_S6-tests (100%) rename buildroot/{share => }/tests/LPC1768-tests (100%) rename buildroot/{share => }/tests/LPC1769-tests (100%) rename buildroot/{share => }/tests/SAMD51_grandcentral_m4-tests (100%) rename buildroot/{share => }/tests/STM32F070RB_malyan-tests (100%) rename buildroot/{share => }/tests/STM32F103CB_malyan-tests (100%) rename buildroot/{share => }/tests/STM32F103RC_btt-tests (100%) rename buildroot/{share => }/tests/STM32F103RC_btt_USB-tests (100%) rename buildroot/{share => }/tests/STM32F103RC_fysetc-tests (100%) rename buildroot/{share => }/tests/STM32F103RC_meeb-tests (100%) rename buildroot/{share => }/tests/STM32F103RE-tests (100%) rename buildroot/{share => }/tests/STM32F103RET6_creality-tests (100%) rename buildroot/{share => }/tests/STM32F103RE_btt-tests (100%) rename buildroot/{share => }/tests/STM32F103RE_btt_USB-tests (100%) rename buildroot/{share => }/tests/STM32F103VE_longer-tests (100%) rename buildroot/{share => }/tests/STM32F4-tests (100%) rename buildroot/{share => }/tests/STM32F401VE_STEVAL-tests (100%) rename buildroot/{share => }/tests/STM32F407VE_black-tests (100%) rename buildroot/{share => }/tests/STM32F7-tests (100%) rename buildroot/{share => }/tests/at90usb1286_cdc-tests (100%) rename buildroot/{share => }/tests/at90usb1286_dfu-tests (100%) rename buildroot/{share => }/tests/esp32-tests (100%) rename buildroot/{share => }/tests/jgaurora_a5s_a1-tests (100%) rename buildroot/{share => }/tests/linux_native-tests (100%) rename buildroot/{share => }/tests/malyan_M300-tests (100%) rename buildroot/{share => }/tests/mega1280-tests (100%) rename buildroot/{share => }/tests/mega2560-tests (100%) rename buildroot/{share => }/tests/mks_robin-tests (100%) rename buildroot/{share => }/tests/mks_robin_lite-tests (100%) rename buildroot/{share => }/tests/mks_robin_mini-tests (100%) rename buildroot/{share => }/tests/mks_robin_nano-tests (100%) rename buildroot/{share => }/tests/mks_robin_pro-tests (100%) rename buildroot/{share => }/tests/rambo-tests (100%) rename buildroot/{share => }/tests/rumba32-tests (100%) rename buildroot/{share => }/tests/run_tests (100%) rename buildroot/{share => }/tests/sanguino1284p-tests (100%) rename buildroot/{share => }/tests/sanguino644p-tests (100%) rename buildroot/{share => }/tests/teensy31-tests (100%) rename buildroot/{share => }/tests/teensy35-tests (100%) diff --git a/buildroot/share/tests/ARMED-tests b/buildroot/tests/ARMED-tests similarity index 100% rename from buildroot/share/tests/ARMED-tests rename to buildroot/tests/ARMED-tests diff --git a/buildroot/share/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002-tests similarity index 100% rename from buildroot/share/tests/BIGTREE_BTT002-tests rename to buildroot/tests/BIGTREE_BTT002-tests diff --git a/buildroot/share/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests similarity index 100% rename from buildroot/share/tests/BIGTREE_GTR_V1_0-tests rename to buildroot/tests/BIGTREE_GTR_V1_0-tests diff --git a/buildroot/share/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests similarity index 100% rename from buildroot/share/tests/BIGTREE_SKR_PRO-tests rename to buildroot/tests/BIGTREE_SKR_PRO-tests diff --git a/buildroot/share/tests/DUE-tests b/buildroot/tests/DUE-tests similarity index 100% rename from buildroot/share/tests/DUE-tests rename to buildroot/tests/DUE-tests diff --git a/buildroot/share/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG-tests similarity index 100% rename from buildroot/share/tests/FLYF407ZG-tests rename to buildroot/tests/FLYF407ZG-tests diff --git a/buildroot/share/tests/FYSETC_F6_13-tests b/buildroot/tests/FYSETC_F6_13-tests similarity index 100% rename from buildroot/share/tests/FYSETC_F6_13-tests rename to buildroot/tests/FYSETC_F6_13-tests diff --git a/buildroot/share/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6-tests similarity index 100% rename from buildroot/share/tests/FYSETC_S6-tests rename to buildroot/tests/FYSETC_S6-tests diff --git a/buildroot/share/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests similarity index 100% rename from buildroot/share/tests/LPC1768-tests rename to buildroot/tests/LPC1768-tests diff --git a/buildroot/share/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests similarity index 100% rename from buildroot/share/tests/LPC1769-tests rename to buildroot/tests/LPC1769-tests diff --git a/buildroot/share/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4-tests similarity index 100% rename from buildroot/share/tests/SAMD51_grandcentral_m4-tests rename to buildroot/tests/SAMD51_grandcentral_m4-tests diff --git a/buildroot/share/tests/STM32F070RB_malyan-tests b/buildroot/tests/STM32F070RB_malyan-tests similarity index 100% rename from buildroot/share/tests/STM32F070RB_malyan-tests rename to buildroot/tests/STM32F070RB_malyan-tests diff --git a/buildroot/share/tests/STM32F103CB_malyan-tests b/buildroot/tests/STM32F103CB_malyan-tests similarity index 100% rename from buildroot/share/tests/STM32F103CB_malyan-tests rename to buildroot/tests/STM32F103CB_malyan-tests diff --git a/buildroot/share/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests similarity index 100% rename from buildroot/share/tests/STM32F103RC_btt-tests rename to buildroot/tests/STM32F103RC_btt-tests diff --git a/buildroot/share/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB-tests similarity index 100% rename from buildroot/share/tests/STM32F103RC_btt_USB-tests rename to buildroot/tests/STM32F103RC_btt_USB-tests diff --git a/buildroot/share/tests/STM32F103RC_fysetc-tests b/buildroot/tests/STM32F103RC_fysetc-tests similarity index 100% rename from buildroot/share/tests/STM32F103RC_fysetc-tests rename to buildroot/tests/STM32F103RC_fysetc-tests diff --git a/buildroot/share/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb-tests similarity index 100% rename from buildroot/share/tests/STM32F103RC_meeb-tests rename to buildroot/tests/STM32F103RC_meeb-tests diff --git a/buildroot/share/tests/STM32F103RE-tests b/buildroot/tests/STM32F103RE-tests similarity index 100% rename from buildroot/share/tests/STM32F103RE-tests rename to buildroot/tests/STM32F103RE-tests diff --git a/buildroot/share/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests similarity index 100% rename from buildroot/share/tests/STM32F103RET6_creality-tests rename to buildroot/tests/STM32F103RET6_creality-tests diff --git a/buildroot/share/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt-tests similarity index 100% rename from buildroot/share/tests/STM32F103RE_btt-tests rename to buildroot/tests/STM32F103RE_btt-tests diff --git a/buildroot/share/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB-tests similarity index 100% rename from buildroot/share/tests/STM32F103RE_btt_USB-tests rename to buildroot/tests/STM32F103RE_btt_USB-tests diff --git a/buildroot/share/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer-tests similarity index 100% rename from buildroot/share/tests/STM32F103VE_longer-tests rename to buildroot/tests/STM32F103VE_longer-tests diff --git a/buildroot/share/tests/STM32F4-tests b/buildroot/tests/STM32F4-tests similarity index 100% rename from buildroot/share/tests/STM32F4-tests rename to buildroot/tests/STM32F4-tests diff --git a/buildroot/share/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL-tests similarity index 100% rename from buildroot/share/tests/STM32F401VE_STEVAL-tests rename to buildroot/tests/STM32F401VE_STEVAL-tests diff --git a/buildroot/share/tests/STM32F407VE_black-tests b/buildroot/tests/STM32F407VE_black-tests similarity index 100% rename from buildroot/share/tests/STM32F407VE_black-tests rename to buildroot/tests/STM32F407VE_black-tests diff --git a/buildroot/share/tests/STM32F7-tests b/buildroot/tests/STM32F7-tests similarity index 100% rename from buildroot/share/tests/STM32F7-tests rename to buildroot/tests/STM32F7-tests diff --git a/buildroot/share/tests/at90usb1286_cdc-tests b/buildroot/tests/at90usb1286_cdc-tests similarity index 100% rename from buildroot/share/tests/at90usb1286_cdc-tests rename to buildroot/tests/at90usb1286_cdc-tests diff --git a/buildroot/share/tests/at90usb1286_dfu-tests b/buildroot/tests/at90usb1286_dfu-tests similarity index 100% rename from buildroot/share/tests/at90usb1286_dfu-tests rename to buildroot/tests/at90usb1286_dfu-tests diff --git a/buildroot/share/tests/esp32-tests b/buildroot/tests/esp32-tests similarity index 100% rename from buildroot/share/tests/esp32-tests rename to buildroot/tests/esp32-tests diff --git a/buildroot/share/tests/jgaurora_a5s_a1-tests b/buildroot/tests/jgaurora_a5s_a1-tests similarity index 100% rename from buildroot/share/tests/jgaurora_a5s_a1-tests rename to buildroot/tests/jgaurora_a5s_a1-tests diff --git a/buildroot/share/tests/linux_native-tests b/buildroot/tests/linux_native-tests similarity index 100% rename from buildroot/share/tests/linux_native-tests rename to buildroot/tests/linux_native-tests diff --git a/buildroot/share/tests/malyan_M300-tests b/buildroot/tests/malyan_M300-tests similarity index 100% rename from buildroot/share/tests/malyan_M300-tests rename to buildroot/tests/malyan_M300-tests diff --git a/buildroot/share/tests/mega1280-tests b/buildroot/tests/mega1280-tests similarity index 100% rename from buildroot/share/tests/mega1280-tests rename to buildroot/tests/mega1280-tests diff --git a/buildroot/share/tests/mega2560-tests b/buildroot/tests/mega2560-tests similarity index 100% rename from buildroot/share/tests/mega2560-tests rename to buildroot/tests/mega2560-tests diff --git a/buildroot/share/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests similarity index 100% rename from buildroot/share/tests/mks_robin-tests rename to buildroot/tests/mks_robin-tests diff --git a/buildroot/share/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite-tests similarity index 100% rename from buildroot/share/tests/mks_robin_lite-tests rename to buildroot/tests/mks_robin_lite-tests diff --git a/buildroot/share/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests similarity index 100% rename from buildroot/share/tests/mks_robin_mini-tests rename to buildroot/tests/mks_robin_mini-tests diff --git a/buildroot/share/tests/mks_robin_nano-tests b/buildroot/tests/mks_robin_nano-tests similarity index 100% rename from buildroot/share/tests/mks_robin_nano-tests rename to buildroot/tests/mks_robin_nano-tests diff --git a/buildroot/share/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests similarity index 100% rename from buildroot/share/tests/mks_robin_pro-tests rename to buildroot/tests/mks_robin_pro-tests diff --git a/buildroot/share/tests/rambo-tests b/buildroot/tests/rambo-tests similarity index 100% rename from buildroot/share/tests/rambo-tests rename to buildroot/tests/rambo-tests diff --git a/buildroot/share/tests/rumba32-tests b/buildroot/tests/rumba32-tests similarity index 100% rename from buildroot/share/tests/rumba32-tests rename to buildroot/tests/rumba32-tests diff --git a/buildroot/share/tests/run_tests b/buildroot/tests/run_tests similarity index 100% rename from buildroot/share/tests/run_tests rename to buildroot/tests/run_tests diff --git a/buildroot/share/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests similarity index 100% rename from buildroot/share/tests/sanguino1284p-tests rename to buildroot/tests/sanguino1284p-tests diff --git a/buildroot/share/tests/sanguino644p-tests b/buildroot/tests/sanguino644p-tests similarity index 100% rename from buildroot/share/tests/sanguino644p-tests rename to buildroot/tests/sanguino644p-tests diff --git a/buildroot/share/tests/teensy31-tests b/buildroot/tests/teensy31-tests similarity index 100% rename from buildroot/share/tests/teensy31-tests rename to buildroot/tests/teensy31-tests diff --git a/buildroot/share/tests/teensy35-tests b/buildroot/tests/teensy35-tests similarity index 100% rename from buildroot/share/tests/teensy35-tests rename to buildroot/tests/teensy35-tests From a0bbdde4218395ba61538a32c0ace5b3f1b44ac3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 22 Jun 2020 21:28:04 -0500 Subject: [PATCH 012/483] Use libraries from the registry --- .github/workflows/test-builds.yml | 4 +- buildroot/share/git/mftest | 3 +- buildroot/share/tests/.gitattributes | 1 - platformio.ini | 60 ++++++++++++++++------------ 4 files changed, 38 insertions(+), 30 deletions(-) delete mode 100644 buildroot/share/tests/.gitattributes diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index d4ca0726baaa..2a5cc4a54dd4 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -106,6 +106,6 @@ jobs: # Inline tests script [[ "$GITHUB_REPOSITORY" == "MarlinFirmware/Marlin" ]] || exit 0 chmod +x buildroot/bin/* - chmod +x buildroot/share/tests/* - export PATH=./buildroot/bin/:./buildroot/share/tests/:${PATH} + chmod +x buildroot/tests/* + export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} run_tests . ${{ matrix.test-platform }} diff --git a/buildroot/share/git/mftest b/buildroot/share/git/mftest index 62186a5f8206..3a88bf5f286c 100755 --- a/buildroot/share/git/mftest +++ b/buildroot/share/git/mftest @@ -9,7 +9,8 @@ MFINFO=$(mfinfo) || exit 1 [[ -d Marlin/src ]] || { echo "Please 'cd' up to repo root." ; exit 1 ; } -TESTPATH=buildroot/share/tests +TESTPATH=buildroot/tests + STATE_FILE=$( echo ./.pio/.mftestrc ) SED=$(which gsed || which sed) diff --git a/buildroot/share/tests/.gitattributes b/buildroot/share/tests/.gitattributes deleted file mode 100644 index 6313b56c5784..000000000000 --- a/buildroot/share/tests/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/platformio.ini b/platformio.ini index 3461d195cc59..dab718cd84d6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -25,18 +25,18 @@ default_envs = mega2560 # [common] default_src_filter = + - - + -extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py -build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants -lib_deps = - LiquidCrystal - TMCStepper@>=0.7.0 - Adafruit MAX31865 library@>=1.1,<1.2 - Adafruit NeoPixel - U8glib-HAL=https://github.com/MarlinFirmware/U8glib-HAL/archive/bugfix.zip - LiquidTWI2=https://github.com/lincomatic/LiquidTWI2/archive/master.zip - Arduino-L6470=https://github.com/ameyer/Arduino-L6470/archive/0.8.0.zip +extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py +build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants +lib_deps = + LiquidCrystal@1.5.0 + TMCStepper@~0.7.0 + Adafruit MAX31865 library@~1.1.0 + Adafruit NeoPixel@1.5.0 + U8glib-HAL@0.4.1 + Arduino-L6470@0.8.0 + SlowSoftI2CMaster + LiquidTWI2@1.2.7 SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip - SlowSoftI2CMaster=https://github.com/mikeshub/SlowSoftI2CMaster/archive/master.zip # # Default values apply to all 'env:' prefixed environments @@ -283,20 +283,20 @@ debug_tool = jlink [common_LPC] platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.2.zip board = nxp_lpc1768 -build_flags = -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g ${common.build_flags} lib_ldf_mode = off lib_compat_mode = strict extra_scripts = Marlin/src/HAL/LPC1768/upload_extra_script.py src_filter = ${common.default_src_filter} + lib_deps = Servo - LiquidCrystal - U8glib-HAL=https://github.com/MarlinFirmware/U8glib-HAL/archive/bugfix.zip - TMCStepper@>=0.6.2 - Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/release.zip + LiquidCrystal@1.0.0 + U8glib-HAL@0.4.1 + TMCStepper@~0.7.0 + Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -# debug options for backtrace -# -funwind-tables -# -mpoke-function-name +build_flags = -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g ${common.build_flags} + # debug options for backtrace + #-funwind-tables + #-mpoke-function-name # # NXP LPC176x ARM Cortex-M3 @@ -376,10 +376,18 @@ build_flags = ${common_stm32f1.build_flags} -DGENERIC_BOOTLOADER extra_scripts = pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py -lib_deps = ${common_stm32f1.lib_deps} - USBComposite for STM32F1@==0.91 - Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use -lib_ignore = SPI, LiquidCrystal +lib_deps = + TMCStepper@~0.7.0 + Adafruit MAX31865 library@~1.1.0 + U8glib-HAL@0.4.1 + Arduino-L6470@0.8.0 + SlowSoftI2CMaster + LiquidTWI2@1.2.7 + Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use + SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip + SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip + USBComposite for STM32F1@0.91 +lib_ignore = SPI debug_tool = stlink upload_protocol = dfu @@ -417,7 +425,7 @@ platform = ${common_stm32f1.platform} extends = env:STM32F103RC_btt build_flags = ${env:STM32F103RC_btt.build_flags} -DUSE_USB_COMPOSITE lib_deps = ${env:STM32F103RC_btt.lib_deps} - USBComposite for STM32F1@==0.91 + USBComposite for STM32F1@0.91 [env:STM32F103RC_btt_512K] platform = ${common_stm32f1.platform} @@ -430,7 +438,7 @@ platform = ${common_stm32f1.platform} extends = env:STM32F103RC_btt_512K build_flags = ${env:STM32F103RC_btt_512K.build_flags} -DUSE_USB_COMPOSITE lib_deps = ${env:STM32F103RC_btt_512K.lib_deps} - USBComposite for STM32F1@==0.91 + USBComposite for STM32F1@0.91 # # STM32F103RE @@ -459,7 +467,7 @@ platform = ${common_stm32f1.platform} extends = env:STM32F103RE_btt build_flags = ${env:STM32F103RE_btt.build_flags} -DUSE_USB_COMPOSITE lib_deps = ${common_stm32f1.lib_deps} - USBComposite for STM32F1@==0.91 + USBComposite for STM32F1@0.91 # # STM32F4 with STM32GENERIC From ea569ca29eff699f4e678908660f69e3a1e5e78c Mon Sep 17 00:00:00 2001 From: Chris Pepper Date: Tue, 23 Jun 2020 22:30:35 +0100 Subject: [PATCH 013/483] Update LPC176x platform version (#18392) --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index dab718cd84d6..7415631312a0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -281,7 +281,7 @@ debug_tool = jlink # NXP LPC176x ARM Cortex-M3 # [common_LPC] -platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.2.zip +platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.3.zip board = nxp_lpc1768 lib_ldf_mode = off lib_compat_mode = strict From d55a53f9bbbd47cb95365dd9eb53efcdd5f56b2d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Jun 2020 16:44:20 -0500 Subject: [PATCH 014/483] Add maintenance actions --- .github/lock.yml | 40 +++++++++++++++++++++++++++++++ .github/workflows/close-stale.yml | 22 +++++++++++++++++ .github/workflows/lock-closed.yml | 18 ++++++++++++++ .github/workflows/test-builds.yml | 1 - 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 .github/lock.yml create mode 100644 .github/workflows/close-stale.yml create mode 100644 .github/workflows/lock-closed.yml diff --git a/.github/lock.yml b/.github/lock.yml new file mode 100644 index 000000000000..c5ceff66b0a7 --- /dev/null +++ b/.github/lock.yml @@ -0,0 +1,40 @@ +# +# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app +# + +# Number of days of inactivity before a closed issue or pull request is locked +daysUntilLock: 60 + +# Skip issues and pull requests created before a given timestamp. Timestamp must +# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable +skipCreatedBefore: false + +# Issues and pull requests with these labels will be ignored. Set to `[]` to disable +exemptLabels: [ 'no-locking' ] + +# Label to add before locking, such as `outdated`. Set to `false` to disable +lockLabel: false + +# Comment to post before locking. Set to `false` to disable +lockComment: > + This thread has been automatically locked since there has not been + any recent activity after it was closed. Please open a new issue for + related bugs. + +# Assign `resolved` as the reason for locking. Set to `false` to disable +setLockReason: true + +# Limit to only `issues` or `pulls` +# only: issues + +# Optionally, specify configuration settings just for `issues` or `pulls` +# issues: +# exemptLabels: +# - help-wanted +# lockLabel: outdated + +# pulls: +# daysUntilLock: 30 + +# Repository to extend settings from +# _extends: repo diff --git a/.github/workflows/close-stale.yml b/.github/workflows/close-stale.yml new file mode 100644 index 000000000000..30e09c246c02 --- /dev/null +++ b/.github/workflows/close-stale.yml @@ -0,0 +1,22 @@ +# +# close-stale.yml +# Close open issues after a period of inactivity +# + +name: "Close stale issues" + +on: + schedule: + - cron: "56 * * * *" + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v3 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label / comment or this will be closed in 5 days.' + days-before-stale: 30 + days-before-close: 5 + stale-issue-label: 'stale-closing-soon' diff --git a/.github/workflows/lock-closed.yml b/.github/workflows/lock-closed.yml new file mode 100644 index 000000000000..e3303e8c6e2b --- /dev/null +++ b/.github/workflows/lock-closed.yml @@ -0,0 +1,18 @@ +# +# lock-closed.yml +# Lock closed issues after a period of inactivity +# + +name: "Lock closed issue" + +on: + issues: + types: [closed] + +jobs: + lock: + runs-on: ubuntu-latest + steps: + - uses: OSDKDev/lock-issues@v1.1 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 2a5cc4a54dd4..017df44b201c 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -9,7 +9,6 @@ on: pull_request: branches: - bugfix-2.0.x - - dev-2.1.x paths-ignore: - config/** - data/** From f011c6968bd6bc92bc4edc36270c5b58297ad977 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 24 Jun 2020 00:06:36 +0000 Subject: [PATCH 015/483] [cron] Bump distribution date (2020-06-24) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 54f69910c61f..77a107c4da6e 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-23" + #define STRING_DISTRIBUTION_DATE "2020-06-24" #endif /** From 2a9ad52ab104d29ae496b691b42535da241fdc4b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Jun 2020 19:44:03 -0500 Subject: [PATCH 016/483] Run close-stale once per day --- .github/workflows/close-stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-stale.yml b/.github/workflows/close-stale.yml index 30e09c246c02..65604afa9186 100644 --- a/.github/workflows/close-stale.yml +++ b/.github/workflows/close-stale.yml @@ -7,7 +7,7 @@ name: "Close stale issues" on: schedule: - - cron: "56 * * * *" + - cron: "0 1 * * *" jobs: stale: From 1fb2fffdbf14c8970d57c8a59310539c814bca89 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Jun 2020 18:49:45 -0500 Subject: [PATCH 017/483] General cleanup --- Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp | 2 +- Marlin/src/gcode/feature/i2c/M260_M261.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 17 ++++------------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp index 3e74203aecf9..e0726c7cd592 100644 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp @@ -336,7 +336,7 @@ uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) { * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE * @param None * @retval Status of the last operation (Flash write or erase) done during - * EEPROM formating + * EEPROM formatting */ static HAL_StatusTypeDef EE_Format() { FLASH_EraseInitTypeDef pEraseInit; diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp index ea04d2a293d5..13406f36005e 100644 --- a/Marlin/src/gcode/feature/i2c/M260_M261.cpp +++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp @@ -31,7 +31,7 @@ /** * M260: Send data to a I2C slave device * - * This is a PoC, the formating and arguments for the GCODE will + * This is a PoC, the formatting and arguments for the GCODE will * change to be more compatible, the current proposal is: * * M260 A ; Sets the I2C slave address the data will be sent to diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 960acc30408b..2ff25057db90 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -327,13 +327,8 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(G38_PROBE_TARGET) case 38: // G38.2, G38.3: Probe towards target - if (WITHIN(parser.subcode, 2, - #if ENABLED(G38_PROBE_AWAY) - 5 - #else - 3 - #endif - )) G38(parser.subcode); // G38.4, G38.5: Probe away from target + if (WITHIN(parser.subcode, 2, TERN(G38_PROBE_AWAY, 5, 3))) + G38(parser.subcode); // G38.4, G38.5: Probe away from target break; #endif @@ -485,14 +480,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 108: M108(); break; // M108: Cancel Waiting case 112: M112(); break; // M112: Full Shutdown case 410: M410(); break; // M410: Quickstop - Abort all the planned moves. - #if ENABLED(HOST_PROMPT_SUPPORT) - case 876: M876(); break; // M876: Handle Host prompt responses - #endif + TERN_(HOST_PROMPT_SUPPORT, case 876:) // M876: Handle Host prompt responses #else case 108: case 112: case 410: - #if ENABLED(HOST_PROMPT_SUPPORT) - case 876: - #endif + TERN_(HOST_PROMPT_SUPPORT, case 876:) break; #endif From c3d2ffc09c8a15398894bb2050397b9653878923 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Jun 2020 20:37:19 -0500 Subject: [PATCH 018/483] Board-based ST7920 delays --- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 12 ++++++------ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 12 ++++++------ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 12 ++++++------ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 12 ++++++------ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 12 ++++++------ Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 12 ++++++------ Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 12 ++++++------ Marlin/src/pins/stm32f4/pins_VAKE403D.h | 12 ++++++------ 8 files changed, 48 insertions(+), 48 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index aa61c172c729..242368a67276 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -169,14 +169,14 @@ #endif #if HAS_GRAPHICAL_LCD - #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(96) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif - #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(48) + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) #endif - #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(715) + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(715) #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index b575b2483f0e..6d09b09aabbb 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -177,12 +177,12 @@ #define MOSI_PIN PB15 #define SS_PIN PA15 -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) #endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 5f94a1509980..ab52cd6d1eb8 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -140,12 +140,12 @@ #define MOSI_PIN PB15 #define SS_PIN PA15 -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) #endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 2b10f086e9f5..9812224593c0 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -193,14 +193,14 @@ #define LCD_PINS_D7 PD10 #endif - #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(125) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif - #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(125) + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) #endif - #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(125) + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) #endif #endif // !MKS_MINI_12864 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index b42856721d0f..fee9f0baa971 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -263,12 +263,12 @@ #endif // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY #endif -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) #endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(125) +#ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) #endif diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 2c8f0a95bc7b..984cd13d86cb 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -257,12 +257,12 @@ // // ST7920 Delays // -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(96) +#ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(48) +#ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) #endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(715) +#ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(715) #endif diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 2d931f378393..701bf2d7ad1b 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -241,14 +241,14 @@ // Alter timing for graphical display #if HAS_GRAPHICAL_LCD - #ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(96) + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif - #ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(48) + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) #endif - #ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(600) + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(600) #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index ccfc76146c26..3a884f3544d1 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -184,12 +184,12 @@ // // ST7920 Delays // -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(96) +#ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(96) #endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(48) +#ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(48) #endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(715) +#ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(715) #endif From 2a650a2793be724077d624359d549297d0a1daaf Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 24 Jun 2020 16:54:39 -0300 Subject: [PATCH 019/483] TFT_LITTLE_VGL_UI followup (#18410) --- Marlin/src/MarlinCore.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_error_message.h | 4 + Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 + Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 38 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 408 +++++++++--------- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 14 +- 6 files changed, 238 insertions(+), 232 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 744e63724921..66d3c78ca464 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -61,8 +61,8 @@ #if ENABLED(TFT_LITTLE_VGL_UI) #include "lvgl.h" - #include "lcd/extui/lib/mks_ui/inc/tft_lvgl_configuration.h" - #include "lcd/extui/lib/mks_ui/inc/draw_ui.h" + #include "lcd/extui/lib/mks_ui/tft_lvgl_configuration.h" + #include "lcd/extui/lib/mks_ui/draw_ui.h" #endif #if ENABLED(DWIN_CREALITY_LCD) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h index 53071f9048d1..95e26c2bedf9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h @@ -25,6 +25,10 @@ extern "C" { /* C-declarations for C++ */ #endif +#ifndef PGM_P + #define PGM_P const char * +#endif + extern void lv_draw_error_message(PGM_P const msg); extern void lv_clear_error_message(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 01fa6bc37a69..c8df85203ecb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -46,6 +46,8 @@ #include "../../../../feature/pause.h" #endif +#include "draw_ui.h" + CFG_ITMES gCfgItems; UI_CFG uiCfg; DISP_STATE_STACK disp_state_stack; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 54720a3c1f41..796c94ab2d30 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -28,25 +28,25 @@ extern "C" { /* C-declarations for C++ */ #include #include #include "lvgl.h" -#include "inc/tft_multi_language.h" -#include "inc/draw_ready_print.h" -#include "inc/draw_language.h" -#include "inc/draw_set.h" -#include "inc/draw_tool.h" -#include "inc/draw_print_file.h" -#include "inc/draw_dialog.h" -#include "inc/draw_printing.h" -#include "inc/draw_opration.h" -#include "inc/draw_preHeat.h" -#include "inc/draw_extrusion.h" -#include "inc/draw_home.h" -#include "inc/draw_move_motor.h" -#include "inc/draw_fan.h" -#include "inc/draw_about.h" -#include "inc/draw_change_speed.h" -#include "inc/draw_manuaLevel.h" -#include "inc/draw_error_message.h" -#include "inc/printer_opration.h" +#include "tft_multi_language.h" +#include "draw_ready_print.h" +#include "draw_language.h" +#include "draw_set.h" +#include "draw_tool.h" +#include "draw_print_file.h" +#include "draw_dialog.h" +#include "draw_printing.h" +#include "draw_opration.h" +#include "draw_preHeat.h" +#include "draw_extrusion.h" +#include "draw_home.h" +#include "draw_move_motor.h" +#include "draw_fan.h" +#include "draw_about.h" +#include "draw_change_speed.h" +#include "draw_manuaLevel.h" +#include "draw_error_message.h" +#include "printer_opration.h" #define TFT35 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 9874d2406b9a..8fe6c8cbf829 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -390,226 +390,226 @@ void disp_language_init() { #if 1 case LANG_COMPLEX_CHINESE: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_T_CN; - common_menu.text_back = BACK_TEXT_T_CN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_T_CN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_T_CN; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_CN; + common_menu.text_back = BACK_TEXT_CN; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_CN; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_CN; common_menu.print_special_title = PRINTING_GBK; common_menu.pause_special_title = PRINTING_PAUSE_GBK; common_menu.operate_special_title = PRINTING_OPERATION_GBK; // - main_menu.title = TITLE_READYPRINT_T_CN; - main_menu.preheat = PREHEAT_TEXT_T_CN; - main_menu.move = MOVE_TEXT_T_CN; - main_menu.home = HOME_TEXT_T_CN; - main_menu.print = PRINT_TEXT_T_CN; - main_menu.extrude = EXTRUDE_TEXT_T_CN; - main_menu.leveling = LEVELING_TEXT_T_CN; - main_menu.autoleveling = AUTO_LEVELING_TEXT_T_CN; - main_menu.fan = FAN_TEXT_T_CN; - main_menu.set = SET_TEXT_T_CN; - main_menu.more = MORE_TEXT_T_CN; - main_menu.tool = TOOL_TEXT_T_CN; + main_menu.title = TITLE_READYPRINT_CN; + main_menu.preheat = PREHEAT_TEXT_CN; + main_menu.move = MOVE_TEXT_CN; + main_menu.home = HOME_TEXT_CN; + main_menu.print = PRINT_TEXT_CN; + main_menu.extrude = EXTRUDE_TEXT_CN; + main_menu.leveling = LEVELING_TEXT_CN; + main_menu.autoleveling = AUTO_LEVELING_TEXT_CN; + main_menu.fan = FAN_TEXT_CN; + main_menu.set = SET_TEXT_CN; + main_menu.more = MORE_TEXT_CN; + main_menu.tool = TOOL_TEXT_CN; //TOOL - tool_menu.title = TOOL_TEXT_T_CN; - tool_menu.preheat = TOOL_PREHEAT_T_CN; - tool_menu.extrude = TOOL_EXTRUDE_T_CN; - tool_menu.move = TOOL_MOVE_T_CN; - tool_menu.home = TOOL_HOME_T_CN; - tool_menu.leveling = TOOL_LEVELING_T_CN; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_T_CN; - tool_menu.filament = TOOL_FILAMENT_T_CN; - tool_menu.more = TOOL_MORE_T_CN; - // - preheat_menu.adjust_title = TITLE_ADJUST_T_CN; - preheat_menu.title = TITLE_PREHEAT_T_CN; - preheat_menu.add = ADD_TEXT_T_CN; - preheat_menu.dec = DEC_TEXT_T_CN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_T_CN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_T_CN; - preheat_menu.hotbed = HEATBED_TEXT_T_CN; - preheat_menu.off = CLOSE_TEXT_T_CN; - preheat_menu.value_state = TEXT_VALUE_T_CN; - preheat_menu.step_1c = TEXT_1C_T_CN; - preheat_menu.step_5c = TEXT_5C_T_CN; - preheat_menu.step_10c = TEXT_10C_T_CN; - // - move_menu.title = MOVE_TEXT_T_CN; - more_menu.zoffset = ZOFFSET_T_CN; - // - home_menu.title = TITLE_HOME_T_CN; - home_menu.stopmove = HOME_STOPMOVE_T_CN; - // - file_menu.title = TITLE_CHOOSEFILE_T_CN; - file_menu.page_up = PAGE_UP_TEXT_T_CN; - file_menu.page_down = PAGE_DOWN_TEXT_T_CN; - file_menu.file_loading = FILE_LOADING_T_CN; - file_menu.no_file = NO_FILE_T_CN; - file_menu.no_file_and_check = NO_FILE_T_CN;//NO_FILE_AND_CHECK_T_CN; - // - extrude_menu.title = TITLE_EXTRUDE_T_CN; - extrude_menu.in = EXTRUDER_IN_TEXT_T_CN; - extrude_menu.out = EXTRUDER_OUT_TEXT_T_CN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_T_CN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_T_CN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_T_CN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_T_CN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_T_CN; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_T_CN; - extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_T_CN; + tool_menu.title = TOOL_TEXT_CN; + tool_menu.preheat = TOOL_PREHEAT_CN; + tool_menu.extrude = TOOL_EXTRUDE_CN; + tool_menu.move = TOOL_MOVE_CN; + tool_menu.home = TOOL_HOME_CN; + tool_menu.leveling = TOOL_LEVELING_CN; + tool_menu.autoleveling = TOOL_AUTO_LEVELING_CN; + tool_menu.filament = TOOL_FILAMENT_CN; + tool_menu.more = TOOL_MORE_CN; + // + preheat_menu.adjust_title = TITLE_ADJUST_CN; + preheat_menu.title = TITLE_PREHEAT_CN; + preheat_menu.add = ADD_TEXT_CN; + preheat_menu.dec = DEC_TEXT_CN; + preheat_menu.ext1 = EXTRUDER_1_TEXT_CN; + preheat_menu.ext2 = EXTRUDER_2_TEXT_CN; + preheat_menu.hotbed = HEATBED_TEXT_CN; + preheat_menu.off = CLOSE_TEXT_CN; + preheat_menu.value_state = TEXT_VALUE_CN; + preheat_menu.step_1c = TEXT_1C_CN; + preheat_menu.step_5c = TEXT_5C_CN; + preheat_menu.step_10c = TEXT_10C_CN; + // + move_menu.title = MOVE_TEXT_CN; + more_menu.zoffset = ZOFFSET_CN; + // + home_menu.title = TITLE_HOME_CN; + home_menu.stopmove = HOME_STOPMOVE_CN; + // + file_menu.title = TITLE_CHOOSEFILE_CN; + file_menu.page_up = PAGE_UP_TEXT_CN; + file_menu.page_down = PAGE_DOWN_TEXT_CN; + file_menu.file_loading = FILE_LOADING_CN; + file_menu.no_file = NO_FILE_CN; + file_menu.no_file_and_check = NO_FILE_CN;//NO_FILE_AND_CHECK_T_CN; + // + extrude_menu.title = TITLE_EXTRUDE_CN; + extrude_menu.in = EXTRUDER_IN_TEXT_CN; + extrude_menu.out = EXTRUDER_OUT_TEXT_CN; + extrude_menu.ext1 = EXTRUDER_1_TEXT_CN; + extrude_menu.ext2 = EXTRUDER_2_TEXT_CN; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_CN; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_CN; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_CN; + extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_CN; + extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_CN; // leveling_menu.title = TITLE_LEVELING_CN; - leveling_menu.position1 = LEVELING_POINT1_TEXT_T_CN; - leveling_menu.position2 = LEVELING_POINT2_TEXT_T_CN; - leveling_menu.position3 = LEVELING_POINT3_TEXT_T_CN; - leveling_menu.position4 = LEVELING_POINT4_TEXT_T_CN; - leveling_menu.position5 = LEVELING_POINT5_TEXT_T_CN; - // - set_menu.title = TITLE_SET_T_CN; - set_menu.filesys = FILESYS_TEXT_T_CN; - set_menu.wifi = WIFI_TEXT_T_CN; - set_menu.about = ABOUT_TEXT_T_CN; - set_menu.fan = FAN_TEXT_T_CN; - set_menu.filament = FILAMENT_TEXT_T_CN; - set_menu.breakpoint = BREAK_POINT_TEXT_T_CN; - set_menu.motoroff = MOTOR_OFF_TEXT_T_CN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_T_CN; - set_menu.language = LANGUAGE_TEXT_T_CN; - set_menu.shutdown = SHUTDOWN_TEXT_T_CN; - //set_menu.machine_para = MACHINE_PARA_T_CN; - // - filesys_menu.title = TITLE_FILESYS_T_CN; - filesys_menu.sd_sys = SD_CARD_TEXT_T_CN; - filesys_menu.usb_sys = U_DISK_TEXT_T_CN; - // - more_menu.title = TITLE_MORE_T_CN; + leveling_menu.position1 = LEVELING_POINT1_TEXT_CN; + leveling_menu.position2 = LEVELING_POINT2_TEXT_CN; + leveling_menu.position3 = LEVELING_POINT3_TEXT_CN; + leveling_menu.position4 = LEVELING_POINT4_TEXT_CN; + leveling_menu.position5 = LEVELING_POINT5_TEXT_CN; + // + set_menu.title = TITLE_SET_CN; + set_menu.filesys = FILESYS_TEXT_CN; + set_menu.wifi = WIFI_TEXT_CN; + set_menu.about = ABOUT_TEXT_CN; + set_menu.fan = FAN_TEXT_CN; + set_menu.filament = FILAMENT_TEXT_CN; + set_menu.breakpoint = BREAK_POINT_TEXT_CN; + set_menu.motoroff = MOTOR_OFF_TEXT_CN; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_CN; + set_menu.language = LANGUAGE_TEXT_CN; + set_menu.shutdown = SHUTDOWN_TEXT_CN; + //set_menu.machine_para = MACHINE_PARA_CN; + // + filesys_menu.title = TITLE_FILESYS_CN; + filesys_menu.sd_sys = SD_CARD_TEXT_CN; + filesys_menu.usb_sys = U_DISK_TEXT_CN; + // + more_menu.title = TITLE_MORE_CN; //WIFI wifi_menu.title = WIFI_TEXT; //wifi_menu.key = WIFI_KEY_TEXT_CN; //wifi_menu.ip = WIFI_IP_TEXT_CN; //wifi_menu.state = WIFI_STA_TEXT_CN; - wifi_menu.cloud = CLOUD_TEXT_T_CN; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_T_CN; + wifi_menu.cloud = CLOUD_TEXT_CN; + wifi_menu.reconnect = WIFI_RECONNECT_TEXT_CN; //CLOUD - cloud_menu.title = TITLE_CLOUD_TEXT_T_CN; - cloud_menu.bind = CLOUD_BINDED_T_CN; - cloud_menu.binded = CLOUD_BINDED_T_CN; - cloud_menu.unbind = CLOUD_UNBIND_T_CN; - cloud_menu.unbinding = CLOUD_UNBINDED_T_CN; - cloud_menu.disconnected = CLOUD_DISCONNECTED_T_CN; - cloud_menu.disable = CLOUD_DISABLE_T_CN; - // - about_menu.title = ABOUT_TEXT_T_CN; - about_menu.type = ABOUT_TYPE_TEXT_T_CN; - about_menu.version = ABOUT_VERSION_TEXT_T_CN; - about_menu.wifi = ABOUT_WIFI_TEXT_T_CN; - - // - fan_menu.title = FAN_TEXT_T_CN; - fan_menu.add = FAN_ADD_TEXT_T_CN; - fan_menu.dec = FAN_DEC_TEXT_T_CN; - fan_menu.state = FAN_TIPS1_TEXT_T_CN; - // - filament_menu.title = TITLE_FILAMENT_T_CN; - filament_menu.in = FILAMENT_IN_TEXT_T_CN; - filament_menu.out = FILAMENT_OUT_TEXT_T_CN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_T_CN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_T_CN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_T_CN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_T_CN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_T_CN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_T_CN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_T_CN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_T_CN; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_T_CN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_T_CN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_T_CN; - - - // - language_menu.title = TITLE_LANGUAGE_T_CN; - language_menu.next = PAGE_DOWN_TEXT_T_CN; - language_menu.up = PAGE_UP_TEXT_T_CN; - - // - printing_menu.title = TITLE_PRINTING_T_CN; - printing_menu.option = PRINTING_OPERATION_T_CN; - printing_menu.stop = PRINTING_STOP_T_CN; - printing_menu.pause = PRINTING_PAUSE_T_CN; - printing_menu.resume = PRINTING_RESUME_T_CN; - - // - operation_menu.title = TITLE_OPERATION_T_CN; - operation_menu.pause = PRINTING_PAUSE_T_CN; - operation_menu.stop = PRINTING_STOP_T_CN; - operation_menu.temp = PRINTING_TEMP_T_CN; - operation_menu.fan = FAN_TEXT_T_CN; - operation_menu.extr = PRINTING_EXTRUDER_T_CN; - operation_menu.speed = PRINTING_CHANGESPEED_T_CN; - operation_menu.filament = FILAMENT_TEXT_T_CN; - operation_menu.more = PRINTING_MORE_T_CN; - operation_menu.move = PRINTING_MOVE_T_CN; - operation_menu.auto_off = AUTO_SHUTDOWN_T_CN; - operation_menu.manual_off = MANUAL_SHUTDOWN_T_CN; - // - pause_menu.title = TITLE_PAUSE_T_CN; - pause_menu.resume = PRINTING_RESUME_T_CN; - pause_menu.stop = PRINTING_STOP_T_CN; - pause_menu.extrude = PRINTING_EXTRUDER_T_CN; - pause_menu.move = PRINTING_MOVE_T_CN; - pause_menu.filament = FILAMENT_TEXT_T_CN; - pause_menu.more = PRINTING_MORE_T_CN; - - // - speed_menu.title = PRINTING_CHANGESPEED_T_CN; - speed_menu.add = ADD_TEXT_T_CN; - speed_menu.dec = DEC_TEXT_T_CN; - speed_menu.move = MOVE_SPEED_T_CN; - speed_menu.extrude = EXTRUDER_SPEED_T_CN; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_T_CN; - speed_menu.move_speed = MOVE_SPEED_STATE_T_CN; - // - printing_more_menu.title = TITLE_MORE_T_CN; - printing_more_menu.fan = FAN_TEXT_T_CN; - printing_more_menu.auto_close = AUTO_SHUTDOWN_T_CN; - printing_more_menu.manual = MANUAL_SHUTDOWN_T_CN; - printing_more_menu.speed = PRINTING_CHANGESPEED_T_CN; - printing_more_menu.temp = PRINTING_TEMP_T_CN; + cloud_menu.title = TITLE_CLOUD_TEXT_CN; + cloud_menu.bind = CLOUD_BINDED_CN; + cloud_menu.binded = CLOUD_BINDED_CN; + cloud_menu.unbind = CLOUD_UNBIND_CN; + cloud_menu.unbinding = CLOUD_UNBINDED_CN; + cloud_menu.disconnected = CLOUD_DISCONNECTED_CN; + cloud_menu.disable = CLOUD_DISABLE_CN; + // + about_menu.title = ABOUT_TEXT_CN; + about_menu.type = ABOUT_TYPE_TEXT_CN; + about_menu.version = ABOUT_VERSION_TEXT_CN; + about_menu.wifi = ABOUT_WIFI_TEXT_CN; + + // + fan_menu.title = FAN_TEXT_CN; + fan_menu.add = FAN_ADD_TEXT_CN; + fan_menu.dec = FAN_DEC_TEXT_CN; + fan_menu.state = FAN_TIPS1_TEXT_CN; + // + filament_menu.title = TITLE_FILAMENT_CN; + filament_menu.in = FILAMENT_IN_TEXT_CN; + filament_menu.out = FILAMENT_OUT_TEXT_CN; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_CN; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_CN; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_CN; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_CN; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN; + filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_CN; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_CN; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN; + + + // + language_menu.title = TITLE_LANGUAGE_CN; + language_menu.next = PAGE_DOWN_TEXT_CN; + language_menu.up = PAGE_UP_TEXT_CN; + + // + printing_menu.title = TITLE_PRINTING_CN; + printing_menu.option = PRINTING_OPERATION_CN; + printing_menu.stop = PRINTING_STOP_CN; + printing_menu.pause = PRINTING_PAUSE_CN; + printing_menu.resume = PRINTING_RESUME_CN; + + // + operation_menu.title = TITLE_OPERATION_CN; + operation_menu.pause = PRINTING_PAUSE_CN; + operation_menu.stop = PRINTING_STOP_CN; + operation_menu.temp = PRINTING_TEMP_CN; + operation_menu.fan = FAN_TEXT_CN; + operation_menu.extr = PRINTING_EXTRUDER_CN; + operation_menu.speed = PRINTING_CHANGESPEED_CN; + operation_menu.filament = FILAMENT_TEXT_CN; + operation_menu.more = PRINTING_MORE_CN; + operation_menu.move = PRINTING_MOVE_CN; + operation_menu.auto_off = AUTO_SHUTDOWN_CN; + operation_menu.manual_off = MANUAL_SHUTDOWN_CN; + // + pause_menu.title = TITLE_PAUSE_CN; + pause_menu.resume = PRINTING_RESUME_CN; + pause_menu.stop = PRINTING_STOP_CN; + pause_menu.extrude = PRINTING_EXTRUDER_CN; + pause_menu.move = PRINTING_MOVE_CN; + pause_menu.filament = FILAMENT_TEXT_CN; + pause_menu.more = PRINTING_MORE_CN; + + // + speed_menu.title = PRINTING_CHANGESPEED_CN; + speed_menu.add = ADD_TEXT_CN; + speed_menu.dec = DEC_TEXT_CN; + speed_menu.move = MOVE_SPEED_CN; + speed_menu.extrude = EXTRUDER_SPEED_CN; + speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_CN; + speed_menu.move_speed = MOVE_SPEED_STATE_CN; + // + printing_more_menu.title = TITLE_MORE_CN; + printing_more_menu.fan = FAN_TEXT_CN; + printing_more_menu.auto_close = AUTO_SHUTDOWN_CN; + printing_more_menu.manual = MANUAL_SHUTDOWN_CN; + printing_more_menu.speed = PRINTING_CHANGESPEED_CN; + printing_more_menu.temp = PRINTING_TEMP_CN; //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_T_CN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_T_CN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_T_CN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_T_CN; - print_file_dialog_menu.retry = DIALOG_RETRY_T_CN; - print_file_dialog_menu.stop = DIALOG_STOP_T_CN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_T_CN; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_T_CN; - - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_T_CN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_T_CN; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_T_CN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_T_CN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_T_CN; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_T_CN; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_CN; + print_file_dialog_menu.cancle = DIALOG_CANCLE_CN; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_CN; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_CN; + print_file_dialog_menu.retry = DIALOG_RETRY_CN; + print_file_dialog_menu.stop = DIALOG_STOP_CN; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_CN; + print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_CN; + + print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_CN; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_CN; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_CN; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_CN; + print_file_dialog_menu.reprint = DIALOG_REPRINT_CN; + print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_CN; //ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_T_CN; - zoffset_menu.inc = ZOFFSET_INC_T_CN; - zoffset_menu.dec = ZOFFSET_DEC_T_CN; - - pause_msg_menu.pausing = MESSEGE_PAUSING_T_CN; - pause_msg_menu.changing = MESSEGE_CHANGING_T_CN; - pause_msg_menu.unload = MESSEGE_UNLOAD_T_CN; - pause_msg_menu.waiting = MESSEGE_WAITING_T_CN; - pause_msg_menu.insert = MESSEGE_INSERT_T_CN; - pause_msg_menu.load = MESSEGE_LOAD_T_CN; - pause_msg_menu.purge = MESSEGE_PURGE_T_CN; - pause_msg_menu.resume = MESSEGE_RESUME_T_CN; - pause_msg_menu.heat = MESSEGE_HEAT_T_CN; - pause_msg_menu.heating = MESSEGE_HEATING_T_CN; - pause_msg_menu.option = MESSEGE_OPTION_T_CN; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_T_CN; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_T_CN; + zoffset_menu.title = TITLE_ZOFFSET_CN; + zoffset_menu.inc = ZOFFSET_INC_CN; + zoffset_menu.dec = ZOFFSET_DEC_CN; + + pause_msg_menu.pausing = MESSEGE_PAUSING_CN; + pause_msg_menu.changing = MESSEGE_CHANGING_CN; + pause_msg_menu.unload = MESSEGE_UNLOAD_CN; + pause_msg_menu.waiting = MESSEGE_WAITING_CN; + pause_msg_menu.insert = MESSEGE_INSERT_CN; + pause_msg_menu.load = MESSEGE_LOAD_CN; + pause_msg_menu.purge = MESSEGE_PURGE_CN; + pause_msg_menu.resume = MESSEGE_RESUME_CN; + pause_msg_menu.heat = MESSEGE_HEAT_CN; + pause_msg_menu.heating = MESSEGE_HEATING_CN; + pause_msg_menu.option = MESSEGE_OPTION_CN; + pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_CN; + pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_CN; break; case LANG_ENGLISH: common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 2443bc7d575f..9ac425305724 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -21,13 +21,13 @@ */ #pragma once -#include "inc/tft_Language_en.h" -#include "inc/tft_Language_s_cn.h" -#include "inc/tft_Language_t_cn.h" -#include "inc/tft_Language_ru.h" -#include "inc/tft_Language_fr.h" -#include "inc/tft_Language_sp.h" -#include "inc/tft_Language_it.h" +#include "tft_Language_en.h" +#include "tft_Language_s_cn.h" +#include "tft_Language_t_cn.h" +#include "tft_Language_ru.h" +#include "tft_Language_fr.h" +#include "tft_Language_sp.h" +#include "tft_Language_it.h" extern void disp_language_init(); From c135db1ce7b8274a014cf9108f569b6cb442aaaf Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Wed, 24 Jun 2020 22:04:39 +0200 Subject: [PATCH 020/483] Display PID Autotune status (#18408) --- Marlin/src/gcode/temp/M303.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index ab1781f3f513..7e049436bb49 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -25,6 +25,7 @@ #if HAS_PID_HEATING #include "../gcode.h" +#include "../../lcd/ultralcd.h" #include "../../module/temperature.h" #if ENABLED(EXTENSIBLE_UI) @@ -84,7 +85,9 @@ void GcodeSuite::M303() { KEEPALIVE_STATE(NOT_BUSY); #endif + ui.set_status(GET_TEXT(MSG_PID_AUTOTUNE)); thermalManager.PID_autotune(temp, e, c, u); + ui.reset_status(); } #endif // HAS_PID_HEATING From eb5f8b693bcbc8adc41e0c351e1d4be1c9b940c1 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 25 Jun 2020 00:06:53 +0000 Subject: [PATCH 021/483] [cron] Bump distribution date (2020-06-25) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 77a107c4da6e..2c7766f315a6 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-24" + #define STRING_DISTRIBUTION_DATE "2020-06-25" #endif /** From b0aad414ec1e9a08985a16ee7ed6439e9e8618bf Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Thu, 25 Jun 2020 02:20:07 +0200 Subject: [PATCH 022/483] Use Preheat 1 as M303 default (#18407) --- Marlin/src/lcd/menu/menu_advanced.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index c0d4df851d52..b57e442b6fba 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -169,7 +169,13 @@ void menu_cancelobject(); #if ENABLED(PID_AUTOTUNE_MENU) #if ENABLED(PIDTEMP) - int16_t autotune_temp[HOTENDS] = ARRAY_BY_HOTENDS1(150); + #ifdef PREHEAT_1_TEMP_HOTEND + #define PID_TUNE_TEMP PREHEAT_1_TEMP_HOTEND + #else + #define PID_TUNE_TEMP 200 + #endif + int16_t autotune_temp[HOTENDS] = ARRAY_BY_HOTENDS1(PID_TUNE_TEMP); + #undef PID_TUNE_TEMP #endif #if ENABLED(PIDTEMPBED) From 4275466f4930ce554419f5f03f07119b8a9aec04 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Jun 2020 19:44:50 -0500 Subject: [PATCH 023/483] Fix issues with no hotend / bed / fan (#18395) --- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 2 +- Marlin/src/gcode/lcd/M145.cpp | 30 +- Marlin/src/inc/Conditionals_post.h | 14 + Marlin/src/inc/SanityCheck.h | 14 +- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 2 - Marlin/src/lcd/dwin/dwin.cpp | 722 +++++++++++---------- Marlin/src/lcd/dwin/dwin.h | 97 ++- Marlin/src/lcd/menu/menu_configuration.cpp | 30 +- Marlin/src/lcd/menu/menu_filament.cpp | 4 +- Marlin/src/lcd/menu/menu_info.cpp | 2 +- Marlin/src/lcd/menu/menu_main.cpp | 4 +- Marlin/src/lcd/menu/menu_temperature.cpp | 116 ++-- Marlin/src/lcd/menu/menu_ubl.cpp | 138 ++-- Marlin/src/lcd/ultralcd.cpp | 4 + Marlin/src/lcd/ultralcd.h | 15 +- Marlin/src/module/configuration_store.cpp | 111 ++-- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/module/temperature.h | 2 +- 19 files changed, 729 insertions(+), 582 deletions(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 2ff25057db90..d34e0665c6e5 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -541,7 +541,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 120: M120(); break; // M120: Enable endstops case 121: M121(); break; // M121: Disable endstops - #if HAS_HOTEND && HAS_LCD_MENU + #if PREHEAT_COUNT case 145: M145(); break; // M145: Set material heatup parameters #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 8548f3a60c6f..ab17cc8d7df3 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -608,7 +608,7 @@ class GcodeSuite { static void M191(); #endif - #if HAS_HOTEND && HAS_LCD_MENU + #if PREHEAT_COUNT static void M145(); #endif diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 30efa3909379..6bbde4d13a26 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if HAS_HOTEND && HAS_LCD_MENU +#if PREHEAT_COUNT #include "../gcode.h" #include "../../lcd/ultralcd.h" @@ -37,25 +37,23 @@ */ void GcodeSuite::M145() { const uint8_t material = (uint8_t)parser.intval('S'); - if (material >= COUNT(ui.preheat_hotend_temp)) + if (material >= PREHEAT_COUNT) SERIAL_ERROR_MSG(STR_ERR_MATERIAL_INDEX); else { - int v; - if (parser.seenval('H')) { - v = parser.value_int(); - ui.preheat_hotend_temp[material] = constrain(v, EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT)); - } - if (parser.seenval('F')) { - v = parser.value_int(); - ui.preheat_fan_speed[material] = (uint8_t)constrain(v, 0, 255); - } + preset_t &mat = ui.material_preset[material]; + #if HAS_HOTEND + if (parser.seenval('H')) + mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT)); + #endif #if TEMP_SENSOR_BED != 0 - if (parser.seenval('B')) { - v = parser.value_int(); - ui.preheat_bed_temp[material] = constrain(v, BED_MINTEMP, BED_MAX_TARGET); - } + if (parser.seenval('B')) + mat.bed_temp = constrain(parser.value_int(), BED_MINTEMP, BED_MAX_TARGET); + #endif + #if HAS_FAN + if (parser.seenval('F')) + mat.fan_speed = constrain(parser.value_int(), 0, 255); #endif } } -#endif // HOTENDS && HAS_LCD_MENU +#endif // PREHEAT_COUNT diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index b98f16f348db..e1e341d12679 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1859,6 +1859,10 @@ #define HAS_CONTROLLER_FAN 1 #endif +#if BED_OR_CHAMBER || HAS_FAN0 + #define BED_OR_CHAMBER_OR_FAN 1 +#endif + // Servos #if PIN_EXISTS(SERVO0) && NUM_SERVOS > 0 #define HAS_SERVO_0 1 @@ -2080,6 +2084,16 @@ #define WRITE_HEATER_CHAMBER(v) WRITE(HEATER_CHAMBER_PIN, (v) ^ HEATER_CHAMBER_INVERTING) #endif +#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER + #define HAS_TEMPERATURE 1 +#endif + +#if HAS_TEMPERATURE && EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD) + #define PREHEAT_COUNT 2 +#else + #undef PREHEAT_COUNT +#endif + /** * Up to 3 PWM fans */ diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index a9febd968fab..004a5b673aa2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1404,12 +1404,16 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif -#if HAS_MESH - #if HAS_CLASSIC_JERK - static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling."); +#if HAS_MESH && HAS_CLASSIC_JERK + static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling."); +#endif + +#if ENABLED(G26_MESH_VALIDATION) + #if !EXTRUDERS + #error "G26_MESH_VALIDATION requires at least one extruder." + #elif !HAS_MESH + #error "G26_MESH_VALIDATION requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL." #endif -#elif ENABLED(G26_MESH_VALIDATION) - #error "G26_MESH_VALIDATION requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL." #endif #if ENABLED(MESH_EDIT_GFX_OVERLAY) && !BOTH(AUTO_BED_LEVELING_UBL, HAS_GRAPHICAL_LCD) diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 6d09228d784c..e34e098dfa10 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -860,8 +860,6 @@ #define STATUS_CHAMBER_WIDTH 0 #endif -#define BED_OR_CHAMBER_OR_FAN (BED_OR_CHAMBER || HAS_FAN0) - // Can also be overridden in Configuration_adv.h // If you can afford it, try the 3-frame fan animation! // Don't compile in the fan animation with no fan diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 74972228ca62..6df5e817f735 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -87,7 +87,7 @@ HMI_Flag HMI_flag{0}; millis_t Encoder_ms = 0; millis_t Wait_ms = 0; -millis_t heat_time = 0; +millis_t dwin_heat_time = 0; int checkkey = 0, last_checkkey = 0; @@ -743,20 +743,24 @@ inline void Draw_Popup_Bkgd_60() { DWIN_Draw_Rectangle(1, Background_window, 14, 60, 271-13, 330); } -void Popup_Window_ETempTooLow(void) { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); - if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 103, 371, 136, 479-93, 69, 240); - DWIN_Frame_AreaCopy(1, 170, 371, 271-1, 479-93, 69+33, 240); - DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); - } - else { - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 20, 235, (char*)"Nozzle is too cold"); - DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280); +#if HAS_HOTEND + + void Popup_Window_ETempTooLow(void) { + Clear_Main_Window(); + Draw_Popup_Bkgd_60(); + DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 103, 371, 136, 479-93, 69, 240); + DWIN_Frame_AreaCopy(1, 170, 371, 271-1, 479-93, 69+33, 240); + DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); + } + else { + DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 20, 235, (char*)"Nozzle is too cold"); + DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280); + } } -} + +#endif void Popup_Window_Resume(void) { Clear_Popup_Area(); @@ -1074,134 +1078,146 @@ void HMI_Zoffset(void) { } } -void HMI_ETemp(void) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) - HMI_ValueStruct.E_Temp += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) - HMI_ValueStruct.E_Temp -= EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return - EncoderRate.encoderRateEnabled = 0; - if (HMI_ValueStruct.show_mode == -1) { // temperature - checkkey = TemperatureID; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); - } - else if (HMI_ValueStruct.show_mode == -2) { - checkkey = PLAPreheat; - HMI_ValueStruct.preheat_hotend_temp[0] = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[0]); - return; - } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - HMI_ValueStruct.preheat_hotend_temp[1] = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[1]); +#if HAS_HOTEND + + void HMI_ETemp(void) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (encoder_diffState == ENCODER_DIFF_CW) + HMI_ValueStruct.E_Temp += EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_CCW) + HMI_ValueStruct.E_Temp -= EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + EncoderRate.encoderRateEnabled = 0; + if (HMI_ValueStruct.show_mode == -1) { // temperature + checkkey = TemperatureID; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); + } + else if (HMI_ValueStruct.show_mode == -2) { + checkkey = PLAPreheat; + ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); + return; + } + else if (HMI_ValueStruct.show_mode == -3) { + checkkey = ABSPreheat; + ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); + return; + } + else { // tune + checkkey = Tune; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp); + } + thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0); return; } - else { // tune - checkkey = Tune; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp); - } - thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0); - return; + // E_Temp limit + NOMORE(HMI_ValueStruct.E_Temp, max_E_Temp); + NOLESS(HMI_ValueStruct.E_Temp, min_E_Temp); + // E_Temp value + if (HMI_ValueStruct.show_mode >= 0) // tune + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp); + else // other page + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); } - // E_Temp limit - NOMORE(HMI_ValueStruct.E_Temp, max_E_Temp); - NOLESS(HMI_ValueStruct.E_Temp, min_E_Temp); - // E_Temp value - if (HMI_ValueStruct.show_mode >= 0) // tune - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp); - else // other page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); } -} -void HMI_BedTemp(void) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) - HMI_ValueStruct.Bed_Temp += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) - HMI_ValueStruct.Bed_Temp -= EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return - EncoderRate.encoderRateEnabled = 0; - if (HMI_ValueStruct.show_mode == -1) { - checkkey = TemperatureID; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); - } - else if (HMI_ValueStruct.show_mode == -2) { - checkkey = PLAPreheat; - HMI_ValueStruct.preheat_bed_temp[0] = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[0]); - return; - } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - HMI_ValueStruct.preheat_bed_temp[1] = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[1]); +#endif + +#if HAS_HEATED_BED + + void HMI_BedTemp(void) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (encoder_diffState == ENCODER_DIFF_CW) + HMI_ValueStruct.Bed_Temp += EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_CCW) + HMI_ValueStruct.Bed_Temp -= EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + EncoderRate.encoderRateEnabled = 0; + if (HMI_ValueStruct.show_mode == -1) { + checkkey = TemperatureID; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); + } + else if (HMI_ValueStruct.show_mode == -2) { + checkkey = PLAPreheat; + ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); + return; + } + else if (HMI_ValueStruct.show_mode == -3) { + checkkey = ABSPreheat; + ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); + return; + } + else { + checkkey = Tune; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp); + } + thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); return; } - else { - checkkey = Tune; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp); - } - thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); - return; + //Bed_Temp limit + NOMORE(HMI_ValueStruct.Bed_Temp, max_Bed_Temp); + NOLESS(HMI_ValueStruct.Bed_Temp, min_Bed_Temp); + //Bed_Temp value + if (HMI_ValueStruct.show_mode >= 0) // tune page + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp); + else // other page + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); } - //Bed_Temp limit - NOMORE(HMI_ValueStruct.Bed_Temp, max_Bed_Temp); - NOLESS(HMI_ValueStruct.Bed_Temp, min_Bed_Temp); - //Bed_Temp value - if (HMI_ValueStruct.show_mode >= 0) // tune page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp); - else // other page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); } -} -void HMI_FanSpeed(void) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) - HMI_ValueStruct.Fan_speed += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) - HMI_ValueStruct.Fan_speed -= EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return - EncoderRate.encoderRateEnabled = 0; - if (HMI_ValueStruct.show_mode == -1) { - checkkey = TemperatureID; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); - } - else if (HMI_ValueStruct.show_mode == -2) { - checkkey = PLAPreheat; - HMI_ValueStruct.preheat_fan_speed[0] = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[0]); - return; - } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - HMI_ValueStruct.preheat_fan_speed[1] = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[1]); +#endif + +#if HAS_FAN + + void HMI_FanSpeed(void) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (encoder_diffState == ENCODER_DIFF_CW) + HMI_ValueStruct.Fan_speed += EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_CCW) + HMI_ValueStruct.Fan_speed -= EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return + EncoderRate.encoderRateEnabled = 0; + if (HMI_ValueStruct.show_mode == -1) { + checkkey = TemperatureID; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); + } + else if (HMI_ValueStruct.show_mode == -2) { + checkkey = PLAPreheat; + ui.material_preset[0].fan_speed = HMI_ValueStruct.Fan_speed; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); + return; + } + else if (HMI_ValueStruct.show_mode == -3) { + checkkey = ABSPreheat; + ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); + return; + } + else { + checkkey = Tune; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed); + } + thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); return; } - else { - checkkey = Tune; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed); - } - thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); - return; + //Fan_speed limit + NOMORE(HMI_ValueStruct.Fan_speed, FanOn); + NOLESS(HMI_ValueStruct.Fan_speed, FanOff); + // Fan_speed value + if (HMI_ValueStruct.show_mode >= 0) // tune page + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed); + else // other page + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); } - //Fan_speed limit - NOMORE(HMI_ValueStruct.Fan_speed, FanOn); - NOLESS(HMI_ValueStruct.Fan_speed, FanOff); - // Fan_speed value - if (HMI_ValueStruct.show_mode >= 0) // tune page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed); - else // other page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); } -} + +#endif void HMI_PrintSpeed(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); @@ -1238,7 +1254,9 @@ void HMI_MaxFeedspeedXYZE(void) { if (HMI_flag.feedspeed_flag == X_AXIS) planner.set_max_feedrate(X_AXIS, HMI_ValueStruct.Max_Feedspeed); else if (HMI_flag.feedspeed_flag == Y_AXIS) planner.set_max_feedrate(Y_AXIS, HMI_ValueStruct.Max_Feedspeed); else if (HMI_flag.feedspeed_flag == Z_AXIS) planner.set_max_feedrate(Z_AXIS, HMI_ValueStruct.Max_Feedspeed); - else if (HMI_flag.feedspeed_flag == E_AXIS) planner.set_max_feedrate(E_AXIS, HMI_ValueStruct.Max_Feedspeed); + #if HAS_HOTEND + else if (HMI_flag.feedspeed_flag == E_AXIS) planner.set_max_feedrate(E_AXIS, HMI_ValueStruct.Max_Feedspeed); + #endif DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); return; } @@ -1246,7 +1264,9 @@ void HMI_MaxFeedspeedXYZE(void) { if (HMI_flag.feedspeed_flag == X_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[X_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[X_AXIS]*2;} else if (HMI_flag.feedspeed_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Y_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Y_AXIS]*2;} else if (HMI_flag.feedspeed_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Z_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Z_AXIS]*2;} - else if (HMI_flag.feedspeed_flag == E_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[E_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[E_AXIS]*2;} + #if HAS_HOTEND + else if (HMI_flag.feedspeed_flag == E_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[E_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[E_AXIS]*2;} + #endif if (HMI_ValueStruct.Max_Feedspeed < min_MaxFeedspeed) HMI_ValueStruct.Max_Feedspeed = min_MaxFeedspeed; //MaxFeedspeed value DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); @@ -1264,7 +1284,9 @@ void HMI_MaxAccelerationXYZE(void) { if (HMI_flag.acc_flag == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); else if (HMI_flag.acc_flag == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration); else if (HMI_flag.acc_flag == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_flag == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); + #if HAS_HOTEND + else if (HMI_flag.acc_flag == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); + #endif DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); return; } @@ -1272,7 +1294,9 @@ void HMI_MaxAccelerationXYZE(void) { if (HMI_flag.acc_flag == X_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[X_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[X_AXIS]*2;} else if (HMI_flag.acc_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Y_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Y_AXIS]*2;} else if (HMI_flag.acc_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Z_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Z_AXIS]*2;} - else if (HMI_flag.acc_flag == E_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[E_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[E_AXIS]*2;} + #if HAS_HOTEND + else if (HMI_flag.acc_flag == E_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[E_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[E_AXIS]*2;} + #endif if (HMI_ValueStruct.Max_Acceleration < min_MaxAcceleration) HMI_ValueStruct.Max_Acceleration = min_MaxAcceleration; // MaxAcceleration value DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); @@ -2105,14 +2129,14 @@ void HMI_Prepare(void) { #endif break; case 5: // PLA preheat - thermalManager.setTargetHotend(HMI_ValueStruct.preheat_hotend_temp[0], 0); - thermalManager.setTargetBed(HMI_ValueStruct.preheat_bed_temp[0]); - thermalManager.set_fan_speed(0, HMI_ValueStruct.preheat_fan_speed[0]); + thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0); + thermalManager.setTargetBed(ui.material_preset[0].bed_temp); + thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed); break; case 6: // ABS preheat - thermalManager.setTargetHotend(HMI_ValueStruct.preheat_hotend_temp[1], 0); - thermalManager.setTargetBed(HMI_ValueStruct.preheat_bed_temp[1]); - thermalManager.set_fan_speed(0, HMI_ValueStruct.preheat_fan_speed[1]); + thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0); + thermalManager.setTargetBed(ui.material_preset[1].bed_temp); + thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed); break; case 7: // cool thermalManager.zero_fan_speeds(); @@ -2287,20 +2311,23 @@ void HMI_AxisMove(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; - // popup window resume - if (HMI_flag.ETempTooLow_flag) { - if (encoder_diffState == ENCODER_DIFF_ENTER) { - HMI_flag.ETempTooLow_flag = 0; - Draw_Move_Menu(); - current_position.e = HMI_ValueStruct.Move_E_scale = 0; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - DWIN_UpdateLCD(); + #if HAS_HOTEND + // popup window resume + if (HMI_flag.ETempTooLow_flag) { + if (encoder_diffState == ENCODER_DIFF_ENTER) { + HMI_flag.ETempTooLow_flag = 0; + Draw_Move_Menu(); + current_position.e = HMI_ValueStruct.Move_E_scale = 0; + DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_UpdateLCD(); + } + return; } - return; - } + #endif + // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { if (select_axis.inc(4)) Move_Highlight(1, select_axis.now); @@ -2334,28 +2361,30 @@ void HMI_AxisMove(void) { DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); EncoderRate.encoderRateEnabled = 1; break; - case 4: // Extruder - // window tips - #ifdef PREVENT_COLD_EXTRUSION - if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) { - HMI_flag.ETempTooLow_flag = 1; - Popup_Window_ETempTooLow(); - DWIN_UpdateLCD(); - return; - } - #endif - checkkey = Extruder; - HMI_ValueStruct.Move_E_scale = current_position.e*MinUnitMult; - show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - EncoderRate.encoderRateEnabled = 1; - break; - default: - break; + #if HAS_HOTEND + case 4: // Extruder + // window tips + #ifdef PREVENT_COLD_EXTRUSION + if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) { + HMI_flag.ETempTooLow_flag = 1; + Popup_Window_ETempTooLow(); + DWIN_UpdateLCD(); + return; + } + #endif + checkkey = Extruder; + HMI_ValueStruct.Move_E_scale = current_position.e*MinUnitMult; + show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + EncoderRate.encoderRateEnabled = 1; + break; + #endif } } DWIN_UpdateLCD(); } +enum + /* TemperatureID */ void HMI_Temperature(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); @@ -2376,126 +2405,132 @@ void HMI_Temperature(void) { index_control = MROWS; Draw_Control_Menu(); break; - case 1: // nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); - EncoderRate.encoderRateEnabled = 1; - break; - case 2: // bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); - EncoderRate.encoderRateEnabled = 1; - break; - case 3: // fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); - EncoderRate.encoderRateEnabled = 1; - break; - case 4: // PLA preheat setting + #if HAS_HOTEND + case 1: // nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HEATED_BED + case 2: // bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_FAN + case 3: // fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HOTEND + case 4: // PLA preheat setting - checkkey = PLAPreheat; - select_PLA.reset(); - HMI_ValueStruct.show_mode = -2; + checkkey = PLAPreheat; + select_PLA.reset(); + HMI_ValueStruct.show_mode = -2; - Clear_Main_Window(); + Clear_Main_Window(); - if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 59, 16, 271-132, 479-450, 14, 8); - - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2)); // PLA bed temp - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4)); // save PLA configuration - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("PLA Settings"); // TODO: GET_TEXT_F - #else - DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8); - #endif + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 59, 16, 271-132, 479-450, 14, 8); - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(2)+3); - DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3); - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // PLA bed temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4)); // save PLA configuration - } + DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2)); // PLA bed temp + DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // PLA fan speed + DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4)); // save PLA configuration + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("PLA Settings"); // TODO: GET_TEXT_F + #else + DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8); + #endif + + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(2)+3); + DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3); + DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // PLA bed temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3)); // PLA fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4)); // save PLA configuration + } - Draw_Back_First(); + Draw_Back_First(); - Draw_Menu_Line(1, ICON_SetEndTemp); - Draw_Menu_Line(2, ICON_SetBedTemp); - Draw_Menu_Line(3, ICON_FanSpeed); - Draw_Menu_Line(4, ICON_WriteEEPROM); + Draw_Menu_Line(1, ICON_SetEndTemp); + Draw_Menu_Line(2, ICON_SetBedTemp); + Draw_Menu_Line(3, ICON_FanSpeed); + Draw_Menu_Line(4, ICON_WriteEEPROM); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[0]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[0]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[0]); + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); - break; - case 5: // ABS preheat setting + break; + case 5: // ABS preheat setting - checkkey = ABSPreheat; - select_ABS.reset(); - HMI_ValueStruct.show_mode = -3; + checkkey = ABSPreheat; + select_ABS.reset(); + HMI_ValueStruct.show_mode = -3; - Clear_Main_Window(); + Clear_Main_Window(); - if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 142, 16, 271-48, 479-450, 14, 8); - - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2)); // ABS bed temp - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX+28, MBASE(4)+2); // save ABS configuration - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("ABS Settings"); // TODO: GET_TEXT_F - #else - DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8); - #endif + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 142, 16, 271-48, 479-450, 14, 8); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(2)+3); - DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3); - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // ABS bed temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX+33, MBASE(4)); // save ABS configuration - } + DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1)); // ABS nozzle temp + DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2)); // ABS bed temp + DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // ABS fan speed + DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX+28, MBASE(4)+2); // save ABS configuration + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("ABS Settings"); // TODO: GET_TEXT_F + #else + DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8); + #endif + + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // ABS nozzle temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(2)+3); + DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3); + DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // ABS bed temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3)); // ABS fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX+33, MBASE(4)); // save ABS configuration + } - Draw_Back_First(); + Draw_Back_First(); - Draw_Menu_Line(1, ICON_SetEndTemp); - Draw_Menu_Line(2, ICON_SetBedTemp); - Draw_Menu_Line(3, ICON_FanSpeed); - Draw_Menu_Line(4, ICON_WriteEEPROM); + Draw_Menu_Line(1, ICON_SetEndTemp); + Draw_Menu_Line(2, ICON_SetBedTemp); + Draw_Menu_Line(3, ICON_FanSpeed); + Draw_Menu_Line(4, ICON_WriteEEPROM); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[1]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[1]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[1]); + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); + DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); - break; - default: - break; + break; + #endif } } DWIN_UpdateLCD(); @@ -2792,24 +2827,30 @@ void HMI_Tune(void) { DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1+MROWS-index_tune), feedrate_percentage); EncoderRate.encoderRateEnabled = 1; break; - case 2: // nozzle temp - checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), thermalManager.temp_hotend[0].target); - EncoderRate.encoderRateEnabled = 1; - break; - case 3: // bed temp - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), thermalManager.temp_bed.target); - EncoderRate.encoderRateEnabled = 1; - break; - case 4: // fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), thermalManager.fan_speed[0]); - EncoderRate.encoderRateEnabled = 1; - break; + #if HAS_HOTEND + case 2: // nozzle temp + checkkey = ETemp; + HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), thermalManager.temp_hotend[0].target); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HEATED_BED + case 3: // bed temp + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), thermalManager.temp_bed.target); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_FAN + case 4: // fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), thermalManager.fan_speed[0]); + EncoderRate.encoderRateEnabled = 1; + break; + #endif case 5: // z-offset checkkey = Homeoffset; HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; @@ -2860,24 +2901,30 @@ void HMI_PLAPreheatSetting(void) { HMI_ValueStruct.show_mode = -1; Draw_Temperature_Menu(); break; - case 1: // set nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = HMI_ValueStruct.preheat_hotend_temp[0]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[0]); - EncoderRate.encoderRateEnabled = 1; - break; - case 2: // set bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = HMI_ValueStruct.preheat_bed_temp[0]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[0]); - EncoderRate.encoderRateEnabled = 1; - break; - case 3: // set fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = HMI_ValueStruct.preheat_fan_speed[0]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[0]); - EncoderRate.encoderRateEnabled = 1; - break; + #if HAS_HOTEND + case 1: // set nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HEATED_BED + case 2: // set bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_FAN + case 3: // set fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); + EncoderRate.encoderRateEnabled = 1; + break; + #endif case 4: // save PLA configuration if (settings.save()) { buzzer.tone(100, 659); @@ -2885,8 +2932,7 @@ void HMI_PLAPreheatSetting(void) { } else buzzer.tone(20, 440); break; - default: - break; + default: break; } } DWIN_UpdateLCD(); @@ -2912,24 +2958,30 @@ void HMI_ABSPreheatSetting(void) { HMI_ValueStruct.show_mode = -1; Draw_Temperature_Menu(); break; - case 1: // set nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = HMI_ValueStruct.preheat_hotend_temp[1]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.preheat_hotend_temp[1]); - EncoderRate.encoderRateEnabled = 1; - break; - case 2: // set bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = HMI_ValueStruct.preheat_bed_temp[1]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.preheat_bed_temp[1]); - EncoderRate.encoderRateEnabled = 1; - break; - case 3: // set fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = HMI_ValueStruct.preheat_fan_speed[1]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.preheat_fan_speed[1]); - EncoderRate.encoderRateEnabled = 1; - break; + #if HAS_HOTEND + case 1: // set nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HEATED_BED + case 2: // set bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_FAN + case 3: // set fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; + DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); + EncoderRate.encoderRateEnabled = 1; + break; + #endif case 4: // save PLA configuration if (settings.save()) { buzzer.tone(100, 659); @@ -3257,7 +3309,7 @@ void EachMomentUpdate(void) { /* remain print time */ static millis_t next_remain_time_update = 0; if (elapsed.minute() > 5 && ELAPSED(ms, next_remain_time_update) && HMI_flag.heat_flag == 0) { // show after 5 min and 20s update - remain_time = ((elapsed.value - heat_time) * ((float)card.getFileSize() / (float)card.getIndex())) - (elapsed.value - heat_time); + remain_time = ((elapsed.value - dwin_heat_time) * ((float)card.getFileSize() / (float)card.getIndex())) - (elapsed.value - dwin_heat_time); next_remain_time_update += 20 * 1000UL; Draw_Print_ProgressRemain(); } @@ -3365,9 +3417,15 @@ void DWIN_HandleScreen(void) { case Move_Z: HMI_Move_Z(); break; case Extruder: HMI_Move_E(); break; case Homeoffset: HMI_Zoffset(); break; - case ETemp: HMI_ETemp(); break; - case BedTemp: HMI_BedTemp(); break; - case FanSpeed: HMI_FanSpeed(); break; + #if HAS_HOTEND + case ETemp: HMI_ETemp(); break; + #endif + #if HAS_HEATED_BED + case BedTemp: HMI_BedTemp(); break; + #endif + #if HAS_FAN + case FanSpeed: HMI_FanSpeed(); break; + #endif case PrintSpeed: HMI_PrintSpeed(); break; case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break; case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break; diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/dwin.h index 7be302683b42..9b78601404f0 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/dwin.h @@ -81,8 +81,10 @@ enum processID { Motion, Info, Tune, - PLAPreheat, - ABSPreheat, + #if HAS_HOTEND + PLAPreheat, + ABSPreheat, + #endif MaxSpeed, MaxSpeed_value, MaxAcceleration, @@ -105,9 +107,15 @@ enum processID { Move_Z, Extruder, Homeoffset, - ETemp, - BedTemp, - FanSpeed, + #if HAS_HOTEND + ETemp, + #endif + #if HAS_HEATED_BED + BedTemp, + #endif + #if HAS_FAN + FanSpeed, + #endif PrintSpeed, /*Window ID*/ @@ -251,26 +259,31 @@ extern int checkkey, last_checkkey; extern float zprobe_zoffset; extern char print_filename[16]; -extern millis_t heat_time; +extern millis_t dwin_heat_time; typedef struct { - int16_t E_Temp = 0; - int16_t Bed_Temp = 0; - int16_t Fan_speed = 0; + #if HAS_HOTEND + int16_t E_Temp = 0; + #endif + #if HAS_HEATED_BED + int16_t Bed_Temp = 0; + #endif + #if HAS_FAN + int16_t Fan_speed = 0; + #endif int16_t print_speed = 100; - float Max_Feedspeed = 0; - float Max_Acceleration = 0; - float Max_Corner = 0; - float Max_Step = 0; - float Move_X_scale = 0; - float Move_Y_scale = 0; - float Move_Z_scale = 0; - float Move_E_scale = 0; - float offset_value = 0; - char show_mode = 0; // -1: Temperature control 0: Printing temperature - int16_t preheat_hotend_temp[2]; - int16_t preheat_bed_temp[2]; - uint8_t preheat_fan_speed[2]; + float Max_Feedspeed = 0; + float Max_Acceleration = 0; + float Max_Corner = 0; + float Max_Step = 0; + float Move_X_scale = 0; + float Move_Y_scale = 0; + float Move_Z_scale = 0; + #if EXTRUDERS + float Move_E_scale = 0; + #endif + float offset_value = 0; + char show_mode = 0; // -1: Temperature control 0: Printing temperature } HMI_value_t; typedef struct { @@ -281,9 +294,15 @@ typedef struct { bool select_flag:1; bool home_flag:1; bool heat_flag:1; // 0: heating done 1: during heating - bool ETempTooLow_flag:1; - bool leveling_offset_flag:1; - char feedspeed_flag; + #if HAS_HOTEND + bool ETempTooLow_flag:1; + #endif + #if HAS_LEVELING + bool leveling_offset_flag:1; + #endif + #if HAS_FAN + char feedspeed_flag; + #endif char acc_flag; char corner_flag; char step_flag; @@ -310,8 +329,11 @@ void ICON_Continue(bool show); void ICON_Stop(bool show); /* Popup window tips */ -void Popup_Window_Temperature(const bool toohigh); -void Popup_Window_ETempTooLow(void); +#if HAS_HOTEND + void Popup_Window_Temperature(const bool toohigh); + void Popup_Window_ETempTooLow(void); +#endif + void Popup_Window_Resume(void); void Popup_Window_Home(void); void Popup_Window_Leveling(void); @@ -326,9 +348,16 @@ void HMI_Move_Z(void); void HMI_Move_E(void); void HMI_Zoffset(void); -void HMI_ETemp(void); -void HMI_BedTemp(void); -void HMI_FanSpeed(void); + +#if HAS_HOTEND + void HMI_ETemp(void); +#endif +#if HAS_HEATED_BED + void HMI_BedTemp(void); +#endif +#if HAS_FAN + void HMI_FanSpeed(void); +#endif void HMI_PrintSpeed(void); void HMI_MaxFeedspeedXYZE(void); @@ -363,8 +392,12 @@ void HMI_Temperature(void); // 温度èœå• void HMI_Motion(void); // è¿åŠ¨èœå• void HMI_Info(void); // ä¿¡æ¯èœå• void HMI_Tune(void); // 调整èœå• -void HMI_PLAPreheatSetting(void); // PLA预热设置 -void HMI_ABSPreheatSetting(void); // ABS预热设置 + +#if HAS_HOTEND + void HMI_PLAPreheatSetting(void); // PLA预热设置 + void HMI_ABSPreheatSetting(void); // ABS预热设置 +#endif + void HMI_MaxSpeed(void); // 最大速度å­èœå• void HMI_MaxAcceleration(void); // 最大加速度å­èœå• void HMI_MaxCorner(void); // 最大æ‹è§’速度å­èœå• diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index b1048e289522..20fa9cc8b5c0 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -298,7 +298,7 @@ void menu_advanced_settings(); #endif -#if DISABLED(SLIM_LCD_MENUS) +#if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) void _menu_configuration_preheat_settings(const uint8_t material) { #define _MINTEMP_ITEM(N) HEATER_##N##_MINTEMP, @@ -307,12 +307,12 @@ void menu_advanced_settings(); #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0) START_MENU(); BACK_ITEM(MSG_CONFIGURATION); - EDIT_ITEM(percent, MSG_FAN_SPEED, &ui.preheat_fan_speed[material], 0, 255); + EDIT_ITEM(percent, MSG_FAN_SPEED, &ui.material_preset[material].fan_speed, 0, 255); #if HAS_TEMP_HOTEND - EDIT_ITEM(int3, MSG_NOZZLE, &ui.preheat_hotend_temp[material], MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); + EDIT_ITEM(int3, MSG_NOZZLE, &ui.material_preset[material].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); #endif #if HAS_HEATED_BED - EDIT_ITEM(int3, MSG_BED, &ui.preheat_bed_temp[material], BED_MINTEMP, BED_MAX_TARGET); + EDIT_ITEM(int3, MSG_BED, &ui.material_preset[material].bed_temp, BED_MINTEMP, BED_MAX_TARGET); #endif #if ENABLED(EEPROM_SETTINGS) ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); @@ -322,6 +322,15 @@ void menu_advanced_settings(); void menu_preheat_material1_settings() { _menu_configuration_preheat_settings(0); } void menu_preheat_material2_settings() { _menu_configuration_preheat_settings(1); } + #if PREHEAT_COUNT >= 3 + void menu_preheat_material3_settings() { _menu_configuration_preheat_settings(3); } + #if PREHEAT_COUNT >= 4 + void menu_preheat_material4_settings() { _menu_configuration_preheat_settings(4); } + #if PREHEAT_COUNT >= 5 + void menu_preheat_material5_settings() { _menu_configuration_preheat_settings(5); } + #endif + #endif + #endif #endif @@ -400,10 +409,19 @@ void menu_configuration() { EDIT_ITEM(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed); #endif - #if DISABLED(SLIM_LCD_MENUS) - // Preheat configurations + // Preheat configurations + #if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) SUBMENU(MSG_PREHEAT_1_SETTINGS, menu_preheat_material1_settings); SUBMENU(MSG_PREHEAT_2_SETTINGS, menu_preheat_material2_settings); + #if PREHEAT_COUNT >= 3 + SUBMENU(MSG_PREHEAT_3_SETTINGS, menu_preheat_material3_settings); + #if PREHEAT_COUNT >= 4 + SUBMENU(MSG_PREHEAT_4_SETTINGS, menu_preheat_material4_settings); + #if PREHEAT_COUNT >= 5 + SUBMENU(MSG_PREHEAT_5_SETTINGS, menu_preheat_material5_settings); + #endif + #endif + #endif #endif #if ENABLED(EEPROM_SETTINGS) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 5598306ae874..1c7abba6d4ce 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -81,8 +81,8 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { START_MENU(); if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_CENTER|SS_INVERT); BACK_ITEM(MSG_BACK); - ACTION_ITEM(MSG_PREHEAT_1, []{ _change_filament(ui.preheat_hotend_temp[0]); }); - ACTION_ITEM(MSG_PREHEAT_2, []{ _change_filament(ui.preheat_hotend_temp[1]); }); + ACTION_ITEM(MSG_PREHEAT_1, []{ _change_filament(ui.material_preset[0].hotend_temp); }); + ACTION_ITEM(MSG_PREHEAT_2, []{ _change_filament(ui.material_preset[1].hotend_temp); }); EDIT_ITEM_FAST(int3, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[_change_filament_extruder].target, EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, []{ _change_filament(thermalManager.temp_hotend[_change_filament_extruder].target); }); diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index ef269f708882..671fee099e06 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -243,7 +243,7 @@ void menu_info_board() { STATIC_ITEM_P(PSTR(MACHINE_NAME)); // My3DPrinter STATIC_ITEM_P(PSTR(WEBSITE_URL)); // www.my3dprinter.com VALUE_ITEM_P(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2 - #if HAS_BED_LEVELING + #if HAS_LEVELING STATIC_ITEM( TERN_(AUTO_BED_LEVELING_3POINT, MSG_3POINT_LEVELING) // 3-Point Leveling TERN_(AUTO_BED_LEVELING_LINEAR, MSG_LINEAR_LEVELING) // Linear Leveling diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 7ef267ff6a17..b4f591a62cd5 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -157,7 +157,9 @@ void menu_main() { SUBMENU(MSG_CUTTER(MENU), menu_spindle_laser); #endif - SUBMENU(MSG_TEMPERATURE, menu_temperature); + #if HAS_TEMPERATURE + SUBMENU(MSG_TEMPERATURE, menu_temperature); + #endif #if HAS_POWER_MONITOR MENU_ITEM(submenu, MSG_POWER_MONITOR, menu_power_monitor); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index e95a7cf22f1d..9ff2e7580717 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -24,9 +24,9 @@ // Temperature Menu // -#include "../../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfig.h" -#if HAS_LCD_MENU +#if HAS_LCD_MENU && HAS_TEMPERATURE #include "menu.h" #include "../../module/temperature.h" @@ -39,23 +39,19 @@ #include "../../module/tool_change.h" #endif -// Initialized by settings.load() -int16_t MarlinUI::preheat_hotend_temp[2], MarlinUI::preheat_bed_temp[2]; -uint8_t MarlinUI::preheat_fan_speed[2]; - // // "Temperature" submenu items // void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb) { #if HAS_HOTEND - if (indh >= 0 && ui.preheat_hotend_temp[indh] > 0) - setTargetHotend(_MIN(thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, ui.preheat_hotend_temp[indh]), e); + if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) + setTargetHotend(_MIN(thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, ui.material_preset[indh].hotend_temp), e); #else UNUSED(e); UNUSED(indh); #endif #if HAS_HEATED_BED - if (indb >= 0 && ui.preheat_bed_temp[indb] > 0) setTargetBed(ui.preheat_bed_temp[indb]); + if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); #else UNUSED(indb); #endif @@ -64,7 +60,7 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #if FAN_COUNT > 1 active_extruder < FAN_COUNT ? active_extruder : #endif - 0), ui.preheat_fan_speed[indh] + 0), ui.material_preset[indh].fan_speed ); #endif ui.return_to_status(); @@ -82,69 +78,67 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #if HAS_TEMP_HOTEND || HAS_HEATED_BED - #define _PREHEAT_ITEMS(M,N) do{ \ - ACTION_ITEM_N(N, MSG_PREHEAT_##M##_H, []{ _preheat_both(M-1, MenuItemBase::itemIndex); }); \ - ACTION_ITEM_N(N, MSG_PREHEAT_##M##_END_E, []{ _preheat_end(M-1, MenuItemBase::itemIndex); }); \ - }while(0) - #if HAS_HEATED_BED - #define PREHEAT_ITEMS(M,N) _PREHEAT_ITEMS(M,N) + #if HAS_TEMP_HOTEND && HAS_HEATED_BED + #define _PREHEAT_ITEMS(M,E) do{ \ + ACTION_ITEM_N_P(E, msg_preheat_h[M], []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ + ACTION_ITEM_N_P(E, msg_preheat_end_e[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ + }while(0) + #if HAS_HEATED_BED + #define PREHEAT_ITEMS(M,E) _PREHEAT_ITEMS(M,E) + #endif #else - #define PREHEAT_ITEMS(M,N) \ - ACTION_ITEM_N(N, MSG_PREHEAT_##M##_H, []{ _preheat_end(M-1, MenuItemBase::itemIndex); }) + #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N(E, msg_preheat_h[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }) #endif - void menu_preheat_m1() { - START_MENU(); - BACK_ITEM(MSG_TEMPERATURE); + void menu_preheat_m(const uint8_t m) { + editable.int8 = m; #if HOTENDS == 1 - #if HAS_HEATED_BED - ACTION_ITEM(MSG_PREHEAT_1, []{ _preheat_both(0, 0); }); - ACTION_ITEM(MSG_PREHEAT_1_END, []{ _preheat_end(0, 0); }); - #else - ACTION_ITEM(MSG_PREHEAT_1, []{ _preheat_end(0, 0); }); - #endif + PGM_P msg_preheat[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1), GET_TEXT(MSG_PREHEAT_2), GET_TEXT(MSG_PREHEAT_3), GET_TEXT(MSG_PREHEAT_4), GET_TEXT(MSG_PREHEAT_5)); + PGM_P msg_preheat_end[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END), GET_TEXT(MSG_PREHEAT_2_END), GET_TEXT(MSG_PREHEAT_3_END), GET_TEXT(MSG_PREHEAT_4_END), GET_TEXT(MSG_PREHEAT_5_END)); #elif HAS_MULTI_HOTEND - #if HAS_HEATED_BED - _PREHEAT_ITEMS(1,0); - #endif - LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(1,n); - ACTION_ITEM(MSG_PREHEAT_1_ALL, []() { - TERN_(HAS_HEATED_BED, _preheat_bed(0)); - HOTEND_LOOP() thermalManager.setTargetHotend(ui.preheat_hotend_temp[0], e); - }); - #endif // HAS_MULTI_HOTEND - #if HAS_HEATED_BED - ACTION_ITEM(MSG_PREHEAT_1_BEDONLY, []{ _preheat_bed(0); }); + PGM_P msg_preheat_all[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_ALL), GET_TEXT(MSG_PREHEAT_2_ALL), GET_TEXT(MSG_PREHEAT_3_ALL), GET_TEXT(MSG_PREHEAT_4_ALL), GET_TEXT(MSG_PREHEAT_5_ALL)); #endif - END_MENU(); - } + PGM_P msg_preheat_end_e[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END_E), GET_TEXT(MSG_PREHEAT_2_END_E), GET_TEXT(MSG_PREHEAT_3_END_E), GET_TEXT(MSG_PREHEAT_4_END_E), GET_TEXT(MSG_PREHEAT_5_END_E)); + PGM_P msg_preheat_bed[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_BEDONLY), GET_TEXT(MSG_PREHEAT_2_BEDONLY), GET_TEXT(MSG_PREHEAT_3_BEDONLY), GET_TEXT(MSG_PREHEAT_4_BEDONLY), GET_TEXT(MSG_PREHEAT_5_BEDONLY)); + PGM_P msg_preheat_h[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_H), GET_TEXT(MSG_PREHEAT_2_H), GET_TEXT(MSG_PREHEAT_3_H), GET_TEXT(MSG_PREHEAT_4_H), GET_TEXT(MSG_PREHEAT_5_H)); - void menu_preheat_m2() { START_MENU(); BACK_ITEM(MSG_TEMPERATURE); #if HOTENDS == 1 #if HAS_HEATED_BED - ACTION_ITEM(MSG_PREHEAT_2, []{ _preheat_both(1, 0); }); - ACTION_ITEM(MSG_PREHEAT_2_END, []{ _preheat_end(1, 0); }); + ACTION_ITEM_P(msg_preheat[m], []{ _preheat_both(editable.int8, 0); }); + ACTION_ITEM_P(msg_preheat_end[m], []{ _preheat_end(editable.int8, 0); }); #else - ACTION_ITEM(MSG_PREHEAT_2, []{ _preheat_end(1, 0); }); + ACTION_ITEM_P(msg_preheat[m], []{ _preheat_end(editable.int8, 0); }); #endif #elif HAS_MULTI_HOTEND #if HAS_HEATED_BED - _PREHEAT_ITEMS(2,0); + _PREHEAT_ITEMS(editable.int8,0); #endif - LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(2,n); - ACTION_ITEM(MSG_PREHEAT_2_ALL, []() { - TERN_(HAS_HEATED_BED, _preheat_bed(1)); - HOTEND_LOOP() thermalManager.setTargetHotend(ui.preheat_hotend_temp[1], e); + LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(editable.int8,n); + ACTION_ITEM_P(msg_preheat_all[m], []() { + TERN_(HAS_HEATED_BED, _preheat_bed(editable.int8)); + HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[editable.int8].hotend_temp, e); }); #endif // HAS_MULTI_HOTEND #if HAS_HEATED_BED - ACTION_ITEM(MSG_PREHEAT_2_BEDONLY, []{ _preheat_bed(1); }); + ACTION_ITEM_P(msg_preheat_bed[m], []{ _preheat_bed(editable.int8); }); #endif END_MENU(); } + void menu_preheat_m1() { menu_preheat_m(0); } + void menu_preheat_m2() { menu_preheat_m(1); } + #if PREHEAT_COUNT >= 3 + void menu_preheat_m3() { menu_preheat_m(2); } + #if PREHEAT_COUNT >= 4 + void menu_preheat_m4() { menu_preheat_m(3); } + #if PREHEAT_COUNT >= 5 + void menu_preheat_m5() { menu_preheat_m(4); } + #endif + #endif + #endif + void lcd_cooldown() { thermalManager.zero_fan_speeds(); thermalManager.disable_all_heaters(); @@ -269,12 +263,30 @@ void menu_temperature() { // // Preheat for Material 1 and 2 // - #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 || TEMP_SENSOR_4 != 0 || TEMP_SENSOR_5 != 0 || TEMP_SENSOR_6 != 0 || TEMP_SENSOR_7 != 0 || HAS_HEATED_BED + #if HOTENDS > 1 || HAS_HEATED_BED SUBMENU(MSG_PREHEAT_1, menu_preheat_m1); SUBMENU(MSG_PREHEAT_2, menu_preheat_m2); + #if PREHEAT_COUNT >= 3 + SUBMENU(MSG_PREHEAT_3, menu_preheat_m3); + #if PREHEAT_COUNT >= 4 + SUBMENU(MSG_PREHEAT_4, menu_preheat_m4); + #if PREHEAT_COUNT >= 5 + SUBMENU(MSG_PREHEAT_5, menu_preheat_m5); + #endif + #endif + #endif #else ACTION_ITEM(MSG_PREHEAT_1, []{ _preheat_end(0, 0); }); ACTION_ITEM(MSG_PREHEAT_2, []{ _preheat_end(1, 0); }); + #if PREHEAT_COUNT >= 3 + ACTION_ITEM(MSG_PREHEAT_3, []{ _preheat_end(2, 0); }); + #if PREHEAT_COUNT >= 3 + ACTION_ITEM(MSG_PREHEAT_4, []{ _preheat_end(3, 0); }); + #if PREHEAT_COUNT >= 3 + ACTION_ITEM(MSG_PREHEAT_5, []{ _preheat_end(4, 0); }); + #endif + #endif + #endif #endif // @@ -288,4 +300,4 @@ void menu_temperature() { END_MENU(); } -#endif // HAS_LCD_MENU +#endif // HAS_LCD_MENU && HAS_TEMPERATURE diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index fa0c5d21c480..f17ac5f3b767 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -128,7 +128,9 @@ void _lcd_ubl_build_custom_mesh() { void _lcd_ubl_custom_mesh() { START_MENU(); BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); - EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT); + #if HAS_HOTEND + EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT); + #endif #if HAS_HEATED_BED EDIT_ITEM(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP, BED_MAX_TARGET); #endif @@ -182,39 +184,48 @@ void _lcd_ubl_edit_mesh() { END_MENU(); } -/** - * UBL Validate Custom Mesh Command - */ -void _lcd_ubl_validate_custom_mesh() { - char ubl_lcd_gcode[24]; - const int16_t temp = TERN(HAS_HEATED_BED, custom_bed_temp, 0); - sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26 C B%" PRIi16 " H%" PRIi16 " P"), temp, custom_hotend_temp); - queue.inject(ubl_lcd_gcode); -} +#if ENABLED(G26_MESH_VALIDATION) + + /** + * UBL Validate Custom Mesh Command + */ + void _lcd_ubl_validate_custom_mesh() { + char ubl_lcd_gcode[24]; + const int16_t temp = TERN(HAS_HEATED_BED, custom_bed_temp, 0); + sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26 C P H%" PRIi16 TERN_(HAS_HEATED_BED, " B%" PRIi16)) + , custom_hotend_temp + #if HAS_HEATED_BED + , temp + #endif + ); + queue.inject(ubl_lcd_gcode); + } -/** - * UBL Validate Mesh submenu - * - * << UBL Tools - * Mesh Validation with Material 1 - * Mesh Validation with Material 2 - * Validate Custom Mesh - * << Info Screen - */ -void _lcd_ubl_validate_mesh() { - START_MENU(); - BACK_ITEM(MSG_UBL_TOOLS); - #if HAS_HEATED_BED - GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); - GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); - #else - GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); - GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); - #endif - ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh); - ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); - END_MENU(); -} + /** + * UBL Validate Mesh submenu + * + * << UBL Tools + * Mesh Validation with Material 1 + * Mesh Validation with Material 2 + * Validate Custom Mesh + * << Info Screen + */ + void _lcd_ubl_validate_mesh() { + START_MENU(); + BACK_ITEM(MSG_UBL_TOOLS); + #if HAS_HEATED_BED + GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); + GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); + #else + GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); + GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); + #endif + ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh); + ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); + END_MENU(); + } + +#endif /** * UBL Grid Leveling submenu @@ -530,36 +541,42 @@ void _menu_ubl_tools() { BACK_ITEM(MSG_UBL_LEVEL_BED); SUBMENU(MSG_UBL_BUILD_MESH_MENU, _lcd_ubl_build_mesh); GCODES_ITEM(MSG_UBL_MANUAL_MESH, PSTR("G29 I999\nG29 P2 B T0")); - SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + #if ENABLED(G26_MESH_VALIDATION) + SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + #endif SUBMENU(MSG_EDIT_MESH, _lcd_ubl_edit_mesh); SUBMENU(MSG_UBL_MESH_LEVELING, _lcd_ubl_mesh_leveling); END_MENU(); } -/** - * UBL Step-By-Step submenu - * - * << Unified Bed Leveling - * 1 Build Cold Mesh - * 2 Smart Fill-in - * - 3 Validate Mesh >> - * 4 Fine Tune All - * - 5 Validate Mesh >> - * 6 Fine Tune All - * 7 Save Bed Mesh - */ -void _lcd_ubl_step_by_step() { - START_MENU(); - BACK_ITEM(MSG_UBL_LEVEL_BED); - GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); - GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29 P3 T0")); - SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd); - END_MENU(); -} +#if ENABLED(G26_MESH_VALIDATION) + + /** + * UBL Step-By-Step submenu + * + * << Unified Bed Leveling + * 1 Build Cold Mesh + * 2 Smart Fill-in + * - 3 Validate Mesh >> + * 4 Fine Tune All + * - 5 Validate Mesh >> + * 6 Fine Tune All + * 7 Save Bed Mesh + */ + void _lcd_ubl_step_by_step() { + START_MENU(); + BACK_ITEM(MSG_UBL_LEVEL_BED); + GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); + GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29 P3 T0")); + SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd); + END_MENU(); + } + +#endif /** * UBL System submenu @@ -574,7 +591,6 @@ void _lcd_ubl_step_by_step() { * - UBL Tools >> * - Output UBL Info >> */ - void _lcd_ubl_level_bed() { START_MENU(); BACK_ITEM(MSG_MOTION); @@ -582,7 +598,9 @@ void _lcd_ubl_level_bed() { GCODES_ITEM(MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D")); else GCODES_ITEM(MSG_UBL_ACTIVATE_MESH, PSTR("G29 A")); - SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); + #if ENABLED(G26_MESH_VALIDATION) + SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); + #endif ACTION_ITEM(MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd); SUBMENU(MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh); SUBMENU(MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map); diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 98f29804c861..271de7272262 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -86,6 +86,10 @@ MarlinUI ui; } #endif +#if EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD) + preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() +#endif + #if HAS_SPI_LCD #if HAS_GRAPHICAL_LCD diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 6eaca31c71ff..4faeea63f6b1 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -256,6 +256,14 @@ }; #endif +#if PREHEAT_COUNT + typedef struct { + TERN_(HAS_HOTEND, uint16_t hotend_temp); + TERN_(HAS_HEATED_BED, uint16_t bed_temp ); + TERN_(HAS_FAN, uint16_t fan_speed ); + } preheat_t; +#endif + //////////////////////////////////////////// //////////// MarlinUI Singleton //////////// //////////////////////////////////////////// @@ -469,6 +477,10 @@ class MarlinUI { static const char * scrolled_filename(CardReader &theCard, const uint8_t maxlen, uint8_t hash, const bool doScroll); #endif + #if PREHEAT_COUNT + static preheat_t material_preset[PREHEAT_COUNT]; + #endif + #if HAS_LCD_MENU #if ENABLED(TOUCH_BUTTONS) @@ -494,9 +506,6 @@ class MarlinUI { static constexpr int8_t manual_move_e_index = 0; #endif - static int16_t preheat_hotend_temp[2], preheat_bed_temp[2]; - static uint8_t preheat_fan_speed[2]; - // Select Screen (modal NO/YES style dialog) static bool selection; static void set_selection(const bool sel) { selection = sel; } diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 77b807ec4ca2..e7de76000e0a 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -37,7 +37,7 @@ */ // Change EEPROM version if the structure changes -#define EEPROM_VERSION "V80" +#define EEPROM_VERSION "V81" #define EEPROM_OFFSET 100 // Check the integrity of data offsets. @@ -281,11 +281,11 @@ typedef struct SettingsDataStruct { #endif // - // ULTIPANEL + // Material Presets // - int16_t ui_preheat_hotend_temp[2], // M145 S0 H - ui_preheat_bed_temp[2]; // M145 S0 B - uint8_t ui_preheat_fan_speed[2]; // M145 S0 F + #if PREHEAT_COUNT + preheat_t ui_material_preset[PREHEAT_COUNT]; // M145 S0 H B F + #endif // // PIDTEMP @@ -811,27 +811,10 @@ void MarlinSettings::postprocess() { // // LCD Preheat settings // - { - _FIELD_TEST(ui_preheat_hotend_temp); - - #if HAS_HOTEND && HAS_LCD_MENU - const int16_t (&ui_preheat_hotend_temp)[2] = ui.preheat_hotend_temp, - (&ui_preheat_bed_temp)[2] = ui.preheat_bed_temp; - const uint8_t (&ui_preheat_fan_speed)[2] = ui.preheat_fan_speed; - #elif ENABLED(DWIN_CREALITY_LCD) - const int16_t (&ui_preheat_hotend_temp)[2] = HMI_ValueStruct.preheat_hotend_temp, - (&ui_preheat_bed_temp)[2] = HMI_ValueStruct.preheat_bed_temp; - const uint8_t (&ui_preheat_fan_speed)[2] = HMI_ValueStruct.preheat_fan_speed; - #else - constexpr int16_t ui_preheat_hotend_temp[2] = { PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND }, - ui_preheat_bed_temp[2] = { PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED }; - constexpr uint8_t ui_preheat_fan_speed[2] = { PREHEAT_1_FAN_SPEED, PREHEAT_2_FAN_SPEED }; - #endif - - EEPROM_WRITE(ui_preheat_hotend_temp); - EEPROM_WRITE(ui_preheat_bed_temp); - EEPROM_WRITE(ui_preheat_fan_speed); - } + #if PREHEAT_COUNT + _FIELD_TEST(ui_material_preset); + EEPROM_WRITE(ui.material_preset); + #endif // // PIDTEMP @@ -1688,25 +1671,10 @@ void MarlinSettings::postprocess() { // // LCD Preheat settings // - { - _FIELD_TEST(ui_preheat_hotend_temp); - - #if HAS_HOTEND && HAS_LCD_MENU - int16_t (&ui_preheat_hotend_temp)[2] = ui.preheat_hotend_temp, - (&ui_preheat_bed_temp)[2] = ui.preheat_bed_temp; - uint8_t (&ui_preheat_fan_speed)[2] = ui.preheat_fan_speed; - #elif ENABLED(DWIN_CREALITY_LCD) - int16_t (&ui_preheat_hotend_temp)[2] = HMI_ValueStruct.preheat_hotend_temp, - (&ui_preheat_bed_temp)[2] = HMI_ValueStruct.preheat_bed_temp; - uint8_t (&ui_preheat_fan_speed)[2] = HMI_ValueStruct.preheat_fan_speed; - #else - int16_t ui_preheat_hotend_temp[2], ui_preheat_bed_temp[2]; - uint8_t ui_preheat_fan_speed[2]; - #endif - EEPROM_READ(ui_preheat_hotend_temp); // 2 floats - EEPROM_READ(ui_preheat_bed_temp); // 2 floats - EEPROM_READ(ui_preheat_fan_speed); // 2 floats - } + #if PREHEAT_COUNT + _FIELD_TEST(ui_material_preset); + EEPROM_READ(ui.material_preset); + #endif // // Hotend PID @@ -2587,22 +2555,27 @@ void MarlinSettings::reset() { // // Preheat parameters // - #if HAS_HOTEND - #if ENABLED(DWIN_CREALITY_LCD) - HMI_ValueStruct.preheat_hotend_temp[0] = PREHEAT_1_TEMP_HOTEND; - HMI_ValueStruct.preheat_hotend_temp[1] = PREHEAT_2_TEMP_HOTEND; - HMI_ValueStruct.preheat_bed_temp[0] = PREHEAT_1_TEMP_BED; - HMI_ValueStruct.preheat_bed_temp[1] = PREHEAT_2_TEMP_BED; - HMI_ValueStruct.preheat_fan_speed[0] = PREHEAT_1_FAN_SPEED; - HMI_ValueStruct.preheat_fan_speed[1] = PREHEAT_2_FAN_SPEED; - #elif HAS_LCD_MENU - ui.preheat_hotend_temp[0] = PREHEAT_1_TEMP_HOTEND; - ui.preheat_hotend_temp[1] = PREHEAT_2_TEMP_HOTEND; - ui.preheat_bed_temp[0] = PREHEAT_1_TEMP_BED; - ui.preheat_bed_temp[1] = PREHEAT_2_TEMP_BED; - ui.preheat_fan_speed[0] = PREHEAT_1_FAN_SPEED; - ui.preheat_fan_speed[1] = PREHEAT_2_FAN_SPEED; + #if PREHEAT_COUNT + #if HAS_HOTEND + constexpr uint16_t hpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND, PREHEAT_3_TEMP_HOTEND, PREHEAT_4_TEMP_HOTEND, PREHEAT_5_TEMP_HOTEND); #endif + #if HAS_HEATED_BED + constexpr uint16_t bpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED, PREHEAT_3_TEMP_BED, PREHEAT_4_TEMP_BED, PREHEAT_5_TEMP_BED); + #endif + #if HAS_FAN + constexpr uint8_t fpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_FAN_SPEED, PREHEAT_2_FAN_SPEED, PREHEAT_3_FAN_SPEED, PREHEAT_4_FAN_SPEED, PREHEAT_5_FAN_SPEED); + #endif + LOOP_L_N(i, PREHEAT_COUNT) { + #if HAS_HOTEND + ui.material_preset[i].hotend_temp = hpre[i]; + #endif + #if HAS_HEATED_BED + ui.material_preset[i].bed_temp = bpre[i]; + #endif + #if HAS_FAN + ui.material_preset[i].fan_speed = fpre[i]; + #endif + } #endif // @@ -3131,16 +3104,22 @@ void MarlinSettings::reset() { #endif // [XYZ]_DUAL_ENDSTOPS - #if HAS_HOTEND && HAS_LCD_MENU + #if PREHEAT_COUNT CONFIG_ECHO_HEADING("Material heatup parameters:"); - LOOP_L_N(i, COUNT(ui.preheat_hotend_temp)) { + LOOP_L_N(i, PREHEAT_COUNT) { CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR( - " M145 S", (int)i - , " H", TEMP_UNIT(ui.preheat_hotend_temp[i]) - , " B", TEMP_UNIT(ui.preheat_bed_temp[i]) - , " F", int(ui.preheat_fan_speed[i]) + " M145 S", (int)i + #if HAS_HOTEND + , " H", TEMP_UNIT(ui.material_preset[i].hotend_temp) + #endif + #if HAS_HEATED_BED + , " B", TEMP_UNIT(ui.material_preset[i].bed_temp) + #endif + #if HAS_FAN + , " F", ui.material_preset[i].fan_speed + #endif ); } diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 16e29f7b36d6..9d55867c5b64 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -3128,7 +3128,7 @@ void Temperature::tick() { #if ENABLED(DWIN_CREALITY_LCD) HMI_flag.heat_flag = 0; duration_t elapsed = print_job_timer.duration(); // print timer - heat_time = elapsed.value; + dwin_heat_time = elapsed.value; #else ui.reset_status(); #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 0f95d0a726f4..fca88608b522 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -797,7 +797,7 @@ class Temperature { TERN_(HAS_DISPLAY, static void set_heating_message(const uint8_t e)); - #if HAS_LCD_MENU + #if HAS_LCD_MENU && HAS_TEMPERATURE static void lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb); #endif From d0f2fde920ace3448fc6072cf394f793b96131b0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Jun 2020 19:47:16 -0500 Subject: [PATCH 024/483] Fix material preset type --- Marlin/src/gcode/lcd/M145.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 6bbde4d13a26..a3e81788d2aa 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -40,7 +40,7 @@ void GcodeSuite::M145() { if (material >= PREHEAT_COUNT) SERIAL_ERROR_MSG(STR_ERR_MATERIAL_INDEX); else { - preset_t &mat = ui.material_preset[material]; + preheat_t &mat = ui.material_preset[material]; #if HAS_HOTEND if (parser.seenval('H')) mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT)); From 43a994e0dfdba0e6fda7f2b5cf5db3d622e97435 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Jun 2020 20:14:58 -0500 Subject: [PATCH 025/483] Fix material preset editing --- Marlin/src/lcd/menu/menu_configuration.cpp | 9 +++-- Marlin/src/lcd/menu/menu_temperature.cpp | 46 +++++++++++++++------- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/module/temperature.h | 2 +- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 20fa9cc8b5c0..9e4653cf3553 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -300,19 +300,20 @@ void menu_advanced_settings(); #if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) - void _menu_configuration_preheat_settings(const uint8_t material) { + void _menu_configuration_preheat_settings(const uint8_t m) { #define _MINTEMP_ITEM(N) HEATER_##N##_MINTEMP, #define _MAXTEMP_ITEM(N) HEATER_##N##_MAXTEMP, #define MINTEMP_ALL _MIN(REPEAT(HOTENDS, _MINTEMP_ITEM) 999) #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0) START_MENU(); BACK_ITEM(MSG_CONFIGURATION); - EDIT_ITEM(percent, MSG_FAN_SPEED, &ui.material_preset[material].fan_speed, 0, 255); + editable.uint8 = uint8_t(ui.material_preset[m].fan_speed); + EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; }); #if HAS_TEMP_HOTEND - EDIT_ITEM(int3, MSG_NOZZLE, &ui.material_preset[material].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); + EDIT_ITEM(uint16_3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); #endif #if HAS_HEATED_BED - EDIT_ITEM(int3, MSG_BED, &ui.material_preset[material].bed_temp, BED_MINTEMP, BED_MAX_TARGET); + EDIT_ITEM(uint16_3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); #endif #if ENABLED(EEPROM_SETTINGS) ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 9ff2e7580717..b9d6561f94ad 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -83,15 +83,18 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i ACTION_ITEM_N_P(E, msg_preheat_h[M], []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ ACTION_ITEM_N_P(E, msg_preheat_end_e[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ }while(0) - #if HAS_HEATED_BED + + #if HAS_MULTI_HOTEND #define PREHEAT_ITEMS(M,E) _PREHEAT_ITEMS(M,E) #endif - #else - #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N(E, msg_preheat_h[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }) + + #elif HAS_MULTI_HOTEND + + #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_P(E, msg_preheat_h[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }) + #endif void menu_preheat_m(const uint8_t m) { - editable.int8 = m; #if HOTENDS == 1 PGM_P msg_preheat[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1), GET_TEXT(MSG_PREHEAT_2), GET_TEXT(MSG_PREHEAT_3), GET_TEXT(MSG_PREHEAT_4), GET_TEXT(MSG_PREHEAT_5)); PGM_P msg_preheat_end[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END), GET_TEXT(MSG_PREHEAT_2_END), GET_TEXT(MSG_PREHEAT_3_END), GET_TEXT(MSG_PREHEAT_4_END), GET_TEXT(MSG_PREHEAT_5_END)); @@ -99,31 +102,44 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i PGM_P msg_preheat_all[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_ALL), GET_TEXT(MSG_PREHEAT_2_ALL), GET_TEXT(MSG_PREHEAT_3_ALL), GET_TEXT(MSG_PREHEAT_4_ALL), GET_TEXT(MSG_PREHEAT_5_ALL)); #endif PGM_P msg_preheat_end_e[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END_E), GET_TEXT(MSG_PREHEAT_2_END_E), GET_TEXT(MSG_PREHEAT_3_END_E), GET_TEXT(MSG_PREHEAT_4_END_E), GET_TEXT(MSG_PREHEAT_5_END_E)); - PGM_P msg_preheat_bed[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_BEDONLY), GET_TEXT(MSG_PREHEAT_2_BEDONLY), GET_TEXT(MSG_PREHEAT_3_BEDONLY), GET_TEXT(MSG_PREHEAT_4_BEDONLY), GET_TEXT(MSG_PREHEAT_5_BEDONLY)); - PGM_P msg_preheat_h[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_H), GET_TEXT(MSG_PREHEAT_2_H), GET_TEXT(MSG_PREHEAT_3_H), GET_TEXT(MSG_PREHEAT_4_H), GET_TEXT(MSG_PREHEAT_5_H)); + + #if HAS_MULTI_HOTEND + PGM_P msg_preheat_h[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_H), GET_TEXT(MSG_PREHEAT_2_H), GET_TEXT(MSG_PREHEAT_3_H), GET_TEXT(MSG_PREHEAT_4_H), GET_TEXT(MSG_PREHEAT_5_H)); + #endif + + MenuItemBase::itemIndex = m; START_MENU(); BACK_ITEM(MSG_TEMPERATURE); + #if HOTENDS == 1 + #if HAS_HEATED_BED - ACTION_ITEM_P(msg_preheat[m], []{ _preheat_both(editable.int8, 0); }); - ACTION_ITEM_P(msg_preheat_end[m], []{ _preheat_end(editable.int8, 0); }); + ACTION_ITEM_P(msg_preheat[m], []{ _preheat_both(MenuItemBase::itemIndex, 0); }); + ACTION_ITEM_P(msg_preheat_end[m], []{ _preheat_end(MenuItemBase::itemIndex, 0); }); #else - ACTION_ITEM_P(msg_preheat[m], []{ _preheat_end(editable.int8, 0); }); + ACTION_ITEM_P(msg_preheat[m], []{ _preheat_end(MenuItemBase::itemIndex, 0); }); #endif + #elif HAS_MULTI_HOTEND + #if HAS_HEATED_BED - _PREHEAT_ITEMS(editable.int8,0); + _PREHEAT_ITEMS(MenuItemBase::itemIndex,0); #endif - LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(editable.int8,n); + + LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(MenuItemBase::itemIndex,n); ACTION_ITEM_P(msg_preheat_all[m], []() { - TERN_(HAS_HEATED_BED, _preheat_bed(editable.int8)); - HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[editable.int8].hotend_temp, e); + TERN_(HAS_HEATED_BED, _preheat_bed(MenuItemBase::itemIndex)); + HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[MenuItemBase::itemIndex].hotend_temp, e); }); - #endif // HAS_MULTI_HOTEND + + #endif + #if HAS_HEATED_BED - ACTION_ITEM_P(msg_preheat_bed[m], []{ _preheat_bed(editable.int8); }); + PGM_P msg_preheat_bed[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_BEDONLY), GET_TEXT(MSG_PREHEAT_2_BEDONLY), GET_TEXT(MSG_PREHEAT_3_BEDONLY), GET_TEXT(MSG_PREHEAT_4_BEDONLY), GET_TEXT(MSG_PREHEAT_5_BEDONLY)); + ACTION_ITEM_P(msg_preheat_bed[m], []{ _preheat_bed(MenuItemBase::itemIndex); }); #endif + END_MENU(); } diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 9d55867c5b64..f909476592e0 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -151,7 +151,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HOTEND hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 } - const int16_t Temperature::heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); + const uint16_t Temperature::heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); #endif #if ENABLED(AUTO_POWER_E_FANS) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index fca88608b522..0362e2e8e5a5 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -330,7 +330,7 @@ class Temperature { #if HAS_HOTEND #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) static hotend_info_t temp_hotend[HOTEND_TEMPS]; - static const int16_t heater_maxtemp[HOTENDS]; + static const uint16_t heater_maxtemp[HOTENDS]; #endif TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); From 859ccd2e2893d4e6002b43dde0dd7b19f663d99b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 9 Apr 2020 14:25:16 -0500 Subject: [PATCH 026/483] NO_LCD_REINIT for FSMC (or, no SD_DETECT_PIN) --- Marlin/src/inc/Conditionals_post.h | 4 ++++ Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 1 - Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 1 - Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 -- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 -- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 -- 6 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index e1e341d12679..be63d3ec36db 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -374,6 +374,10 @@ #endif +#if EITHER(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) + #define NO_LCD_REINIT 1 // Suppress LCD re-initialization +#endif + /** * Set defaults for missing (newer) options */ diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index fc95d6c0b62e..a835f69ea9bc 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -118,7 +118,6 @@ #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 - #define NO_LCD_REINIT #define LCD_BACKLIGHT_PIN PD13 #define FSMC_CS_PIN PD7 #define FSMC_RS_PIN PD11 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 15c01e872779..e659dadb0967 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -123,7 +123,6 @@ #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 - #define NO_LCD_REINIT #define LCD_BACKLIGHT_PIN PD13 #define FSMC_CS_PIN PD7 #define FSMC_RS_PIN PD11 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index c352acc17c9b..674deb6d5dbb 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -126,8 +126,6 @@ #define FSMC_RS_PIN PD11 // A0 #define LCD_RESET_PIN PC6 - #define NO_LCD_REINIT // Suppress LCD re-initialization - #define LCD_BACKLIGHT_PIN PD13 #if ENABLED(TOUCH_BUTTONS) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 9812224593c0..fc9fa8721253 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -246,8 +246,6 @@ #define FSMC_RS_PIN PD11 // A0 #define LCD_RESET_PIN PC6 // FSMC_RST - #define NO_LCD_REINIT // Suppress LCD re-initialization - #define LCD_BACKLIGHT_PIN PD13 #if ENABLED(TOUCH_BUTTONS) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index fee9f0baa971..2db04f55e570 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -219,8 +219,6 @@ #define FSMC_RS_PIN PD11 // A0 #define LCD_RESET_PIN PF6 - #define NO_LCD_REINIT // Suppress LCD re-initialization - #define LCD_BACKLIGHT_PIN PD13 #if ENABLED(TOUCH_BUTTONS) From 4ace981ba06cc0a49c38939de69667d3326e9979 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Jun 2020 22:43:40 -0500 Subject: [PATCH 027/483] Clean up preheat edit items --- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 29 ++++++++++++------------ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 004a5b673aa2..76c7b12bbebe 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1646,7 +1646,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal // Pins are required for heaters #if ENABLED(HEATER_0_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS) #error "MAX6675_SS_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif HOTENDS && !HAS_TEMP_HOTEND +#elif HAS_HOTEND && !HAS_TEMP_HOTEND #error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board." #elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 #error "HEATER_1_PIN not defined for this board." diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index b9d6561f94ad..8bfce13f7b5f 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -79,32 +79,35 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #if HAS_TEMP_HOTEND || HAS_HEATED_BED #if HAS_TEMP_HOTEND && HAS_HEATED_BED - #define _PREHEAT_ITEMS(M,E) do{ \ + + // Indexed "Preheat ABC" and "Heat Bed" items + #define PREHEAT_ITEMS(M,E) do{ \ ACTION_ITEM_N_P(E, msg_preheat_h[M], []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ ACTION_ITEM_N_P(E, msg_preheat_end_e[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ }while(0) - #if HAS_MULTI_HOTEND - #define PREHEAT_ITEMS(M,E) _PREHEAT_ITEMS(M,E) - #endif - #elif HAS_MULTI_HOTEND + // No heated bed, so just indexed "Preheat ABC" items #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_P(E, msg_preheat_h[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }) #endif void menu_preheat_m(const uint8_t m) { + #if HOTENDS == 1 - PGM_P msg_preheat[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1), GET_TEXT(MSG_PREHEAT_2), GET_TEXT(MSG_PREHEAT_3), GET_TEXT(MSG_PREHEAT_4), GET_TEXT(MSG_PREHEAT_5)); - PGM_P msg_preheat_end[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END), GET_TEXT(MSG_PREHEAT_2_END), GET_TEXT(MSG_PREHEAT_3_END), GET_TEXT(MSG_PREHEAT_4_END), GET_TEXT(MSG_PREHEAT_5_END)); + PGM_P msg_preheat[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1), GET_TEXT(MSG_PREHEAT_2), GET_TEXT(MSG_PREHEAT_3), GET_TEXT(MSG_PREHEAT_4), GET_TEXT(MSG_PREHEAT_5)); + PGM_P msg_preheat_end[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END), GET_TEXT(MSG_PREHEAT_2_END), GET_TEXT(MSG_PREHEAT_3_END), GET_TEXT(MSG_PREHEAT_4_END), GET_TEXT(MSG_PREHEAT_5_END)); #elif HAS_MULTI_HOTEND - PGM_P msg_preheat_all[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_ALL), GET_TEXT(MSG_PREHEAT_2_ALL), GET_TEXT(MSG_PREHEAT_3_ALL), GET_TEXT(MSG_PREHEAT_4_ALL), GET_TEXT(MSG_PREHEAT_5_ALL)); + PGM_P msg_preheat_all[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_ALL), GET_TEXT(MSG_PREHEAT_2_ALL), GET_TEXT(MSG_PREHEAT_3_ALL), GET_TEXT(MSG_PREHEAT_4_ALL), GET_TEXT(MSG_PREHEAT_5_ALL)); + #endif + + #if HAS_TEMP_HOTEND && HAS_HEATED_BED && HAS_MULTI_HOTEND + PGM_P msg_preheat_end_e[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END_E), GET_TEXT(MSG_PREHEAT_2_END_E), GET_TEXT(MSG_PREHEAT_3_END_E), GET_TEXT(MSG_PREHEAT_4_END_E), GET_TEXT(MSG_PREHEAT_5_END_E)); #endif - PGM_P msg_preheat_end_e[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END_E), GET_TEXT(MSG_PREHEAT_2_END_E), GET_TEXT(MSG_PREHEAT_3_END_E), GET_TEXT(MSG_PREHEAT_4_END_E), GET_TEXT(MSG_PREHEAT_5_END_E)); #if HAS_MULTI_HOTEND - PGM_P msg_preheat_h[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_H), GET_TEXT(MSG_PREHEAT_2_H), GET_TEXT(MSG_PREHEAT_3_H), GET_TEXT(MSG_PREHEAT_4_H), GET_TEXT(MSG_PREHEAT_5_H)); + PGM_P msg_preheat_h[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_H), GET_TEXT(MSG_PREHEAT_2_H), GET_TEXT(MSG_PREHEAT_3_H), GET_TEXT(MSG_PREHEAT_4_H), GET_TEXT(MSG_PREHEAT_5_H)); #endif MenuItemBase::itemIndex = m; @@ -123,11 +126,7 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #elif HAS_MULTI_HOTEND - #if HAS_HEATED_BED - _PREHEAT_ITEMS(MenuItemBase::itemIndex,0); - #endif - - LOOP_S_L_N(n, 1, HOTENDS) PREHEAT_ITEMS(MenuItemBase::itemIndex,n); + LOOP_S_L_N(n, 0, HOTENDS) PREHEAT_ITEMS(MenuItemBase::itemIndex, n); ACTION_ITEM_P(msg_preheat_all[m], []() { TERN_(HAS_HEATED_BED, _preheat_bed(MenuItemBase::itemIndex)); HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[MenuItemBase::itemIndex].hotend_temp, e); From 520c0ab96b12cb8b4508eac0b941047b0cc7cd6c Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 26 Jun 2020 00:07:40 +0000 Subject: [PATCH 028/483] [cron] Bump distribution date (2020-06-26) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 2c7766f315a6..42765355045a 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-25" + #define STRING_DISTRIBUTION_DATE "2020-06-26" #endif /** From f445bc26e52de36239e595ee3fbd2d25abc97258 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Jun 2020 16:39:22 -0500 Subject: [PATCH 029/483] Minor LCD cleanup, improvement --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 16 ++++----- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 16 +++++---- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 22 ++++++------ Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 38 +++++++++++---------- Marlin/src/lcd/menu/menu_motion.cpp | 28 ++++++--------- Marlin/src/lcd/menu/menu_ubl.cpp | 24 ++++--------- Marlin/src/lcd/ultralcd.cpp | 10 +++--- Marlin/src/lcd/ultralcd.h | 4 +++ Marlin/src/module/planner.cpp | 2 +- 9 files changed, 74 insertions(+), 86 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 3c604168a603..a3d45169bc51 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -826,7 +826,7 @@ static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } float unified_bed_leveling::measure_business_card_thickness(float in_height) { - TERN_(HAS_LCD_MENU, ui.capture()); + ui.capture(); save_ubl_active_state_and_disable(); // Disable bed level correction for probing do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), in_height); @@ -857,15 +857,13 @@ SERIAL_ECHOLNPGM("mm thick."); } - ui.release(); - restore_ubl_active_state_and_leave(); return thickness; } void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { - TERN_(HAS_LCD_MENU, ui.capture()); + ui.capture(); save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained do_blocking_move_to_xy_z(current_position, z_clearance); @@ -893,7 +891,7 @@ do_blocking_move_to_z(z_clearance); KEEPALIVE_STATE(PAUSED_FOR_USER); - TERN_(HAS_LCD_MENU, ui.capture()); + ui.capture(); if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing @@ -907,7 +905,6 @@ if (click_and_hold()) { SERIAL_ECHOLNPGM("\nMesh only partially populated."); do_blocking_move_to_z(Z_CLEARANCE_DEPLOY_PROBE); - ui.release(); return restore_ubl_active_state_and_leave(); } @@ -958,9 +955,9 @@ save_ubl_active_state_and_disable(); LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); - TERN_(HAS_LCD_MENU, ui.capture()); // Take over control of the LCD encoder + ui.capture(); // Take over control of the LCD encoder - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset @@ -1016,8 +1013,6 @@ } while (lpos.x >= 0 && --g29_repetition_cnt > 0); - ui.release(); - if (do_ubl_mesh_map) display_map(g29_map_type); restore_ubl_active_state_and_leave(); @@ -1168,6 +1163,7 @@ } void unified_bed_leveling::restore_ubl_active_state_and_leave() { + TERN_(HAS_LCD_MENU, ui.release()); #if ENABLED(UBL_DEVEL_DEBUGGING) if (--ubl_state_recursion_chk) { SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 18befefc1319..21e8130850ca 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -824,13 +824,9 @@ void MarlinUI::draw_status_screen() { #else // !HAS_DUAL_MIXING - if (TERN1(LCD_SHOW_E_TOTAL, !printingIsActive())) { - const xy_pos_t lpos = current_position.asLogical(); - _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink); - lcd_put_wchar(' '); - _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink); - } - else { + const bool show_e_total = TERN0(LCD_SHOW_E_TOTAL, printingIsActive() || marlin_state == MF_SD_COMPLETE); + + if (show_e_total) { #if ENABLED(LCD_SHOW_E_TOTAL) char tmp[20]; const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm @@ -838,6 +834,12 @@ void MarlinUI::draw_status_screen() { lcd_put_u8str(tmp); #endif } + else { + const xy_pos_t lpos = current_position.asLogical(); + _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink); + lcd_put_wchar(' '); + _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink); + } #endif // !HAS_DUAL_MIXING diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 72bdf1e96ac6..8be9b27dda07 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -414,7 +414,7 @@ void MarlinUI::draw_status_screen() { #endif #endif - const bool showxy = TERN1(LCD_SHOW_E_TOTAL, !printingIsActive()); + const bool show_e_total = TERN0(LCD_SHOW_E_TOTAL, printingIsActive() || marlin_state == MF_SD_COMPLETE); // At the first page, generate new display values if (first_page) { @@ -434,16 +434,16 @@ void MarlinUI::draw_status_screen() { const xyz_pos_t lpos = current_position.asLogical(); strcpy(zstring, ftostr52sp(lpos.z)); - if (showxy) { - strcpy(xstring, ftostr4sign(lpos.x)); - strcpy(ystring, ftostr4sign(lpos.y)); - } - else { + if (show_e_total) { #if ENABLED(LCD_SHOW_E_TOTAL) const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm sprintf_P(xstring, PSTR("%ld%cm"), uint32_t(_MAX(e_move_accumulator, 0.0f)) / escale, escale == 10 ? 'c' : 'm'); // 1234567mm #endif } + else { + strcpy(xstring, ftostr4sign(lpos.x)); + strcpy(ystring, ftostr4sign(lpos.y)); + } #if ENABLED(FILAMENT_LCD_DISPLAY) strcpy(wstring, ftostr12ns(filwidth.measured_mm)); @@ -772,14 +772,14 @@ void MarlinUI::draw_status_screen() { #else - if (showxy) { - _draw_axis_value(X_AXIS, xstring, blink); - _draw_axis_value(Y_AXIS, ystring, blink); - } - else { + if (show_e_total) { _draw_axis_value(E_AXIS, xstring, true); lcd_put_u8str_P(PSTR(" ")); } + else { + _draw_axis_value(X_AXIS, xstring, blink); + _draw_axis_value(Y_AXIS, ystring, blink); + } #endif diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index 60c7cc2c30a6..e0b704e71219 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -318,7 +318,8 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop #endif // ADVANCED_PAUSE_FEATURE - // Set the colors for a menu item based on whether it is selected + // Mark a menu item and set font color if selected. + // Return 'false' if the item is not on screen. static bool mark_as_selected(const uint8_t row, const bool sel) { row_y1 = row * (MENU_FONT_HEIGHT) + 1; row_y2 = row_y1 + MENU_FONT_HEIGHT - 1; @@ -330,15 +331,13 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop u8g.drawHLine(0, row_y1 + 1, LCD_PIXEL_WIDTH); u8g.drawHLine(0, row_y2 + 2, LCD_PIXEL_WIDTH); #else - u8g.setColorIndex(1); // black on white + u8g.setColorIndex(1); // solid outline u8g.drawBox(0, row_y1 + 2, LCD_PIXEL_WIDTH, MENU_FONT_HEIGHT - 1); - u8g.setColorIndex(0); // white on black + u8g.setColorIndex(0); // inverted text #endif } #if DISABLED(MENU_HOLLOW_FRAME) - else { - u8g.setColorIndex(1); // unmarked text is black on white - } + else u8g.setColorIndex(1); // solid text #endif if (!PAGE_CONTAINS(row_y1, row_y2)) return false; @@ -352,13 +351,15 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop if (mark_as_selected(row, style & SS_INVERT)) { - u8g_uint_t n = LCD_PIXEL_WIDTH; // pixel width of string allowed + pixel_len_t n = LCD_PIXEL_WIDTH; // pixel width of string allowed - if ((style & SS_CENTER) && !valstr) { - int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; - while (--pad >= 0) { lcd_put_wchar(' '); n--; } - } - n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH) * (MENU_FONT_WIDTH); + if ((style & SS_CENTER) && !valstr) + for (int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; pad > 0; --pad) { + lcd_put_wchar(' '); + n -= MENU_FONT_WIDTH; + } + + n = lcd_put_u8str_ind_P(pstr, itemIndex, n / (MENU_FONT_WIDTH)) * (MENU_FONT_WIDTH); if (valstr) n -= lcd_put_u8str_max(valstr, n); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); } @@ -367,7 +368,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Draw a generic menu item void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char, const char post_char) { if (mark_as_selected(row, sel)) { - u8g_uint_t n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH - 2) * (MENU_FONT_WIDTH); + pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH - 1) * (MENU_FONT_WIDTH); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); lcd_put_wchar(LCD_PIXEL_WIDTH - (MENU_FONT_WIDTH), row_y2, post_char); lcd_put_wchar(' '); @@ -380,7 +381,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop const uint8_t vallen = (pgm ? utf8_strlen_P(data) : utf8_strlen((char*)data)), pixelwidth = (pgm ? uxg_GetUtf8StrPixelWidthP(u8g.getU8g(), data) : uxg_GetUtf8StrPixelWidth(u8g.getU8g(), (char*)data)); - u8g_uint_t n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH - 2 - vallen) * (MENU_FONT_WIDTH); + pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH - 2 - vallen) * (MENU_FONT_WIDTH); if (vallen) { lcd_put_wchar(':'); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); @@ -440,8 +441,9 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } inline void draw_boxed_string(const u8g_uint_t x, const u8g_uint_t y, PGM_P const pstr, const bool inv) { - const u8g_uint_t len = utf8_strlen_P(pstr), bw = len * (MENU_FONT_WIDTH), - bx = x * (MENU_FONT_WIDTH), by = (y + 1) * (MENU_FONT_HEIGHT); + const u8g_uint_t len = utf8_strlen_P(pstr), + by = (y + 1) * (MENU_FONT_HEIGHT); + const pixel_len_t bw = len * (MENU_FONT_WIDTH), bx = x * (MENU_FONT_WIDTH); if (inv) { u8g.setColorIndex(1); u8g.drawBox(bx - 1, by - (MENU_FONT_ASCENT) + 1, bw + 2, MENU_FONT_HEIGHT - 1); @@ -463,8 +465,8 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop if (mark_as_selected(row, sel)) { if (isDir) lcd_put_wchar(LCD_STR_FOLDER[0]); constexpr uint8_t maxlen = LCD_WIDTH - 1; - const u8g_uint_t pixw = maxlen * (MENU_FONT_WIDTH); - u8g_uint_t n = pixw - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), pixw); + const pixel_len_t pixw = maxlen * (MENU_FONT_WIDTH); + pixel_len_t n = pixw - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), pixw); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); } } diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index be2effafd6cc..58594dd0137b 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -46,14 +46,9 @@ #include "../../feature/bedlevel/bedlevel.h" #endif -extern millis_t manual_move_start_time; -extern int8_t manual_move_axis; #if ENABLED(MANUAL_E_MOVES_RELATIVE) float manual_move_e_origin = 0; #endif -#if IS_KINEMATIC - extern float manual_move_offset; -#endif // // Tell ui.update() to start a move to current_position" after a short delay. @@ -66,8 +61,8 @@ inline void manual_move_to_current(AxisEnum axis #if MULTI_MANUAL if (axis == E_AXIS) ui.manual_move_e_index = eindex >= 0 ? eindex : active_extruder; #endif - manual_move_start_time = millis() + (move_menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves - manual_move_axis = (int8_t)axis; + ui.manual_move_start_time = millis() + (move_menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves + ui.manual_move_axis = (int8_t)axis; } // @@ -112,11 +107,11 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { // Get the new position const float diff = float(int32_t(ui.encoderPosition)) * move_menu_scale; #if IS_KINEMATIC - manual_move_offset += diff; + ui.manual_move_offset += diff; if (int32_t(ui.encoderPosition) < 0) - NOLESS(manual_move_offset, min - current_position[axis]); + NOLESS(ui.manual_move_offset, min - current_position[axis]); else - NOMORE(manual_move_offset, max - current_position[axis]); + NOMORE(ui.manual_move_offset, max - current_position[axis]); #else current_position[axis] += diff; if (int32_t(ui.encoderPosition) < 0) @@ -130,11 +125,10 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { } ui.encoderPosition = 0; if (ui.should_draw()) { - const float pos = NATIVE_TO_LOGICAL(ui.processing_manual_move ? destination[axis] : current_position[axis] - #if IS_KINEMATIC - + manual_move_offset - #endif - , axis); + const float pos = NATIVE_TO_LOGICAL( + ui.processing_manual_move ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move_offset), + axis + ); MenuEditItemBase::draw_edit_screen(name, move_menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr43sign(pos)); } } @@ -149,7 +143,7 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } if (ui.encoderPosition) { if (!ui.processing_manual_move) { const float diff = float(int32_t(ui.encoderPosition)) * move_menu_scale; - TERN(IS_KINEMATIC, manual_move_offset, current_position.e) += diff; + TERN(IS_KINEMATIC, ui.manual_move_offset, current_position.e) += diff; manual_move_to_current(E_AXIS #if MULTI_MANUAL , eindex @@ -166,7 +160,7 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } MenuEditItemBase::draw_edit_screen( GET_TEXT(TERN(MULTI_MANUAL, MSG_MOVE_EN, MSG_MOVE_E)), ftostr41sign(current_position.e - + TERN0(IS_KINEMATIC, manual_move_offset) + + TERN0(IS_KINEMATIC, ui.manual_move_offset) - TERN0(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin) ) ); diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index f17ac5f3b767..58cf13a11c52 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -31,6 +31,7 @@ #include "menu.h" #include "../../gcode/gcode.h" #include "../../gcode/queue.h" +#include "../../module/motion.h" #include "../../module/planner.h" #include "../../module/configuration_store.h" #include "../../feature/bedlevel/bedlevel.h" @@ -356,24 +357,16 @@ void _lcd_ubl_build_mesh() { } /** - * UBL Load Mesh Command + * UBL Load / Save Mesh Commands */ -void _lcd_ubl_load_mesh_cmd() { +inline void _lcd_ubl_load_save_cmd(const char loadsave, PGM_P const msg) { char ubl_lcd_gcode[40]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 L%i\nM117 "), ubl_storage_slot); - sprintf_P(&ubl_lcd_gcode[strlen(ubl_lcd_gcode)], GET_TEXT(MSG_MESH_LOADED), ubl_storage_slot); - gcode.process_subcommands_now(ubl_lcd_gcode); -} - -/** - * UBL Save Mesh Command - */ -void _lcd_ubl_save_mesh_cmd() { - char ubl_lcd_gcode[40]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 S%i\nM117 "), ubl_storage_slot); - sprintf_P(&ubl_lcd_gcode[strlen(ubl_lcd_gcode)], GET_TEXT(MSG_MESH_SAVED), ubl_storage_slot); + sprintf_P(ubl_lcd_gcode, PSTR("G29 %c%i\nM117 "), loadsave, ubl_storage_slot); + sprintf_P(&ubl_lcd_gcode[strlen(ubl_lcd_gcode)], msg, ubl_storage_slot); gcode.process_subcommands_now(ubl_lcd_gcode); } +void _lcd_ubl_load_mesh_cmd() { _lcd_ubl_load_save_cmd('L', GET_TEXT(MSG_MESH_LOADED)); } +void _lcd_ubl_save_mesh_cmd() { _lcd_ubl_load_save_cmd('S', GET_TEXT(MSG_MESH_SAVED)); } /** * UBL Mesh Storage submenu @@ -444,9 +437,6 @@ void ubl_map_move_to_xy() { /** * UBL LCD "radar" map */ -void set_current_from_steppers_for_axis(const AxisEnum axis); -void sync_plan_position(); - void _lcd_ubl_output_map_lcd() { static int16_t step_scaler = 0; diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 271de7272262..2bdcb1915d11 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -637,12 +637,12 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { #if HAS_LCD_MENU - int8_t manual_move_axis = (int8_t)NO_AXIS; - millis_t manual_move_start_time = 0; + int8_t MarlinUI::manual_move_axis = (int8_t)NO_AXIS; + millis_t MarlinUI::manual_move_start_time = 0; #if IS_KINEMATIC bool MarlinUI::processing_manual_move = false; - float manual_move_offset = 0; + float MarlinUI::manual_move_offset = 0; #endif #if MULTI_MANUAL @@ -905,8 +905,8 @@ void MarlinUI::update() { } #endif - // then we want to use 1/2 of the time only. - uint16_t bbr2 = planner.block_buffer_runtime() >> 1; + // Then we want to use only 50% of the time + const uint16_t bbr2 = planner.block_buffer_runtime() >> 1; if ((should_draw() || drawing_screen) && (!bbr2 || bbr2 > max_display_update_time)) { diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 4faeea63f6b1..7641643409e5 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -494,7 +494,11 @@ class MarlinUI { static void enable_encoder_multiplier(const bool onoff); #endif + static int8_t manual_move_axis; + static millis_t manual_move_start_time; + #if IS_KINEMATIC + static float manual_move_offset; static bool processing_manual_move; #else static constexpr bool processing_manual_move = false; diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 2703cd64cf9f..5715399e496c 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2039,7 +2039,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, const uint8_t moves_queued = nonbusy_movesplanned(); // Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill - #if EITHER(SLOWDOWN, ULTRA_LCD) || defined(XY_FREQUENCY_LIMIT) + #if EITHER(SLOWDOWN, HAS_SPI_LCD) || defined(XY_FREQUENCY_LIMIT) // Segment time im micro seconds int32_t segment_time_us = LROUND(1000000.0f / inverse_secs); #endif From 452072cc08efcfdcd01c712c69cc81a014ea3626 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Jun 2020 22:45:09 -0500 Subject: [PATCH 030/483] Fix typo in DWIN, preheat array --- Marlin/src/lcd/dwin/dwin.cpp | 2 -- Marlin/src/lcd/ultralcd.cpp | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 6df5e817f735..e2312ff8948e 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -2383,8 +2383,6 @@ void HMI_AxisMove(void) { DWIN_UpdateLCD(); } -enum - /* TemperatureID */ void HMI_Temperature(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 2bdcb1915d11..74924e1dd131 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -86,7 +86,7 @@ MarlinUI ui; } #endif -#if EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD) +#if PREHEAT_COUNT preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() #endif From 834c265e2cb0fd16c388c732540c103687baae4a Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Fri, 26 Jun 2020 08:22:32 +0200 Subject: [PATCH 031/483] Update Italian language (#18414) --- Marlin/src/lcd/language/language_it.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index aa853e56f482..0f06d862c164 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -315,6 +315,8 @@ namespace Language_it { PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("Limite E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite E *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. filo"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. filo *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Rimuovi mm"); @@ -336,6 +338,10 @@ namespace Language_it { PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Schermata info"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepara"); PROGMEM Language_Str MSG_TUNE = _UxGT("Regola"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Controllo aliment."); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Corrente"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Tensione"); + PROGMEM Language_Str MSG_POWER = _UxGT("Potenza"); PROGMEM Language_Str MSG_START_PRINT = _UxGT("Avvia stampa"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Prossimo"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inizializza"); From aae5f7229c476d606c9bde7ae95b143fd26cfbd8 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Fri, 26 Jun 2020 08:23:39 +0200 Subject: [PATCH 032/483] [samd51] Manifest assigned timers priority (#18402) --- Marlin/src/HAL/SAMD51/timers.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/HAL/SAMD51/timers.cpp b/Marlin/src/HAL/SAMD51/timers.cpp index fa2d4d3e68f7..a404e35dac87 100644 --- a/Marlin/src/HAL/SAMD51/timers.cpp +++ b/Marlin/src/HAL/SAMD51/timers.cpp @@ -36,15 +36,15 @@ // -------------------------------------------------------------------------- const tTimerConfig TimerConfig[NUM_HARDWARE_TIMERS+1] = { - { {.pTc=TC0}, TC0_IRQn, TC_PRIORITY(0) }, // 0 - stepper + { {.pTc=TC0}, TC0_IRQn, TC_PRIORITY(0) }, // 0 - stepper (assigned priority 2) { {.pTc=TC1}, TC1_IRQn, TC_PRIORITY(1) }, // 1 - stepper (needed by 32 bit timers) - { {.pTc=TC2}, TC2_IRQn, TC_PRIORITY(2) }, // 2 - tone (framework) - { {.pTc=TC3}, TC3_IRQn, TC_PRIORITY(3) }, // 3 - servo - { {.pTc=TC4}, TC4_IRQn, TC_PRIORITY(4) }, // 4 - software serial + { {.pTc=TC2}, TC2_IRQn, 5 }, // 2 - tone (reserved by framework and fixed assigned priority 5) + { {.pTc=TC3}, TC3_IRQn, TC_PRIORITY(3) }, // 3 - servo (no interrupts used) + { {.pTc=TC4}, TC4_IRQn, TC_PRIORITY(4) }, // 4 - software serial (no interrupts used) { {.pTc=TC5}, TC5_IRQn, TC_PRIORITY(5) }, { {.pTc=TC6}, TC6_IRQn, TC_PRIORITY(6) }, { {.pTc=TC7}, TC7_IRQn, TC_PRIORITY(7) }, - { {.pRtc=RTC}, RTC_IRQn, TC_PRIORITY(8) } // 8 - temperature + { {.pRtc=RTC}, RTC_IRQn, TC_PRIORITY(8) } // 8 - temperature (assigned priority 6) }; // -------------------------------------------------------------------------- From c6a066c0be1dce2cd7595d8fb38d0b82f924f786 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 25 Jun 2020 23:37:22 -0700 Subject: [PATCH 033/483] Update MKS Robin Nano auto-build env (#18417) --- Marlin/src/pins/pins.h | 2 +- platformio.ini | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 63a6b1ce1a73..d8933fe03914 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -507,7 +507,7 @@ #elif MB(MKS_ROBIN_MINI) #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini #elif MB(MKS_ROBIN_NANO) - #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano + #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano env:mks_robin_nano35 #elif MB(MKS_ROBIN_LITE) #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite #elif MB(BTT_SKR_MINI_V1_1) diff --git a/platformio.ini b/platformio.ini index 7415631312a0..1f5385ca5149 100644 --- a/platformio.ini +++ b/platformio.ini @@ -541,7 +541,7 @@ build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE # -# MKS Robin Nano (STM32F103VET6) +# MKS Robin Nano (STM32F103VET6) - Emulated Graphical 128x64 (DOGM) UI # [env:mks_robin_nano] platform = ${common_stm32f1.platform} @@ -628,7 +628,7 @@ lib_ignore = ${common_stm32f1.lib_ignore} LiquidCrystal, LiquidTWI2, TMCStepper, U8glib-HAL, SoftwareSerialM # -# MKS Robin Nano (STM32F103VET6) +# MKS Robin Nano (STM32F103VET6) - MKS UI (LVGL) # [env:mks_robin_nano35] platform = ststm32 From ce3fb616045404608fb89b636374decf2ff615c6 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Fri, 26 Jun 2020 08:39:49 +0200 Subject: [PATCH 034/483] SAMD51 cleanup (#18419) --- Marlin/src/HAL/SAMD51/HAL.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index e72b7a3d8228..e3867eb4e9ad 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -129,7 +129,6 @@ void HAL_adc_init(); #define HAL_ADC_READY() true void HAL_adc_start_conversion(const uint8_t adc_pin); -inline uint16_t HAL_adc_get_result() { return HAL_adc_result; } // // Pin Map From 2330ee48f233724c27aa9bca33c3dc3d6ef1c973 Mon Sep 17 00:00:00 2001 From: Johnny Eshak Date: Fri, 26 Jun 2020 08:46:31 +0200 Subject: [PATCH 035/483] BTT SKR Pro runout pins (#18416) --- Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 1f2c8d94ea6b..42e3f1fac0a3 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -98,6 +98,19 @@ #define Z_MIN_PROBE_PIN PA2 #endif +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PE15 +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN PE10 +#endif +#ifndef FIL_RUNOUT3_PIN + #define FIL_RUNOUT3_PIN PG5 +#endif + // // Steppers // From 90135803a3fc976fd7b9700c121a8f1485c7e662 Mon Sep 17 00:00:00 2001 From: Lucas Seiki Oshiro Date: Fri, 26 Jun 2020 04:09:30 -0300 Subject: [PATCH 036/483] Update Brazilian Portuguese language (#18411) --- Marlin/src/lcd/language/language_pt_br.h | 91 +++++++++++++++++++++--- 1 file changed, 80 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 0d355147f813..f3faf2aac360 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -36,10 +36,17 @@ namespace Language_pt_br { PROGMEM Language_Str LANGUAGE = _UxGT("Portuguese (BR)"); PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronto."); - + PROGMEM Language_Str MSG_YES = _UxGT("SIM"); + PROGMEM Language_Str MSG_NO = _UxGT("NÃO"); PROGMEM Language_Str MSG_BACK = _UxGT("Voltar"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Abortando..."); PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Cartão inserido"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Cartão removido"); + PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("Cartão liberado"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Aguardando cartão"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Erro de leitura"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB removido"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB falhou"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Fins de curso"); PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Fins curso"); PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); @@ -87,13 +94,16 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar Mesa"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivelar Cantos"); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Próximo Canto"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor de Malha"); PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editar Malha"); PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Fim da Edição"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Sondando ponto"); PROGMEM Language_Str MSG_MESH_X = _UxGT("Ãndice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ãndice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comando customizado"); - + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Teste de sonda"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Ponto"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Estacionar"); PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicação"); @@ -102,7 +112,6 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2o bico X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2o bico Y"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2o bico Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Executando G29"); PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Ferramentas UBL"); PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Nivel. Mesa Unif."); @@ -114,9 +123,9 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Ativar UBL"); PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Desativar UBL"); PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Mesa"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Mesa"); PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Extrusora"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Extrusora"); PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editar Malha"); PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Editar Malha Custom"); PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ajuste Fino da Malha"); @@ -132,6 +141,10 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Checar ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Checar ") PREHEAT_2_LABEL; PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validar Malha Custom"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Aquecendo Mesa"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Aquecendo Ext."); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Cancelado"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("G26 Saindo"); PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continuar Malha"); PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nivelação da Malha"); PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelação 3 pontos"); @@ -161,6 +174,7 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Sem armazenamento"); PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Erro ao salvar UBL"); PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Erro no restauro UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Compensação Z: "); PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Compensação Z parou"); PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo a passo"); PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Montar Malha fria"); @@ -189,6 +203,7 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensidade Azul"); PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensidade Branco"); PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brilho"); + PROGMEM Language_Str MSG_MOVING = _UxGT("Movendo..."); PROGMEM Language_Str MSG_FREE_XY = _UxGT("Liberar XY"); PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); @@ -260,9 +275,22 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Informações"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); PROGMEM Language_Str MSG_TUNE = _UxGT("Ajustar"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Iniciar Impressão"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Prox."); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Iniciar"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Parar"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimir"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetar"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancelar"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Pronto"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Voltar"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Continuar"); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impressão"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resumir impressão"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Continuar impressão"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Parar impressão"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Imprimindo objeto"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancelar Objeto"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancelar Objeto ="); PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Recuperar Impressão"); PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimir do SD"); PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sem cartão SD"); @@ -284,42 +312,54 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Des-RetTroca V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retração Automática"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Distancia Retração"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Distancia Purga"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Mudar Ferramenta"); PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Levantar Z"); PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Preparar Veloc."); PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Veloc. Retração"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Standby bico"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Trocar Filamento"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Trocar Filamento *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Carregar Filamento"); PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Carregar Filamento *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Descarreg. Filamento"); PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Descarreg. Filamento *"); PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Descarregar Todos"); PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Iniciar SD"); PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Trocar SD"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Liberar SD"); PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda fora da mesa"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Fator de Cisalho"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Testar BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reiniciar BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estender BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Recolher BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estender BLTouch"); PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Estender Sonda-Z"); PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Recolher Sonda-Z"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s Primeiro"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Compensar Sonda"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Compensar Sonda em X"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Compensar Sonda em Y"); PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Compensar Sonda em Z"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Passinho X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Passinho Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Passinho Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abortar Fim de Curso"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Aquecer mesa falhou"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Aquecer câmara falhou"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ESCAPE TÉRMICO"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ESCAPE TÉRMICO MESA"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ESCAPE TÉRMICO CAMARA"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Erro:Temp Máxima"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Erro:Temp Mínima"); PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Erro:Temp Mesa Máx"); PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Erro:Temp Mesa Mín"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Erro:Temp Câmara Máx"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Erro:Temp Câmara Min"); PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY Primeiro"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESSORA PAROU"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Favor resetar"); @@ -330,12 +370,13 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_COOLING = _UxGT("Resfriando..."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Aquecendo mesa..."); PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Esfriando mesa..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Aquecendo Câmara..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Esfriando Câmara..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibrar Delta"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Configuração Delta"); PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto-Calibração"); PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Calibrar Altura"); @@ -356,9 +397,9 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusoras"); PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Taxa de Transmissão"); PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz da Impressora"); PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Intensidade Brilho"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora Incorreta"); #if LCD_WIDTH >= 20 @@ -380,7 +421,7 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Força do Motor"); PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escrever EEPROM DAC"); - + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("TROCA DE FILAMENTO"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESSÃO PAUSADA"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARREGAR FILAMENTO"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARREG. FILAMENTO"); @@ -393,8 +434,34 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Falha ao sondar"); PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Muito frio"); + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ESCOLHER FILAMENTO"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Continuar Impressão"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Continuando..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Carregar Filamento"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Carregar Todos"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Carregar para bocal"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Ejetar Filamento"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Ejetar Filamento ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Liberar Filamento"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Carregando Fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejetando Fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Carregando Fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Todos"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Resetar MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetando MMU..."); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Jogos"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Labirinto"); + #if LCD_HEIGHT >= 4 PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Aperte o botão para", "continuar impressão")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Estacionando...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperando o", "inicio da", "troca de filamento")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Coloque filamento", "pressione o botão", "para continuar...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Pressione o botão", "p/ aquecer o bocal")); @@ -406,8 +473,10 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperando impressão", "continuar")); #else // LCD_HEIGHT < 4 PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Clique p. continuar")); + PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Estacionando...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Aguarde...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insira e Clique")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Clique para Aquecer")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Aquecendo...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejetando...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Carregando...")); From 5a96695ead5986a8999455424b7eba237d33be0c Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 26 Jun 2020 16:10:11 -0700 Subject: [PATCH 037/483] Fix Fan Speed menu items (#18400) --- Marlin/src/lcd/menu/menu_temperature.cpp | 34 +++++++++++++----------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 8bfce13f7b5f..58ba8ae608f1 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -210,14 +210,18 @@ void menu_temperature() { thermalManager.set_fan_speed(MenuItemBase::itemIndex, editable.uint8); }; - #if HAS_FAN1 || HAS_FAN2 || HAS_FAN3 || HAS_FAN4 || HAS_FAN5 || HAS_FAN6 || HAS_FAN7 - auto fan_edit_items = [&](const uint8_t f) { - editable.uint8 = thermalManager.fan_speed[f]; - EDIT_ITEM_FAST_N(percent, f, MSG_FAN_SPEED_N, &editable.uint8, 0, 255, on_fan_update); - #if ENABLED(EXTRA_FAN_SPEED) - EDIT_ITEM_FAST_N(percent, f, MSG_EXTRA_FAN_SPEED_N, &thermalManager.new_fan_speed[f], 3, 255); - #endif - }; + #if ENABLED(EXTRA_FAN_SPEED) + #define EDIT_EXTRA_FAN_SPEED(V...) EDIT_ITEM_FAST_N(V) + #else + #define EDIT_EXTRA_FAN_SPEED(...) + #endif + + #if FAN_COUNT > 1 + #define FAN_EDIT_ITEMS(F) do{ \ + editable.uint8 = thermalManager.fan_speed[F]; \ + EDIT_ITEM_FAST_N(percent, F, MSG_FAN_SPEED_N, &editable.uint8, 0, 255, on_fan_update); \ + EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_FAN_SPEED_N, &thermalManager.new_fan_speed[F], 3, 255); \ + }while(0) #endif #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N) @@ -236,37 +240,37 @@ void menu_temperature() { #endif #endif #if HAS_FAN1 - fan_edit_items(1); + FAN_EDIT_ITEMS(1); #elif SNFAN(1) singlenozzle_item(1); #endif #if HAS_FAN2 - fan_edit_items(2); + FAN_EDIT_ITEMS(2); #elif SNFAN(2) singlenozzle_item(1); #endif #if HAS_FAN3 - fan_edit_items(3); + FAN_EDIT_ITEMS(3); #elif SNFAN(3) singlenozzle_item(1); #endif #if HAS_FAN4 - fan_edit_items(4); + FAN_EDIT_ITEMS(4); #elif SNFAN(4) singlenozzle_item(1); #endif #if HAS_FAN5 - fan_edit_items(5); + FAN_EDIT_ITEMS(5); #elif SNFAN(5) singlenozzle_item(1); #endif #if HAS_FAN6 - fan_edit_items(6); + FAN_EDIT_ITEMS(6); #elif SNFAN(6) singlenozzle_item(1); #endif #if HAS_FAN7 - fan_edit_items(7); + FAN_EDIT_ITEMS(7); #elif SNFAN(7) singlenozzle_item(1); #endif From 319e93f55d616d4c6e4a028888167a898dce7d1a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Jun 2020 21:50:57 -0500 Subject: [PATCH 038/483] Patch some DGUS warnings --- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index 66af4e49d492..b3325703dc21 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -907,49 +907,41 @@ void DGUSScreenVariableHandler::HandleHeaterControl(DGUS_VP_Variable &var, void } #if ENABLED(DGUS_PREHEAT_UI) + void DGUSScreenVariableHandler::HandlePreheat(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandlePreheat"); uint8_t e_temp = 0; - uint8_t bed_temp = 0; + TERN_(HAS_HEATED_BED, uint8_t bed_temp = 0); const uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); switch (preheat_option) { + default: case 0: // Preheat PLA #if defined(PREHEAT_1_TEMP_HOTEND) && defined(PREHEAT_1_TEMP_BED) e_temp = PREHEAT_1_TEMP_HOTEND; - bed_temp = PREHEAT_1_TEMP_BED; + TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_1_TEMP_BED); #endif break; case 1: // Preheat ABS #if defined(PREHEAT_2_TEMP_HOTEND) && defined(PREHEAT_2_TEMP_BED) e_temp = PREHEAT_2_TEMP_HOTEND; - bed_temp = PREHEAT_2_TEMP_BED; + TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_2_TEMP_BED); #endif break; case 2: // Preheat PET #if defined(PREHEAT_3_TEMP_HOTEND) && defined(PREHEAT_3_TEMP_BED) e_temp = PREHEAT_3_TEMP_HOTEND; - bed_temp = PREHEAT_3_TEMP_BED; + TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_3_TEMP_BED); #endif break; case 3: // Preheat FLEX #if defined(PREHEAT_4_TEMP_HOTEND) && defined(PREHEAT_4_TEMP_BED) e_temp = PREHEAT_4_TEMP_HOTEND; - bed_temp = PREHEAT_4_TEMP_BED; - #endif - break; - case 7: // Custom preheat - break; - case 9: // Cool down - e_temp = 0; - bed_temp = 0; - break; - default: - #if defined(PREHEAT_1_TEMP_HOTEND) && defined(PREHEAT_1_TEMP_BED) - e_temp = PREHEAT_1_TEMP_HOTEND; - bed_temp = PREHEAT_1_TEMP_BED; + TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_4_TEMP_BED); #endif break; + case 7: break; // Custom preheat + case 9: break; // Cool down } switch (var.VP) { @@ -971,6 +963,7 @@ void DGUSScreenVariableHandler::HandleHeaterControl(DGUS_VP_Variable &var, void // Go to the preheat screen to show the heating progress GotoScreen(DGUSLCD_SCREEN_PREHEAT); } + #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) @@ -1306,7 +1299,7 @@ void DGUSDisplay::ProcessRx() { | Command DataLen (in Words) */ if (command == DGUS_CMD_READVAR) { const uint16_t vp = tmp[0] << 8 | tmp[1]; - const uint8_t dlen = tmp[2] << 1; // Convert to Bytes. (Display works with words) + //const uint8_t dlen = tmp[2] << 1; // Convert to Bytes. (Display works with words) //DEBUG_ECHOPAIR(" vp=", vp, " dlen=", dlen); DGUS_VP_Variable ramcopy; if (populate_VPVar(vp, &ramcopy)) { From a907e15ae63b403358d831766d6773c76614702d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 26 Jun 2020 18:53:39 -0500 Subject: [PATCH 039/483] Allow larger ADC debounce Reference #17205 --- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 4 ++-- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/module/temperature.h | 2 +- Marlin/src/pins/ramps/pins_ZRIB_V20.h | 7 +++++++ 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 07736c91ca6b..8932c683a8cb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1519,7 +1519,7 @@ // ADC Button Debounce // #if HAS_ADC_BUTTONS - #define ADC_BUTTON_DEBOUNCE_DELAY 16 // (ms) Increase if buttons bounce or repeat too fast + #define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast #endif // @section safety diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 76c7b12bbebe..d99330916176 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2976,8 +2976,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif -#if HAS_ADC_BUTTONS && defined(ADC_BUTTON_DEBOUNCE_DELAY) && !WITHIN(ADC_BUTTON_DEBOUNCE_DELAY, 16, 255) - #error "ADC_BUTTON_DEBOUNCE_DELAY must be an integer from 16 to 255." +#if HAS_ADC_BUTTONS && defined(ADC_BUTTON_DEBOUNCE_DELAY) && ADC_BUTTON_DEBOUNCE_DELAY < 16 + #error "ADC_BUTTON_DEBOUNCE_DELAY must be greater than 16." #endif /** diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index f909476592e0..b95fdbdd86c7 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -351,7 +351,7 @@ volatile bool Temperature::raw_temps_ready = false; #if HAS_ADC_BUTTONS uint32_t Temperature::current_ADCKey_raw = HAL_ADC_RANGE; - uint8_t Temperature::ADCKey_count = 0; + uint16_t Temperature::ADCKey_count = 0; #endif #if ENABLED(PID_EXTRUSION_SCALING) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 0362e2e8e5a5..a6d702646dae 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -425,7 +425,7 @@ class Temperature { public: #if HAS_ADC_BUTTONS static uint32_t current_ADCKey_raw; - static uint8_t ADCKey_count; + static uint16_t ADCKey_count; #endif TERN_(PID_EXTRUSION_SCALING, static int16_t lpq_len); diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V20.h b/Marlin/src/pins/ramps/pins_ZRIB_V20.h index a40800158c68..4ca20a707fb5 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V20.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V20.h @@ -69,6 +69,13 @@ #undef ADC_KEYPAD_PIN #undef BEEPER_PIN + #undef SHIFT_OUT + #undef SHIFT_CLK + #undef SHIFT_LD + #undef BTN_EN1 + #undef BTN_EN2 + #undef BTN_ENC + #define LCD_PINS_RS ZRIB_V20_D16_PIN #define LCD_PINS_ENABLE ZRIB_V20_D17_PIN #define LCD_PINS_D4 ZRIB_V20_D23_PIN From 8474050adbe1bd4d363397cfedefaee996ac1e98 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 27 Jun 2020 00:07:09 +0000 Subject: [PATCH 040/483] [cron] Bump distribution date (2020-06-27) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 42765355045a..67d68168886f 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-26" + #define STRING_DISTRIBUTION_DATE "2020-06-27" #endif /** From ad1470b5d251e3584325ce243732b95f447f5209 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 28 Jun 2020 00:07:10 +0000 Subject: [PATCH 041/483] [cron] Bump distribution date (2020-06-28) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 67d68168886f..04c666a9600b 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-27" + #define STRING_DISTRIBUTION_DATE "2020-06-28" #endif /** From e392745c86eab629207b40c861994efe1d54e087 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 27 Jun 2020 19:08:46 -0500 Subject: [PATCH 042/483] Update language fonts --- Marlin/src/lcd/dogm/fontdata/langdata_sk.h | 5 + Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h | 590 ++++++++++++++++-- 2 files changed, 555 insertions(+), 40 deletions(-) diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h index b069b351d78b..6bcafb64ed3e 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h @@ -15,6 +15,10 @@ const u8g_fntpgm_uint8_t fontpage_2_186_186[33] U8G_FONT_SECTION("fontpage_2_186 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0x00,0x00, 0x00,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0x40,0x40, 0xe0}; +const u8g_fntpgm_uint8_t fontpage_2_190_190[33] U8G_FONT_SECTION("fontpage_2_190_190") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0x00,0x00, + 0x00,0x03,0x0a,0x0a,0x06,0x01,0x00,0xa0,0x40,0x00,0xc0,0x40,0x40,0x40,0x40,0x40, + 0xe0}; const u8g_fntpgm_uint8_t fontpage_2_199_200[47] U8G_FONT_SECTION("fontpage_2_199_200") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc8,0x00,0x0a,0x00,0x00, 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88, @@ -36,6 +40,7 @@ const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253 static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(2, 140, 143, fontpage_2_140_143), // 'ÄŒ' -- 'Ä' FONTDATA_ITEM(2, 186, 186, fontpage_2_186_186), // 'ĺ' -- 'ĺ' + FONTDATA_ITEM(2, 190, 190, fontpage_2_190_190), // 'ľ' -- 'ľ' FONTDATA_ITEM(2, 199, 200, fontpage_2_199_200), // 'Ň' -- 'ň' FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Å ' -- 'Å¡' FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'Å¥' -- 'Å¥' diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h index 98d005ec6214..e1d36478236f 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h @@ -5,6 +5,9 @@ */ #include +const u8g_fntpgm_uint8_t fontpage_64_157_157[26] U8G_FONT_SECTION("fontpage_64_157_157") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x07,0x00,0x00, + 0x00,0x05,0x03,0x03,0x06,0x00,0x04,0xd8,0x48,0x90}; const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; @@ -23,6 +26,10 @@ const u8g_fntpgm_uint8_t fontpage_156_141_141[45] U8G_FONT_SECTION("fontpage_156 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x02,0x00,0x02,0x00,0x04,0x00,0x0d, 0x00,0x14,0x80,0x24,0x40,0x44,0x20,0x84,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_147_147[45] U8G_FONT_SECTION("fontpage_156_147_147") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x3f,0xc0,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x08,0x00,0x1f,0xc0,0x00,0x80,0x0d,0x00,0x02,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_156_157_157[45] U8G_FONT_SECTION("fontpage_156_157_157") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x29,0x40,0x4a,0x40,0xf7, @@ -35,10 +42,16 @@ const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0x88, 0x80,0x88,0x80,0xff,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_156_187_187[45] U8G_FONT_SECTION("fontpage_156_187_187") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04, - 0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_186_187[73] U8G_FONT_SECTION("fontpage_156_186_187") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x48,0x00,0x28,0x00,0x08,0x00,0xff,0x80,0x08, + 0x80,0x0c,0x80,0x12,0x80,0x12,0x80,0x20,0x80,0x44,0x80,0x83,0x00,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x7f, + 0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_201_201[45] U8G_FONT_SECTION("fontpage_156_201_201") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x80,0x24,0x80,0x24,0x80,0x21,0x00,0x11, + 0x00,0x12,0x00,0x0a,0x00,0x04,0x00,0x0a,0x00,0x31,0x80,0xc0,0x60}; const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0x7f,0xc0,0x00,0x80,0x01, @@ -47,10 +60,18 @@ const u8g_fntpgm_uint8_t fontpage_157_134_134[45] U8G_FONT_SECTION("fontpage_157 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0xff,0x80,0x01,0x00,0x02,0x00,0x0c,0x00,0x08, 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x28,0x00,0x10,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_140_140[39] U8G_FONT_SECTION("fontpage_157_140_140") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x08,0x00,0x00, + 0x00,0x0b,0x08,0x10,0x0c,0x00,0x00,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xff,0xe0}; const u8g_fntpgm_uint8_t fontpage_157_142_142[45] U8G_FONT_SECTION("fontpage_157_142_142") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, 0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1c,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_164_164[45] U8G_FONT_SECTION("fontpage_157_164_164") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20, + 0x80,0x51,0x40,0x11,0x00,0x0a,0x00,0x04,0x00,0x1b,0x00,0x60,0xe0}; const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x11,0x00,0x1f,0x00,0x00, @@ -59,10 +80,16 @@ const u8g_fntpgm_uint8_t fontpage_157_206_206[45] U8G_FONT_SECTION("fontpage_157 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xce,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11, 0x00,0x11,0x00,0x2a,0x80,0x2a,0x80,0x44,0x40,0x88,0x40,0x10,0x20}; -const u8g_fntpgm_uint8_t fontpage_157_228_228[45] U8G_FONT_SECTION("fontpage_157_228_228") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, +const u8g_fntpgm_uint8_t fontpage_157_228_229[73] U8G_FONT_SECTION("fontpage_157_228_229") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe5,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x0a,0x00,0x11,0x00,0x24, - 0x80,0xc2,0x60,0x3f,0x80,0x01,0x00,0x0a,0x00,0x04,0x00,0x02,0x00}; + 0x80,0xc2,0x60,0x3f,0x80,0x01,0x00,0x0a,0x00,0x04,0x00,0x02,0x00,0x0a,0x0b,0x16, + 0x0c,0x01,0xff,0x01,0x00,0x81,0x00,0x91,0x00,0x89,0x00,0x89,0x00,0x81,0x00,0x91, + 0x00,0xa1,0x00,0xc2,0x80,0x84,0x40,0x18,0x40}; +const u8g_fntpgm_uint8_t fontpage_157_246_246[45] U8G_FONT_SECTION("fontpage_157_246_246") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x15,0x00,0x25,0x00,0x2f,0xc0,0x71, + 0x00,0xa1,0x00,0x2f,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, @@ -71,20 +98,40 @@ const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x21,0x00,0x3f,0xe0,0x61, 0x00,0xa3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_158_160_160[45] U8G_FONT_SECTION("fontpage_158_160_160") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x27,0xe0,0x21,0x00,0x6f, + 0xe0,0xa2,0x00,0x27,0xe0,0x20,0x40,0x22,0x80,0x21,0x00,0x20,0x80}; const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xce,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x20,0x00,0x2f,0xe0,0x60, 0x00,0xa4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, 0x0c,0x00,0xff,0x10,0xc0,0x1f,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xaf,0xe0,0x29, 0x00,0x29,0x20,0x2a,0xa0,0x2d,0x60,0x28,0xa0}; +const u8g_fntpgm_uint8_t fontpage_158_211_211[45] U8G_FONT_SECTION("fontpage_158_211_211") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x22,0x00,0x5f,0xc0,0x42,0x00,0xc7, + 0x00,0x4a,0x80,0x52,0x40,0x62,0x20,0x4f,0x80,0x42,0x00,0x42,0x00}; +const u8g_fntpgm_uint8_t fontpage_158_217_217[45] U8G_FONT_SECTION("fontpage_158_217_217") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x04,0x00,0x7f,0xc0,0x04,0x00,0x15,0x00,0x24,0x80,0x4c,0x40}; const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x14,0x00,0x27,0xe0,0x2a,0x00,0x72, 0x00,0xa3,0xc0,0x22,0x00,0x22,0x00,0x23,0xe0,0x22,0x00,0x22,0x00}; +const u8g_fntpgm_uint8_t fontpage_158_255_255[45] U8G_FONT_SECTION("fontpage_158_255_255") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x21,0x00,0x2f,0xe0,0x69, + 0x20,0xaf,0xe0,0x29,0x00,0x25,0x00,0x22,0x00,0x25,0x80,0x38,0x60}; const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x80,0x14,0x80,0x24,0x80,0x2f,0xe0,0x64, 0x80,0xa4,0x80,0x3f,0xe0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; +const u8g_fntpgm_uint8_t fontpage_159_181_181[45] U8G_FONT_SECTION("fontpage_159_181_181") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb5,0xb5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xc0,0x20,0x40,0x4f,0xc0,0x40,0x40,0xdf, + 0xe0,0x50,0x20,0x4f,0xc0,0x44,0x80,0x43,0x00,0x44,0x80,0x58,0x60}; const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x14,0x40,0x24,0x40,0x27,0xc0,0x61, @@ -97,6 +144,10 @@ const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x22,0x00,0x27,0xc0,0x64, 0x40,0xa7,0xc0,0x24,0x40,0x27,0x40,0x25,0xc0,0x24,0x40,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_160_190_190[45] U8G_FONT_SECTION("fontpage_160_190_190") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x13,0xe0,0x19,0x00,0x2b,0xe0,0x2e,0x20,0x6a, + 0xa0,0xaa,0xa0,0x2a,0xa0,0x2e,0xa0,0x2a,0xa0,0x21,0x40,0x26,0x20}; const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x28,0x20,0x2f,0xe0,0x68, @@ -109,14 +160,20 @@ const u8g_fntpgm_uint8_t fontpage_161_168_168[45] U8G_FONT_SECTION("fontpage_161 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x61,0x20,0x57,0xc0,0x41,0x40,0x77,0xe0,0xd1, 0x00,0x53,0xc0,0x56,0x40,0x53,0xc0,0x5a,0x40,0x52,0x40,0x43,0xc0}; +const u8g_fntpgm_uint8_t fontpage_161_207_207[45] U8G_FONT_SECTION("fontpage_161_207_207") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x13,0xc0,0x14,0x80,0x2f,0xe0,0x35,0x20,0x67, + 0xe0,0xa2,0x20,0x2d,0x40,0x22,0x80,0x2d,0xc0,0x22,0xa0,0x2d,0x80}; const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0xff,0xc0,0x08,0x00,0x11,0x00,0x7f, 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xc1,0xc0}; -const u8g_fntpgm_uint8_t fontpage_162_200_200[45] U8G_FONT_SECTION("fontpage_162_200_200") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, +const u8g_fntpgm_uint8_t fontpage_162_200_201[73] U8G_FONT_SECTION("fontpage_162_200_201") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x84, - 0x00,0xff,0xe0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0}; + 0x00,0xff,0xe0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x04,0x00,0xff,0xe0,0x12,0x00,0x12, + 0x00,0x12,0x20,0x12,0x20,0x22,0x20,0xc1,0xe0}; const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0a, @@ -137,6 +194,10 @@ const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f, 0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0,0x11,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_151_151[43] U8G_FONT_SECTION("fontpage_163_151_151") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x09,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x11,0x00,0x11, + 0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x41,0x20,0x80,0xe0}; const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, @@ -155,10 +216,12 @@ const u8g_fntpgm_uint8_t fontpage_163_250_251[73] U8G_FONT_SECTION("fontpage_163 0xc0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xff,0xe0,0x0b,0x0b,0x16, 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, 0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f,0xc0}; -const u8g_fntpgm_uint8_t fontpage_164_134_134[45] U8G_FONT_SECTION("fontpage_164_134_134") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, +const u8g_fntpgm_uint8_t fontpage_164_134_135[73] U8G_FONT_SECTION("fontpage_164_134_135") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x87,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, - 0x40,0xbf,0xa0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xc3,0x00}; + 0x40,0xbf,0xa0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xc3,0x00,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0x21,0x20,0x39,0x20,0xe1,0x20,0x21,0x20,0x29, + 0x20,0x32,0x20,0x22,0x20,0x04,0x20,0x08,0xc0}; const u8g_fntpgm_uint8_t fontpage_164_155_155[45] U8G_FONT_SECTION("fontpage_164_155_155") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x18,0x20,0x24,0xa0,0x42,0xa0,0xbc, @@ -167,6 +230,10 @@ const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x27,0xe0,0xf9,0x20,0x11,0x20,0x21, 0x20,0x69,0x20,0xb1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_164_171_171[45] U8G_FONT_SECTION("fontpage_164_171_171") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7c,0x20,0x44,0x20,0x44,0xa0,0x7c,0xa0,0x10, + 0xa0,0xfe,0xa0,0x12,0xa0,0x22,0xa0,0x22,0x20,0x42,0x20,0x8c,0xe0}; const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfe,0x20,0x10,0x20,0x20,0xa0,0x44,0xa0,0xfe, @@ -177,6 +244,10 @@ const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164 0xa0,0x10,0xa0,0x7e,0xa0,0x52,0xa0,0x52,0x20,0x56,0x20,0x10,0xe0,0x0b,0x0b,0x16, 0x0c,0x00,0xff,0x7e,0x20,0x42,0x20,0x7e,0xa0,0x48,0xa0,0x48,0xa0,0x7e,0xa0,0x6a, 0xa0,0xaa,0xa0,0xaa,0xa0,0x2e,0x20,0x08,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_242_242[45] U8G_FONT_SECTION("fontpage_164_242_242") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0xfe,0x20,0x92,0xa0,0x7c,0xa0,0x10, + 0xa0,0x7c,0xa0,0x10,0xa0,0xfe,0xa0,0x44,0x20,0x44,0x20,0x7c,0xe0}; const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x08,0x00,0xff,0x80,0x08, @@ -193,6 +264,10 @@ const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, 0x00,0xa2,0x00,0x26,0x00,0x2a,0x00,0x22,0x20,0x22,0x20,0x21,0xe0}; +const u8g_fntpgm_uint8_t fontpage_166_199_199[45] U8G_FONT_SECTION("fontpage_166_199_199") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x0d,0x00,0x71,0x00,0x11,0x00,0x11,0x00,0x11, + 0x00,0xff,0xc0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7f, @@ -209,10 +284,16 @@ const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x0f,0x80,0x08,0x00,0x08,0x00,0xff, 0xe0,0x08,0x00,0x0a,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_240_240[45] U8G_FONT_SECTION("fontpage_166_240_240") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, +const u8g_fntpgm_uint8_t fontpage_166_240_241[73] U8G_FONT_SECTION("fontpage_166_240_241") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf1,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0xe7,0xc0,0x84,0x40,0x84,0x40,0xf4, - 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xe5,0x80,0x84,0x00,0x04,0x00}; + 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xe5,0x80,0x84,0x00,0x04,0x00,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x21,0x00,0x7f,0xe0,0x20,0x00,0x2f,0x80,0x28, + 0x80,0x28,0x80,0x2b,0x20,0x48,0x20,0x87,0xe0}; +const u8g_fntpgm_uint8_t fontpage_166_244_244[45] U8G_FONT_SECTION("fontpage_166_244_244") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x11,0xe0,0x7d,0x20,0x11,0x20,0x11, + 0x20,0xff,0x20,0x11,0x20,0x21,0x20,0x4d,0x60,0x75,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7d,0xe0,0x91,0x20,0x11,0x20,0xff, @@ -221,10 +302,12 @@ const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x00,0x2f,0xc0,0x28,0x40,0x2f, 0xc0,0x28,0x40,0x2f,0xc0,0x22,0x00,0x2a,0x80,0x52,0x60,0xa6,0x20}; -const u8g_fntpgm_uint8_t fontpage_167_204_204[43] U8G_FONT_SECTION("fontpage_167_204_204") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x09,0xff,0x00, +const u8g_fntpgm_uint8_t fontpage_167_204_205[71] U8G_FONT_SECTION("fontpage_167_204_205") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x0a,0x40,0x4a,0x40,0x2a,0x40,0x11, - 0x40,0x11,0x40,0x28,0x80,0x45,0x80,0x82,0x40,0x04,0x20}; + 0x40,0x11,0x40,0x28,0x80,0x45,0x80,0x82,0x40,0x04,0x20,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x20,0x00,0x3f,0xc0,0x28,0x80,0x25,0x00,0x22, + 0x00,0x45,0x00,0x48,0x80,0xb0,0x60}; const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfc,0x00,0x4b,0xe0,0x4a,0x20,0x7a,0x20,0x49, @@ -237,18 +320,40 @@ const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xff, 0x80,0x00,0x80,0x7f,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7f,0x00}; +const u8g_fntpgm_uint8_t fontpage_168_131_131[45] U8G_FONT_SECTION("fontpage_168_131_131") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xf2,0x00,0x97,0xe0,0x98,0x00,0x97, + 0xc0,0x90,0x80,0x91,0x00,0xf2,0x00,0x94,0x20,0x04,0x20,0x03,0xe0}; const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, 0x60,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x20,0x80}; -const u8g_fntpgm_uint8_t fontpage_168_142_142[45] U8G_FONT_SECTION("fontpage_168_142_142") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x3f,0xe0,0x20, - 0x00,0x20,0x00,0x2f,0xc0,0x28,0x40,0x48,0x40,0x4f,0xc0,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_168_141_142[73] U8G_FONT_SECTION("fontpage_168_141_142") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0xc0,0x10,0x80,0x29,0x00,0x46, + 0x00,0x04,0x00,0x1f,0xc0,0xf0,0x40,0x10,0x40,0x10,0x40,0x1f,0xc0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x3f,0xe0,0x20,0x00,0x20,0x00,0x2f, + 0xc0,0x28,0x40,0x48,0x40,0x4f,0xc0,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_168_145_145[45] U8G_FONT_SECTION("fontpage_168_145_145") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x10,0x00,0xff,0xc0,0x80,0x40,0x9e, + 0x40,0x92,0x40,0x92,0x40,0x9e,0x40,0x80,0x40,0x80,0x40,0x81,0xc0}; +const u8g_fntpgm_uint8_t fontpage_168_166_166[45] U8G_FONT_SECTION("fontpage_168_166_166") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x0d,0x80,0x34,0x40,0xc4, + 0x20,0x04,0x00,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0,0x20,0x40}; const u8g_fntpgm_uint8_t fontpage_168_175_175[45] U8G_FONT_SECTION("fontpage_168_175_175") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f, 0xc0,0x20,0x00,0x3f,0xc0,0x30,0x40,0x50,0x40,0x5f,0xc0,0x90,0x40}; +const u8g_fntpgm_uint8_t fontpage_168_202_202[45] U8G_FONT_SECTION("fontpage_168_202_202") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, + 0x00,0xff,0xe0,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80}; +const u8g_fntpgm_uint8_t fontpage_168_232_232[45] U8G_FONT_SECTION("fontpage_168_232_232") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x20,0x2f,0xa0,0x22,0x20,0x3f, + 0xe0,0x20,0x20,0x2f,0xa0,0x28,0xa0,0x4f,0xa0,0x40,0x20,0x80,0x60}; const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0xee,0xe0,0x00, @@ -257,6 +362,10 @@ const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0c,0x00,0x70,0x00,0x11,0xe0,0xfd,0x20,0x11, 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xe0,0x10,0x00}; +const u8g_fntpgm_uint8_t fontpage_169_205_205[45] U8G_FONT_SECTION("fontpage_169_205_205") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x02,0x00,0xef,0xe0,0xa8,0x20,0xab, + 0xa0,0xaa,0xa0,0xaa,0xa0,0xeb,0xa0,0x08,0x20,0x08,0x20,0x08,0x60}; const u8g_fntpgm_uint8_t fontpage_171_183_183[45] U8G_FONT_SECTION("fontpage_171_183_183") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, @@ -265,6 +374,14 @@ const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0xa0,0xeb,0xc0,0xaa,0xa0,0xbf,0xe0,0xa4, 0x80,0xaf,0xe0,0xf9,0x20,0x0f,0xe0,0x09,0x20,0x0f,0xe0,0x11,0x20}; +const u8g_fntpgm_uint8_t fontpage_172_232_232[45] U8G_FONT_SECTION("fontpage_172_232_232") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7b,0xc0,0x04, + 0x80,0xff,0xe0,0x11,0x00,0xfb,0xe0,0x4a,0x40,0x4a,0x40,0x7b,0xc0}; +const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, + 0x40,0xa7,0xc0,0xe4,0x40,0x07,0xc0,0x04,0x40,0x07,0xc0,0x0c,0x60}; const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, @@ -273,6 +390,10 @@ const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x84,0x20,0x84,0x20,0xbf,0xa0,0x84, 0x20,0x84,0x20,0x8a,0x20,0x91,0x20,0xa0,0xa0,0x80,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_173_250_250[45] U8G_FONT_SECTION("fontpage_173_250_250") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x88,0x40,0x88,0x40,0xff,0x40,0x88, + 0x40,0xbe,0x40,0xa2,0x40,0xa2,0x40,0xbe,0x40,0x80,0x40,0xff,0xc0}; const u8g_fntpgm_uint8_t fontpage_173_254_254[45] U8G_FONT_SECTION("fontpage_173_254_254") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x90,0x40,0x9f,0x40,0xb2,0x40,0xcc, @@ -281,6 +402,10 @@ const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0xc0,0x10,0x00,0x22, 0x00,0x62,0x00,0xaf,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_174_207_207[45] U8G_FONT_SECTION("fontpage_174_207_207") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x2f,0xe0,0x20,0x80,0xf8,0x80,0x21, + 0x00,0x21,0x80,0x23,0x40,0x35,0x20,0xc9,0x20,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_174_215_215[45] U8G_FONT_SECTION("fontpage_174_215_215") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x27,0xc0,0xf9,0x40,0x21, @@ -331,6 +456,14 @@ const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, 0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_180_180[45] U8G_FONT_SECTION("fontpage_178_180_180") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x0a,0x00,0x22,0x00,0x12,0x00,0x02, + 0x00,0xff,0xe0,0x02,0x00,0x05,0x00,0x08,0x80,0x10,0x40,0x60,0x20}; +const u8g_fntpgm_uint8_t fontpage_178_253_253[45] U8G_FONT_SECTION("fontpage_178_253_253") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x23,0xe0,0xf8,0x40,0x28,0x80,0x28, + 0x80,0x4f,0xe0,0x50,0x80,0x30,0x80,0x28,0x80,0x48,0x80,0x83,0x80}; const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x2a,0x20,0x2f, @@ -359,6 +492,10 @@ const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x90,0x40,0x3f,0x00,0x52, 0x00,0x8c,0x00,0x33,0x00,0xff,0xc0,0x21,0x00,0x21,0x00,0x3f,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_171_171[45] U8G_FONT_SECTION("fontpage_183_171_171") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x80,0x40,0x3f,0x00,0x21, + 0x00,0x3f,0x00,0x00,0x00,0x7f,0x80,0x40,0x80,0x7f,0x80,0x40,0x80}; const u8g_fntpgm_uint8_t fontpage_183_185_185[45] U8G_FONT_SECTION("fontpage_183_185_185") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x91,0x20,0x24,0x80,0x4a, @@ -367,6 +504,10 @@ const u8g_fntpgm_uint8_t fontpage_183_249_249[45] U8G_FONT_SECTION("fontpage_183 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x00,0x80,0xf0,0x80,0x1f,0xe0,0x90,0x80,0x50, 0x80,0x24,0x80,0x22,0x80,0x50,0x80,0x50,0x80,0x82,0x80,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_134_134[45] U8G_FONT_SECTION("fontpage_184_134_134") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x27,0xc0,0xa4,0x80,0x6b,0x00,0x22, + 0x80,0x24,0x80,0x6f,0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, @@ -383,6 +524,10 @@ const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x09,0x00,0x00, 0x00,0x0b,0x09,0x12,0x0c,0x00,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_187_238_238[45] U8G_FONT_SECTION("fontpage_187_238_238") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x09,0x00,0xff,0xe0,0x04,0x00,0x7f, + 0xc0,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0x80,0x42,0x00,0xbf,0xe0}; const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x09,0xff,0x00, 0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0xff,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xff, @@ -415,6 +560,22 @@ const u8g_fntpgm_uint8_t fontpage_190_128_128[45] U8G_FONT_SECTION("fontpage_190 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x11,0x00,0x11,0x00,0x11,0x00,0x11, 0x00,0xff,0xe0,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_190_131_131[45] U8G_FONT_SECTION("fontpage_190_131_131") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x08,0x00,0x10,0x80,0x3f, + 0xc0,0x11,0x00,0xff,0xe0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_190_143_143[45] U8G_FONT_SECTION("fontpage_190_143_143") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x02,0x00,0xff,0xe0,0x02, + 0x00,0x7a,0x00,0x12,0x00,0x11,0x00,0x11,0x20,0x18,0xa0,0xe0,0x60}; +const u8g_fntpgm_uint8_t fontpage_190_149_149[45] U8G_FONT_SECTION("fontpage_190_149_149") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xfc,0x40,0x04,0x40,0x04,0x40,0x7c,0x40,0x40, + 0x40,0xfc,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x28,0x40,0x10,0x40}; +const u8g_fntpgm_uint8_t fontpage_190_185_185[45] U8G_FONT_SECTION("fontpage_190_185_185") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xe4,0x40,0x22,0x80,0x2f,0xe0,0xe9,0x20,0x8f, + 0xe0,0x89,0x20,0xef,0xe0,0x21,0x00,0x2f,0xe0,0xa1,0x00,0x41,0x00}; const u8g_fntpgm_uint8_t fontpage_190_210_210[45] U8G_FONT_SECTION("fontpage_190_210_210") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0x17,0xc0,0x90,0x40,0x90,0x40,0x90, @@ -425,6 +586,10 @@ const u8g_fntpgm_uint8_t fontpage_191_132_133[73] U8G_FONT_SECTION("fontpage_191 0x40,0x68,0x20,0xa7,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, 0x0c,0x00,0xff,0x11,0x00,0x21,0x00,0x47,0xc0,0x91,0x00,0x1f,0xe0,0x20,0x80,0x6f, 0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; +const u8g_fntpgm_uint8_t fontpage_191_170_170[45] U8G_FONT_SECTION("fontpage_191_170_170") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xe0,0x28,0x80,0x4f,0xe0,0x98,0x80,0x2b, + 0xe0,0x6a,0x20,0xab,0xe0,0x2a,0x20,0x2b,0xe0,0x2a,0x20,0x33,0xe0}; const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x6a,0x80,0xbe,0x80,0x01,0xe0,0x5d, @@ -433,6 +598,10 @@ const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, 0x40,0x50,0x20,0x50,0x20,0x50,0xa0,0x90,0x80,0x10,0x80,0x0f,0x80}; +const u8g_fntpgm_uint8_t fontpage_191_253_253[45] U8G_FONT_SECTION("fontpage_191_253_253") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x3f,0xc0,0x2a,0x40,0x4a,0x40,0x14, + 0x40,0x28,0x40,0x05,0x80,0x12,0x40,0x50,0xa0,0x50,0xa0,0x8f,0x80}; const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x00,0xb5,0x00,0xaf,0xe0,0xa9, @@ -449,10 +618,16 @@ const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20, 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x54,0x40,0x52,0xa0,0x8f,0x80}; -const u8g_fntpgm_uint8_t fontpage_196_144_144[45] U8G_FONT_SECTION("fontpage_196_144_144") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x7f,0xe0,0x42,0x00,0x42, - 0x00,0x7a,0x40,0x4a,0x40,0x4a,0x80,0x49,0x20,0x52,0xa0,0x84,0x60}; +const u8g_fntpgm_uint8_t fontpage_194_159_159[45] U8G_FONT_SECTION("fontpage_194_159_159") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x40,0x7f,0xe0,0x41,0x00,0x7f,0x40,0x5d, + 0x40,0x52,0x80,0x9d,0xa0,0x82,0x60,0x24,0x40,0xa2,0xa0,0x9f,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_143_144[73] U8G_FONT_SECTION("fontpage_196_143_144") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x7a,0x40,0x0a,0x00,0x4f,0xe0,0x2a, + 0x00,0x12,0x40,0x12,0x80,0x29,0x00,0x41,0x20,0x86,0xa0,0x00,0x60,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x7f,0xe0,0x42,0x00,0x42,0x00,0x7a,0x40,0x4a, + 0x40,0x4a,0x80,0x49,0x20,0x52,0xa0,0x84,0x60}; const u8g_fntpgm_uint8_t fontpage_196_183_183[45] U8G_FONT_SECTION("fontpage_196_183_183") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x3f,0xc0,0x20,0x40,0x20, @@ -485,6 +660,14 @@ const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0x22,0x40,0xf9,0x40,0x20,0x40,0x2a, 0x40,0x31,0x40,0x60,0xe0,0xaf,0x40,0x20,0x40,0x20,0x40,0xe0,0x40}; +const u8g_fntpgm_uint8_t fontpage_197_165_165[45] U8G_FONT_SECTION("fontpage_197_165_165") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x24,0x40,0xfc,0x40,0x25,0x80,0x2c, + 0x00,0x37,0xe0,0x65,0x40,0xa5,0x40,0x24,0x80,0x25,0x40,0xe6,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_172_172[45] U8G_FONT_SECTION("fontpage_197_172_172") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x27,0xa0,0x28, + 0x20,0x30,0x00,0x67,0xe0,0xa4,0x20,0x24,0x20,0x27,0xe0,0xe4,0x20}; const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x20,0x80,0xf8,0x80,0x27,0xe0,0x2c, @@ -509,6 +692,10 @@ const u8g_fntpgm_uint8_t fontpage_198_164_164[45] U8G_FONT_SECTION("fontpage_198 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0xfa,0x40,0x21,0x80,0x2e, 0x60,0x30,0x00,0x62,0x40,0xa2,0x40,0x22,0x40,0x24,0x40,0xe8,0x40}; +const u8g_fntpgm_uint8_t fontpage_198_223_223[45] U8G_FONT_SECTION("fontpage_198_223_223") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0x22,0x40,0xfb,0xc0,0x20,0x00,0x2f, + 0xe0,0x34,0x20,0x65,0x20,0xa5,0x20,0x25,0x20,0x22,0x80,0xec,0x60}; const u8g_fntpgm_uint8_t fontpage_198_226_226[45] U8G_FONT_SECTION("fontpage_198_226_226") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xfc,0x80,0x27,0xc0,0x2d, @@ -521,10 +708,18 @@ const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x28,0x20,0xf2,0x80,0x24,0x40,0x29, 0x20,0x31,0x00,0x6f,0xe0,0xa1,0x00,0x25,0x80,0x29,0x40,0xf1,0x20}; +const u8g_fntpgm_uint8_t fontpage_199_165_165[45] U8G_FONT_SECTION("fontpage_199_165_165") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf4,0x40,0x22,0x80,0x2f, + 0xe0,0x31,0x00,0x6f,0xe0,0xa2,0x40,0x26,0x80,0x21,0x40,0xee,0x20}; const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf8,0x20,0x22,0x80,0x24, 0x40,0x38,0x20,0x67,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_199_208_208[45] U8G_FONT_SECTION("fontpage_199_208_208") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x24,0x40,0xff,0xc0,0x24,0x40,0x27, + 0xc0,0x30,0x00,0x6f,0xe0,0xa5,0x00,0x25,0xe0,0x2b,0x00,0xf1,0xe0}; const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xf1,0x00,0x2f,0xe0,0x21, @@ -541,10 +736,18 @@ const u8g_fntpgm_uint8_t fontpage_202_240_240[45] U8G_FONT_SECTION("fontpage_202 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x95,0x00,0x59,0x00,0xfd,0xe0,0x33,0x40,0x59, 0x40,0x95,0x40,0xfd,0x40,0x29,0x40,0x68,0x80,0x11,0x40,0xee,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_242_242[45] U8G_FONT_SECTION("fontpage_202_242_242") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0xfe,0xe0,0x00,0x80,0x78,0x80,0x4b, + 0xe0,0x79,0x40,0x01,0x40,0xff,0x40,0xaa,0x80,0xbb,0x40,0x86,0x20}; const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x55,0x40,0x7c,0x80,0x39, 0x40,0x56,0x20,0x7f,0xc0,0x04,0x00,0x27,0x80,0x24,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_203_135_135[45] U8G_FONT_SECTION("fontpage_203_135_135") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x11,0x00,0x11, + 0x00,0x11,0x00,0x0a,0x00,0x0a,0x00,0x04,0x00,0x1b,0x00,0xe0,0xe0}; const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xac,0x80,0x72,0x80,0x20,0x80,0xfc, @@ -553,10 +756,18 @@ const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x40,0x29,0x40,0x44,0xc0,0xb8,0x40,0x12, 0x40,0x7d,0x40,0x10,0x60,0x55,0xc0,0x52,0x40,0x92,0x40,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_173_173[45] U8G_FONT_SECTION("fontpage_203_173_173") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xd5,0x80,0xb9,0x00,0x91,0x00,0xfd, + 0xe0,0xb1,0x40,0xd9,0x40,0xd5,0x40,0x91,0x40,0xfa,0x40,0x04,0x40}; const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xfd,0x80,0x45,0x00,0x29,0x00,0xfd, 0xe0,0x11,0x40,0xfd,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_185_185[45] U8G_FONT_SECTION("fontpage_203_185_185") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x08,0x00,0x08, + 0x00,0x0f,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; const u8g_fntpgm_uint8_t fontpage_203_224_224[45] U8G_FONT_SECTION("fontpage_203_224_224") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, @@ -569,6 +780,10 @@ const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xe0,0xf2,0x20,0x92,0x20,0x93,0xe0,0xf2, 0x20,0x92,0x20,0x93,0xe0,0xf2,0x20,0x04,0x20,0x08,0xa0,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_204_175_175[45] U8G_FONT_SECTION("fontpage_204_175_175") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f, + 0x80,0x00,0x00,0xff,0xe0,0x24,0x00,0x27,0x80,0x54,0x00,0x8f,0xe0}; const u8g_fntpgm_uint8_t fontpage_205_130_130[45] U8G_FONT_SECTION("fontpage_205_130_130") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0xfb,0x80,0x52,0x00,0xfb,0xe0,0x12, @@ -589,6 +804,10 @@ const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x1f,0x80,0x30, 0x80,0x5f,0x80,0x90,0x80,0x1f,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; +const u8g_fntpgm_uint8_t fontpage_206_159_159[45] U8G_FONT_SECTION("fontpage_206_159_159") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x49,0xe0,0xfd,0x20,0x49,0x20,0x79,0xe0,0x49, + 0x20,0x79,0x20,0x49,0xe0,0xfd,0x20,0x01,0x20,0x49,0x20,0x86,0x60}; const u8g_fntpgm_uint8_t fontpage_206_186_186[45] U8G_FONT_SECTION("fontpage_206_186_186") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0x80,0x24,0x80,0xfc,0x80,0x24, @@ -597,6 +816,10 @@ const u8g_fntpgm_uint8_t fontpage_206_192_192[45] U8G_FONT_SECTION("fontpage_206 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x19,0x00,0x06,0x00,0x19,0x00,0x64, 0xc0,0x04,0x00,0xff,0xe0,0x15,0x00,0x24,0x80,0xc4,0x60,0x0c,0x00}; +const u8g_fntpgm_uint8_t fontpage_206_223_223[45] U8G_FONT_SECTION("fontpage_206_223_223") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x24, + 0x80,0x24,0x80,0x3f,0x80,0x0e,0x00,0x15,0x00,0x24,0x80,0xc4,0x60}; const u8g_fntpgm_uint8_t fontpage_206_225_225[45] U8G_FONT_SECTION("fontpage_206_225_225") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x29,0x00,0x46,0x00,0x0a, @@ -621,6 +844,10 @@ const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x40,0x2a,0x80,0x21, 0x00,0x72,0x80,0x6c,0x60,0xa7,0xc0,0x24,0x40,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_209_175_175[45] U8G_FONT_SECTION("fontpage_209_175_175") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x40,0x22,0x80,0x27,0xc0,0xf9,0x40,0x27, + 0xc0,0x75,0x00,0x6f,0xe0,0xa3,0x20,0x25,0x20,0x29,0xc0,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_209_192_192[45] U8G_FONT_SECTION("fontpage_209_192_192") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x22,0x80,0xfc,0x40,0x28,0x20,0x27, @@ -629,6 +856,10 @@ const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xfa,0xa0,0x2f,0xe0,0x2a, 0xa0,0x3f,0xe0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x27,0xc0,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_212_161_161[45] U8G_FONT_SECTION("fontpage_212_161_161") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xf2,0x80,0x27,0xc0,0x34, + 0x40,0x6f,0xc0,0x64,0x40,0xaf,0xe0,0x21,0x00,0x22,0x80,0x2c,0x60}; const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0x40,0x2a,0xa0,0xf4,0x40,0x27,0xc0,0x38, @@ -655,10 +886,22 @@ const u8g_fntpgm_uint8_t fontpage_217_226_226[45] U8G_FONT_SECTION("fontpage_217 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x8f,0xe0,0x49,0x20,0x19, 0x00,0x2f,0xc0,0x28,0x40,0xca,0x80,0x49,0x00,0x52,0x80,0x6c,0x60}; +const u8g_fntpgm_uint8_t fontpage_217_232_232[45] U8G_FONT_SECTION("fontpage_217_232_232") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x21,0x00,0x8f,0xe0,0x51,0x00,0x11, + 0x00,0x21,0x00,0x27,0xc0,0xc1,0x00,0x41,0x00,0x41,0x00,0x4f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_218_151_151[45] U8G_FONT_SECTION("fontpage_218_151_151") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x00,0x87,0xc0,0x49,0x00,0x21, + 0x00,0x3f,0xe0,0x42,0x80,0xc2,0x80,0x44,0xa0,0x48,0xa0,0x50,0xe0}; const u8g_fntpgm_uint8_t fontpage_218_187_187[45] U8G_FONT_SECTION("fontpage_218_187_187") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x81,0x00,0x5f,0xe0,0x11, 0x00,0x21,0x00,0x27,0xc0,0xc4,0x40,0x44,0x40,0x47,0xc0,0x44,0x40}; +const u8g_fntpgm_uint8_t fontpage_218_193_193[45] U8G_FONT_SECTION("fontpage_218_193_193") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x5f,0xe0,0x04,0x00,0x88,0x80,0x5f, + 0xc0,0x20,0x40,0x2a,0x80,0xca,0x80,0x4a,0xa0,0x4a,0xa0,0x52,0x60}; const u8g_fntpgm_uint8_t fontpage_218_203_203[45] U8G_FONT_SECTION("fontpage_218_203_203") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xbe,0x20,0x62,0xa0,0x2a,0xa0,0xaa,0xa0,0x6a, @@ -671,6 +914,10 @@ const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, 0x40,0x29,0x20,0x25,0x40,0xc5,0x80,0x49,0x00,0x42,0x80,0x5c,0x60}; +const u8g_fntpgm_uint8_t fontpage_219_247_247[45] U8G_FONT_SECTION("fontpage_219_247_247") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xc0,0x28,0x40,0x0f,0xc0,0x88,0x40,0x5f, + 0xc0,0x29,0x20,0x29,0x40,0xcf,0x80,0x49,0x20,0x4b,0x20,0x4c,0xe0}; const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x01,0x00,0x97,0xc0,0x51, @@ -679,10 +926,22 @@ const u8g_fntpgm_uint8_t fontpage_220_169_169[45] U8G_FONT_SECTION("fontpage_220 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x07,0xc0,0x94,0x40,0x57, 0xc0,0x20,0x00,0x2f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_220_184_184[45] U8G_FONT_SECTION("fontpage_220_184_184") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb8,0xb8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x48,0x80,0x24,0xe0,0x1f,0x00,0x88,0xe0,0x5e, + 0x20,0x2a,0x40,0x2b,0xe0,0xca,0x40,0x4a,0x40,0x52,0x40,0x66,0xc0}; const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x80,0x8b,0xe0,0x4a,0x20,0x1b, 0xe0,0x2a,0x20,0x2b,0xe0,0xc8,0x80,0x4a,0xc0,0x54,0xa0,0x69,0xa0}; +const u8g_fntpgm_uint8_t fontpage_221_162_162[45] U8G_FONT_SECTION("fontpage_221_162_162") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x40,0x22,0x80,0x0f,0xe0,0x82,0x80,0x44, + 0x40,0x28,0x20,0x3f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_221_209_209[45] U8G_FONT_SECTION("fontpage_221_209_209") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x07,0x40,0x85,0x40,0x5f, + 0xe0,0x34,0x60,0x27,0xc0,0xc4,0x40,0x47,0xc0,0x44,0x40,0x44,0xc0}; const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53, @@ -703,6 +962,10 @@ const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x21,0x00,0x3f,0xe0,0x20, 0x00,0x20,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_228_233_233[45] U8G_FONT_SECTION("fontpage_228_233_233") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xa2,0x00,0xa7,0xe0,0xfa,0xa0,0xa2, + 0xa0,0x32,0xa0,0x64,0xa0,0xa9,0x20,0x22,0x20,0x25,0x20,0x28,0xc0}; const u8g_fntpgm_uint8_t fontpage_228_249_249[45] U8G_FONT_SECTION("fontpage_228_249_249") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xa7,0xc0,0xf1,0x00,0xa1,0x00,0xaf, @@ -711,6 +974,10 @@ const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x88,0x40,0x52,0x80,0x0c, 0x00,0x2a,0x80,0xdf,0x40,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_231_175_175[45] U8G_FONT_SECTION("fontpage_231_175_175") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x21,0x00,0x23,0x00,0x73, + 0x80,0x25,0x40,0x25,0x20,0x39,0x20,0xc1,0x00,0x01,0x00,0x01,0x00}; const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x44,0x40,0x7f,0xc0,0x44, @@ -719,6 +986,10 @@ const u8g_fntpgm_uint8_t fontpage_234_181_181[45] U8G_FONT_SECTION("fontpage_234 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb5,0xb5,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0xff, 0x80,0x88,0x80,0x88,0x80,0xff,0x80,0x08,0x40,0x08,0x40,0x07,0xc0}; +const u8g_fntpgm_uint8_t fontpage_234_229_229[45] U8G_FONT_SECTION("fontpage_234_229_229") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xfb,0xc0,0xae,0x40,0xa9,0x80,0xfa, + 0x40,0xac,0x20,0xab,0xc0,0xaa,0x40,0xfa,0x40,0x8b,0xc0,0x02,0x40}; const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, 0x00,0x08,0x0b,0x0b,0x0c,0x02,0xff,0x10,0x20,0xff,0x81,0x81,0xff,0x81,0x81,0x81, @@ -727,6 +998,10 @@ const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x22,0x00,0x42,0x00,0xf7,0xc0,0x98,0x40,0x90, 0x40,0xf4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xf0,0x40,0x91,0x80}; +const u8g_fntpgm_uint8_t fontpage_237_209_209[45] U8G_FONT_SECTION("fontpage_237_209_209") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x4a,0x00,0x4b,0xe0,0x4a,0x00,0x4c, + 0x80,0x48,0x40,0x08,0x00,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20, @@ -743,6 +1018,10 @@ const u8g_fntpgm_uint8_t fontpage_240_238_238[45] U8G_FONT_SECTION("fontpage_240 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xf3,0xc0,0x24,0x80,0x4f,0xe0,0xf5, 0x20,0x57,0xe0,0x55,0x20,0x57,0xe0,0x75,0x20,0x45,0x20,0x08,0x60}; +const u8g_fntpgm_uint8_t fontpage_243_187_187[45] U8G_FONT_SECTION("fontpage_243_187_187") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x2a,0x80,0x24,0x80,0x2a, + 0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x49,0x40,0x5f,0x40,0x40,0xc0}; const u8g_fntpgm_uint8_t fontpage_243_239_239[45] U8G_FONT_SECTION("fontpage_243_239_239") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0xe3,0xe0,0x22,0x20,0xfa,0x20,0x22, @@ -751,22 +1030,42 @@ const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xe3,0xe0,0x24,0x20,0xfa,0x40,0x21, 0x80,0x36,0x80,0x29,0xe0,0x62,0x20,0xa5,0x40,0x20,0x80,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_244_250_250[45] U8G_FONT_SECTION("fontpage_244_250_250") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x89,0x00,0x10, + 0x80,0x60,0x40,0x1f,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x7f,0xe0}; const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x45,0x20,0xf7,0xe0,0x00,0x00,0xaf, 0xe0,0xa1,0x00,0xaf,0xe0,0x4a,0xa0,0x6a,0xa0,0x8a,0xa0,0x08,0x60}; +const u8g_fntpgm_uint8_t fontpage_246_172_172[45] U8G_FONT_SECTION("fontpage_246_172_172") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x54,0x80,0xbf,0xc0,0x04, + 0x40,0x7f,0xc0,0x44,0x00,0x7f,0xe0,0x14,0x20,0x24,0xc0,0xc4,0x00}; const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x7f,0xc0,0x04, 0x00,0xff,0xe0,0x01,0x00,0x7f,0xc0,0x11,0x00,0x09,0x00,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_247_128_128[45] U8G_FONT_SECTION("fontpage_247_128_128") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x27,0xc0,0x50, + 0x40,0x4f,0x40,0x49,0x40,0x4f,0x40,0x49,0x40,0x4f,0x40,0x40,0xc0}; const u8g_fntpgm_uint8_t fontpage_247_161_161[45] U8G_FONT_SECTION("fontpage_247_161_161") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x52,0x80,0xff,0xe0,0x80, 0x20,0x3f,0x80,0x20,0x80,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_247_177_177[45] U8G_FONT_SECTION("fontpage_247_177_177") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x4a,0x80,0x94,0x40,0x7f, + 0xc0,0x12,0x40,0x3b,0xc0,0x56,0x40,0x93,0xc0,0x12,0x40,0x13,0xc0}; const u8g_fntpgm_uint8_t fontpage_248_251_251[45] U8G_FONT_SECTION("fontpage_248_251_251") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x15,0x00,0xff,0xe0,0x15,0x00,0x24, 0x80,0x40,0x40,0x04,0x00,0xff,0xe0,0x0a,0x00,0x11,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_250_162_162[45] U8G_FONT_SECTION("fontpage_250_162_162") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x91, + 0x20,0x3e,0x00,0x08,0x80,0x7f,0xc0,0x04,0x40,0x24,0x80,0xcc,0x60}; const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x51,0x40,0x5d,0x80,0x51,0x20,0xfd, @@ -775,6 +1074,10 @@ const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xc0,0x41,0x00,0x51,0x00,0xe1, 0x00,0x21,0x00,0x41,0x00,0xf1,0x00,0x01,0x00,0x31,0x00,0xcf,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_167_167[45] U8G_FONT_SECTION("fontpage_253_167_167") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xc0,0x22,0x40,0x4a,0x40,0x52,0x80,0xe2, + 0xe0,0x22,0x20,0x42,0x20,0xf5,0x40,0x0c,0x80,0x35,0x40,0xca,0x20}; const u8g_fntpgm_uint8_t fontpage_253_191_191[45] U8G_FONT_SECTION("fontpage_253_191_191") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0x43,0xc0,0x4e,0x00,0xe3, @@ -787,6 +1090,14 @@ const u8g_fntpgm_uint8_t fontpage_253_200_200[45] U8G_FONT_SECTION("fontpage_253 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0x54,0x40,0xea,0x80,0x21, 0x00,0x42,0x80,0xec,0x60,0x01,0x00,0x30,0xc0,0xc3,0x00,0x00,0xc0}; +const u8g_fntpgm_uint8_t fontpage_253_211_211[45] U8G_FONT_SECTION("fontpage_253_211_211") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x4f,0xe0,0x51,0x00,0xe7, + 0xc0,0x20,0x00,0x47,0xc0,0xf4,0x40,0x0c,0x40,0x37,0xc0,0xc4,0x40}; +const u8g_fntpgm_uint8_t fontpage_253_217_217[45] U8G_FONT_SECTION("fontpage_253_217_217") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x42,0x80,0x54,0x40,0xe8, + 0x20,0x27,0xc0,0x40,0x00,0xf7,0xc0,0x0c,0x40,0x34,0x40,0xc7,0xc0}; const u8g_fntpgm_uint8_t fontpage_253_223_223[45] U8G_FONT_SECTION("fontpage_253_223_223") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x42,0x00,0x54,0x40,0xef, @@ -827,10 +1138,18 @@ const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x49,0x20,0x7f,0xe0,0x04,0x40,0x3f, 0x80,0x05,0x00,0xff,0xe0,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_256_133_133[45] U8G_FONT_SECTION("fontpage_256_133_133") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x3f,0x40,0x04,0x80,0x05,0x00,0xff, + 0xe0,0x08,0x00,0x3f,0x80,0xd0,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80}; const u8g_fntpgm_uint8_t fontpage_256_234_234[45] U8G_FONT_SECTION("fontpage_256_234_234") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x40,0xfa,0x80,0x57,0xc0,0x54,0x40,0x74, 0x40,0x57,0xc0,0x71,0x00,0x5a,0xa0,0xf6,0xa0,0x1a,0x40,0x11,0xc0}; +const u8g_fntpgm_uint8_t fontpage_257_253_253[45] U8G_FONT_SECTION("fontpage_257_253_253") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x49,0x40,0xfd,0x80,0x01,0x20,0x7d, + 0xe0,0x44,0x00,0x7d,0x40,0x45,0x80,0x7d,0x20,0x45,0x20,0x4d,0xe0}; const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, 0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82, @@ -843,6 +1162,10 @@ const u8g_fntpgm_uint8_t fontpage_265_221_221[45] U8G_FONT_SECTION("fontpage_265 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x52,0x00,0x53, 0xc0,0x55,0x00,0x10,0x80,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_269_199_199[45] U8G_FONT_SECTION("fontpage_269_199_199") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0x27,0xe0,0xfc,0x20,0xaa, + 0x00,0xaa,0x40,0xfb,0x80,0x22,0x00,0x2a,0x20,0x3a,0x20,0xc9,0xe0}; const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x40,0x00,0x80,0x00,0x10,0x00,0x2f, @@ -855,6 +1178,10 @@ const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x9f,0xe0,0x51,0x00,0x31,0x00,0xd7, 0xc0,0x12,0x00,0xff,0xe0,0x0c,0x40,0x32,0x80,0xd1,0x00,0x18,0xe0}; +const u8g_fntpgm_uint8_t fontpage_275_129_129[45] U8G_FONT_SECTION("fontpage_275_129_129") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x0a,0x00,0x7f,0xc0,0x4a,0x40,0x7f, + 0xc0,0x08,0x00,0xff,0xe0,0x11,0x00,0x3a,0x00,0x0f,0x00,0x70,0xc0}; const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x00,0x22,0x00,0x7f,0xc0,0xa4, @@ -883,6 +1210,10 @@ const u8g_fntpgm_uint8_t fontpage_279_247_247[45] U8G_FONT_SECTION("fontpage_279 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x21,0x00,0x07,0xc0,0xe1, 0x00,0x2f,0xe0,0x24,0x40,0x27,0xc0,0x24,0x40,0x37,0xc0,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_279_251_251[45] U8G_FONT_SECTION("fontpage_279_251_251") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x27,0xc0,0x01,0x00,0xef,0xe0,0x22, + 0xa0,0x25,0x80,0x22,0x80,0x2f,0xe0,0x31,0x80,0x22,0x40,0x0c,0x20}; const u8g_fntpgm_uint8_t fontpage_280_131_131[45] U8G_FONT_SECTION("fontpage_280_131_131") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x29,0x20,0x0b,0xa0,0xe9,0x20,0x2f, @@ -891,6 +1222,30 @@ const u8g_fntpgm_uint8_t fontpage_282_165_165[45] U8G_FONT_SECTION("fontpage_282 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x89,0x00,0xa9,0xe0,0xa9,0x40,0xab, 0x40,0xad,0x40,0xa9,0x40,0x21,0x40,0x50,0x80,0x49,0x40,0x8a,0x20}; +const u8g_fntpgm_uint8_t fontpage_282_170_170[45] U8G_FONT_SECTION("fontpage_282_170_170") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x35,0x80,0xdf,0x60,0x01, + 0x00,0x3f,0x80,0x24,0x80,0x24,0x80,0x2a,0x80,0x11,0x00,0x60,0xc0}; +const u8g_fntpgm_uint8_t fontpage_282_247_247[45] U8G_FONT_SECTION("fontpage_282_247_247") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x13,0xc0,0x7c,0x40,0x10,0x40,0xff, + 0xc0,0x12,0x00,0x52,0x20,0x5e,0x20,0x53,0xe0,0xb0,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_283_133_133[45] U8G_FONT_SECTION("fontpage_283_133_133") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x11,0x40,0x7d,0x40,0x12,0xc0,0xfc, + 0x00,0x13,0xc0,0x5e,0x40,0x52,0x40,0x73,0xc0,0x98,0x00,0x87,0xe0}; +const u8g_fntpgm_uint8_t fontpage_283_221_221[45] U8G_FONT_SECTION("fontpage_283_221_221") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xe0,0x4a,0x00,0x4a,0x00,0x7b,0xe0,0x12, + 0x20,0x52,0x20,0x5a,0x20,0x53,0xe0,0x52,0x00,0x5e,0x00,0xe3,0xe0}; +const u8g_fntpgm_uint8_t fontpage_286_236_236[45] U8G_FONT_SECTION("fontpage_286_236_236") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xec,0xec,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xf7,0xc0,0x41,0x00,0x6f,0xe0,0xa2, + 0x00,0xf7,0xc0,0x20,0x40,0x3a,0x80,0xe1,0x00,0x20,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_286_239_239[45] U8G_FONT_SECTION("fontpage_286_239_239") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x42,0x00,0xfb,0xe0,0x42,0x20,0xa5, + 0x40,0xf9,0x00,0x21,0x00,0x3a,0x80,0xe2,0x80,0x24,0x40,0x28,0x20}; const u8g_fntpgm_uint8_t fontpage_286_244_244[45] U8G_FONT_SECTION("fontpage_286_244_244") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xf8,0x80,0x47,0xe0,0x64,0xa0,0xa4, @@ -929,6 +1284,14 @@ const u8g_fntpgm_uint8_t fontpage_287_219_219[45] U8G_FONT_SECTION("fontpage_287 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x24,0x80,0x2f,0xc0,0x04,0x80,0xe4, 0x80,0x3f,0xe0,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x80,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_222_222[45] U8G_FONT_SECTION("fontpage_287_222_222") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x2f,0xe0,0x22,0x00,0x05,0x00,0xef, + 0xc0,0x21,0x00,0x2f,0xe0,0x21,0x00,0x21,0x00,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_247_247[45] U8G_FONT_SECTION("fontpage_287_247_247") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x29,0x20,0x25,0x40,0x01,0x00,0xef, + 0xe0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8f,0xe0}; const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x8f,0xc0,0x48,0x40,0x4f,0xc0,0x08,0x40,0xcf, @@ -945,6 +1308,10 @@ const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x20,0x45,0x20,0x29,0x40,0xff, 0x80,0x01,0x40,0x7d,0x20,0x45,0x20,0x45,0xa0,0x7d,0x40,0x45,0x00}; +const u8g_fntpgm_uint8_t fontpage_290_205_205[45] U8G_FONT_SECTION("fontpage_290_205_205") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x50,0x20,0x50,0x20,0xf8,0x20,0xab, + 0xe0,0xda,0x00,0x8a,0x00,0xfa,0x00,0x8a,0x20,0xfa,0x20,0x8b,0xe0}; const u8g_fntpgm_uint8_t fontpage_291_202_202[45] U8G_FONT_SECTION("fontpage_291_202_202") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xc0,0xe2,0x80,0xa9,0x00,0x72,0x80,0xfd, @@ -969,10 +1336,10 @@ const u8g_fntpgm_uint8_t fontpage_298_153_153[45] U8G_FONT_SECTION("fontpage_298 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x80,0x4f,0xe0,0x72,0x80,0x82,0x80,0xef, 0xe0,0x40,0x00,0xf7,0xc0,0x44,0x40,0x47,0xc0,0x54,0x40,0x67,0xc0}; -const u8g_fntpgm_uint8_t fontpage_298_174_174[45] U8G_FONT_SECTION("fontpage_298_174_174") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x5c,0x80,0x47,0xe0,0x68,0xa0,0x8b,0xe0,0xfc, - 0xa0,0x47,0xe0,0xe4,0x80,0x57,0xe0,0x48,0x80,0x6c,0x80,0x53,0xe0}; +const u8g_fntpgm_uint8_t fontpage_298_220_220[45] U8G_FONT_SECTION("fontpage_298_220_220") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x4f,0xe0,0x72,0x80,0x8f,0xe0,0xf4, + 0x40,0x27,0xc0,0xf4,0x40,0x27,0xc0,0x2a,0x80,0x32,0xa0,0x2c,0x60}; const u8g_fntpgm_uint8_t fontpage_298_255_255[45] U8G_FONT_SECTION("fontpage_298_255_255") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x21,0x00,0x22,0x00,0x24,0x00,0x28,0x00,0x30, @@ -981,10 +1348,18 @@ const u8g_fntpgm_uint8_t fontpage_299_237_237[45] U8G_FONT_SECTION("fontpage_299 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xe0,0x20,0x20,0x82,0x20,0x82,0x20,0xbf, 0xa0,0x86,0x20,0x8a,0x20,0x92,0x20,0xa2,0x20,0x86,0x20,0x80,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_242_242[45] U8G_FONT_SECTION("fontpage_299_242_242") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x20,0x20,0x84,0x20,0x84,0x20,0xbf, + 0xa0,0x84,0x20,0x8e,0x20,0x95,0x20,0xa4,0xa0,0x84,0x20,0x80,0xe0}; const u8g_fntpgm_uint8_t fontpage_299_244_244[45] U8G_FONT_SECTION("fontpage_299_244_244") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x4f,0xc0,0x20,0x40,0x80,0x40,0x9e,0x40,0x92, 0x40,0x9e,0x40,0x92,0x40,0x92,0x40,0x9e,0x40,0x80,0x40,0x81,0xc0}; +const u8g_fntpgm_uint8_t fontpage_300_136_136[45] U8G_FONT_SECTION("fontpage_300_136_136") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xe0,0x11,0x20,0x82,0xa0,0xbf,0xe0,0x82, + 0x20,0xba,0xa0,0xaa,0xa0,0xb9,0x20,0x81,0x20,0xba,0xa0,0x84,0x60}; const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6, @@ -993,6 +1368,18 @@ const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1, 0x00,0x9f,0xe0,0x91,0x00,0xe5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; +const u8g_fntpgm_uint8_t fontpage_300_233_233[45] U8G_FONT_SECTION("fontpage_300_233_233") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xc8,0x20,0xa7, + 0xc0,0x90,0x00,0x9a,0x40,0xd5,0x40,0xa5,0x40,0x80,0x80,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_301_246_246[45] U8G_FONT_SECTION("fontpage_301_246_246") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x95,0x20,0x0e, + 0x00,0x31,0x80,0xc4,0x60,0x3f,0x80,0x01,0x00,0x0e,0x00,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_302_128_128[45] U8G_FONT_SECTION("fontpage_302_128_128") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0xb5,0xa0,0x04, + 0x00,0xff,0xe0,0x08,0x00,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0x4a,0xc0}; const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, @@ -1001,6 +1388,18 @@ const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a, 0x00,0x7b,0xc0,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a,0x00}; +const u8g_fntpgm_uint8_t fontpage_302_224_224[45] U8G_FONT_SECTION("fontpage_302_224_224") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x3f,0xc0,0x44,0x00,0xff,0xe0,0x20, + 0x80,0x3f,0x80,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0xfb,0xe0,0x0a,0x00}; +const u8g_fntpgm_uint8_t fontpage_302_226_226[45] U8G_FONT_SECTION("fontpage_302_226_226") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x08,0x00,0x10,0x00,0xff,0xc0,0x92, + 0x40,0x9e,0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0xff,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_304_245_245[45] U8G_FONT_SECTION("fontpage_304_245_245") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20,0x80,0x24, + 0x80,0x24,0x80,0x24,0x80,0x26,0x80,0x09,0x00,0x10,0xc0,0x60,0x40}; const u8g_fntpgm_uint8_t fontpage_304_249_249[45] U8G_FONT_SECTION("fontpage_304_249_249") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x27,0xe0,0x24,0x20,0x25, @@ -1009,6 +1408,10 @@ const u8g_fntpgm_uint8_t fontpage_305_132_132[45] U8G_FONT_SECTION("fontpage_305 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x10,0x80,0x63,0xe0,0x22,0x20,0xfa, 0xa0,0x2a,0xa0,0x22,0xa0,0x22,0xa0,0x22,0xa0,0x21,0x40,0x66,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_145_145[45] U8G_FONT_SECTION("fontpage_305_145_145") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x13,0xe0,0x50,0x80,0x5f,0xe0,0x52,0x20,0xfe, + 0xa0,0x12,0xa0,0x56,0xa0,0x5a,0xa0,0x92,0xa0,0x21,0x40,0xc6,0x20}; const u8g_fntpgm_uint8_t fontpage_305_157_157[45] U8G_FONT_SECTION("fontpage_305_157_157") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xe0,0xfc,0x80,0x87,0xe0,0x7a,0x20,0xca, @@ -1033,79 +1436,115 @@ const u8g_fntpgm_uint8_t fontpage_317_196_196[45] U8G_FONT_SECTION("fontpage_317 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7f,0xc0,0x11,0x00,0xff,0xe0,0x04, 0x00,0x3f,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80,0x60,0xc0}; +const u8g_fntpgm_uint8_t fontpage_317_222_222[45] U8G_FONT_SECTION("fontpage_317_222_222") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf8,0x80,0xa8,0x80,0xf8,0xe0,0xa8,0x80,0xf8, + 0x80,0x23,0xe0,0xfa,0x20,0x22,0x20,0xfa,0x20,0x52,0x20,0xab,0xe0}; +const u8g_fntpgm_uint8_t fontpage_318_208_208[45] U8G_FONT_SECTION("fontpage_318_208_208") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x10,0x80,0x09,0x00,0x06, + 0x00,0x19,0x80,0xe0,0x60,0x09,0x00,0x09,0x00,0x11,0x00,0x61,0x00}; const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x08,0x00,0x00, 0x00,0x02,0x07,0x07,0x0c,0x06,0x01,0xc0,0xc0,0x00,0x00,0x00,0xc0,0xc0}; #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(64, 157, 157, fontpage_64_157_157), // 'â€' -- 'â€' FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' FONTDATA_ITEM(156, 141, 141, fontpage_156_141_141), // 'ä¸' -- 'ä¸' + FONTDATA_ITEM(156, 147, 147, fontpage_156_147_147), // '专' -- '专' FONTDATA_ITEM(156, 157, 157, fontpage_156_157_157), // 'ä¸' -- 'ä¸' FONTDATA_ITEM(156, 170, 170, fontpage_156_170_170), // '个' -- '个' FONTDATA_ITEM(156, 173, 173, fontpage_156_173_173), // '中' -- '中' - FONTDATA_ITEM(156, 187, 187, fontpage_156_187_187), // '主' -- '主' + FONTDATA_ITEM(156, 186, 187, fontpage_156_186_187), // '为' -- '主' + FONTDATA_ITEM(156, 201, 201, fontpage_156_201_201), // '义' -- '义' FONTDATA_ITEM(156, 203, 203, fontpage_156_203_203), // '之' -- '之' FONTDATA_ITEM(157, 134, 134, fontpage_157_134_134), // '了' -- '了' + FONTDATA_ITEM(157, 140, 140, fontpage_157_140_140), // '二' -- '二' FONTDATA_ITEM(157, 142, 142, fontpage_157_142_142), // '于' -- '于' + FONTDATA_ITEM(157, 164, 164, fontpage_157_164_164), // '交' -- '交' FONTDATA_ITEM(157, 174, 174, fontpage_157_174_174), // '亮' -- '亮' FONTDATA_ITEM(157, 206, 206, fontpage_157_206_206), // '从' -- '从' - FONTDATA_ITEM(157, 228, 228, fontpage_157_228_228), // '令' -- '令' + FONTDATA_ITEM(157, 228, 229, fontpage_157_228_229), // '令' -- '以' + FONTDATA_ITEM(157, 246, 246, fontpage_157_246_246), // '件' -- '件' FONTDATA_ITEM(157, 253, 253, fontpage_157_253_253), // '份' -- '份' FONTDATA_ITEM(158, 145, 145, fontpage_158_145_145), // '休' -- '休' + FONTDATA_ITEM(158, 160, 160, fontpage_158_160_160), // 'ä¼ ' -- 'ä¼ ' FONTDATA_ITEM(158, 205, 206, fontpage_158_205_206), // 'ä½' -- '低' + FONTDATA_ITEM(158, 211, 211, fontpage_158_211_211), // '体' -- '体' + FONTDATA_ITEM(158, 217, 217, fontpage_158_217_217), // 'ä½™' -- 'ä½™' FONTDATA_ITEM(158, 220, 220, fontpage_158_220_220), // '作' -- '作' + FONTDATA_ITEM(158, 255, 255, fontpage_158_255_255), // '使' -- '使' FONTDATA_ITEM(159, 155, 155, fontpage_159_155_155), // 'ä¾›' -- 'ä¾›' + FONTDATA_ITEM(159, 181, 181, fontpage_159_181_181), // 'ä¾µ' -- 'ä¾µ' FONTDATA_ITEM(159, 221, 221, fontpage_159_221_221), // 'ä¿' -- 'ä¿' FONTDATA_ITEM(159, 225, 225, fontpage_159_225_225), // 'ä¿¡' -- 'ä¿¡' FONTDATA_ITEM(160, 188, 188, fontpage_160_188_188), // '值' -- '值' + FONTDATA_ITEM(160, 190, 190, fontpage_160_190_190), // '倾' -- '倾' FONTDATA_ITEM(160, 207, 207, fontpage_160_207_207), // 'å' -- 'å' FONTDATA_ITEM(160, 220, 220, fontpage_160_220_220), // 'åœ' -- 'åœ' FONTDATA_ITEM(161, 168, 168, fontpage_161_168_168), // '储' -- '储' + FONTDATA_ITEM(161, 207, 207, fontpage_161_207_207), // 'åƒ' -- 'åƒ' FONTDATA_ITEM(162, 197, 197, fontpage_162_197_197), // 'å……' -- 'å……' - FONTDATA_ITEM(162, 200, 200, fontpage_162_200_200), // 'å…ˆ' -- 'å…ˆ' + FONTDATA_ITEM(162, 200, 201, fontpage_162_200_201), // 'å…ˆ' -- 'å…‰' FONTDATA_ITEM(162, 229, 229, fontpage_162_229_229), // 'å…¥' -- 'å…¥' FONTDATA_ITEM(162, 232, 232, fontpage_162_232_232), // 'å…¨' -- 'å…¨' FONTDATA_ITEM(162, 241, 241, fontpage_162_241_241), // 'å…±' -- 'å…±' FONTDATA_ITEM(162, 243, 243, fontpage_162_243_243), // 'å…³' -- 'å…³' FONTDATA_ITEM(162, 247, 247, fontpage_162_247_247), // 'å…·' -- 'å…·' + FONTDATA_ITEM(163, 151, 151, fontpage_163_151_151), // '冗' -- '冗' FONTDATA_ITEM(163, 183, 183, fontpage_163_183_183), // '冷' -- '冷' FONTDATA_ITEM(163, 198, 198, fontpage_163_198_198), // '准' -- '准' FONTDATA_ITEM(163, 201, 201, fontpage_163_201_201), // '凉' -- '凉' FONTDATA_ITEM(163, 250, 251, fontpage_163_250_251), // '出' -- '击' - FONTDATA_ITEM(164, 134, 134, fontpage_164_134_134), // '分' -- '分' + FONTDATA_ITEM(164, 134, 135, fontpage_164_134_135), // '分' -- '切' FONTDATA_ITEM(164, 155, 155, fontpage_164_155_155), // '创' -- '创' FONTDATA_ITEM(164, 157, 157, fontpage_164_157_157), // 'åˆ' -- 'åˆ' + FONTDATA_ITEM(164, 171, 171, fontpage_164_171_171), // '别' -- '别' FONTDATA_ITEM(164, 176, 176, fontpage_164_176_176), // '到' -- '到' FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' + FONTDATA_ITEM(164, 242, 242, fontpage_164_242_242), // '割' -- '割' FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' FONTDATA_ITEM(165, 160, 160, fontpage_165_160_160), // '加' -- '加' FONTDATA_ITEM(165, 168, 168, fontpage_165_168_168), // '动' -- '动' FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' + FONTDATA_ITEM(166, 199, 199, fontpage_166_199_199), // 'å‡' -- 'å‡' FONTDATA_ITEM(166, 202, 202, fontpage_166_202_202), // 'åŠ' -- 'åŠ' FONTDATA_ITEM(166, 207, 207, fontpage_166_207_207), // 'å' -- 'å' FONTDATA_ITEM(166, 213, 213, fontpage_166_213_213), // 'å•' -- 'å•' FONTDATA_ITEM(166, 225, 225, fontpage_166_225_225), // 'å¡' -- 'å¡' - FONTDATA_ITEM(166, 240, 240, fontpage_166_240_240), // 'å°' -- 'å°' + FONTDATA_ITEM(166, 240, 241, fontpage_166_240_241), // 'å°' -- 'å±' + FONTDATA_ITEM(166, 244, 244, fontpage_166_244_244), // 'å´' -- 'å´' FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // 'å¸' -- 'å¸' FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' - FONTDATA_ITEM(167, 204, 204, fontpage_167_204_204), // 'åŒ' -- 'åŒ' + FONTDATA_ITEM(167, 204, 205, fontpage_167_204_205), // 'åŒ' -- 'å' FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // 'å–' -- 'å–' FONTDATA_ITEM(167, 216, 216, fontpage_167_216_216), // 'å˜' -- 'å˜' FONTDATA_ITEM(167, 240, 240, fontpage_167_240_240), // 'å°' -- 'å°' + FONTDATA_ITEM(168, 131, 131, fontpage_168_131_131), // 'åƒ' -- 'åƒ' FONTDATA_ITEM(168, 136, 136, fontpage_168_136_136), // 'åˆ' -- 'åˆ' - FONTDATA_ITEM(168, 142, 142, fontpage_168_142_142), // 'åŽ' -- 'åŽ' + FONTDATA_ITEM(168, 141, 142, fontpage_168_141_142), // 'å' -- 'åŽ' + FONTDATA_ITEM(168, 145, 145, fontpage_168_145_145), // 'å‘' -- 'å‘' + FONTDATA_ITEM(168, 166, 166, fontpage_168_166_166), // 'å¦' -- 'å¦' FONTDATA_ITEM(168, 175, 175, fontpage_168_175_175), // 'å¯' -- 'å¯' + FONTDATA_ITEM(168, 202, 202, fontpage_168_202_202), // 'å‘Š' -- 'å‘Š' + FONTDATA_ITEM(168, 232, 232, fontpage_168_232_232), // '周' -- '周' FONTDATA_ITEM(168, 253, 253, fontpage_168_253_253), // '命' -- '命' FONTDATA_ITEM(169, 140, 140, fontpage_169_140_140), // 'å’Œ' -- 'å’Œ' + FONTDATA_ITEM(169, 205, 205, fontpage_169_205_205), // 'å“' -- 'å“' FONTDATA_ITEM(171, 183, 183, fontpage_171_183_183), // 'å–·' -- 'å–·' FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' + FONTDATA_ITEM(172, 232, 232, fontpage_172_232_232), // '器' -- '器' + FONTDATA_ITEM(172, 244, 244, fontpage_172_244_244), // 'å™´' -- 'å™´' FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // 'å› ' -- 'å› ' + FONTDATA_ITEM(173, 250, 250, fontpage_173_250_250), // '固' -- '固' FONTDATA_ITEM(173, 254, 254, fontpage_173_254_254), // '图' -- '图' FONTDATA_ITEM(174, 168, 168, fontpage_174_168_168), // '在' -- '在' + FONTDATA_ITEM(174, 207, 207, fontpage_174_207_207), // 'å' -- 'å' FONTDATA_ITEM(174, 215, 215, fontpage_174_215_215), // 'å—' -- 'å—' FONTDATA_ITEM(175, 139, 139, fontpage_175_139_139), // 'åž‹' -- 'åž‹' FONTDATA_ITEM(175, 171, 171, fontpage_175_171_171), // 'åž«' -- 'åž«' @@ -1118,6 +1557,8 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(178, 167, 167, fontpage_178_167_167), // '大' -- '大' FONTDATA_ITEM(178, 169, 170, fontpage_178_169_170), // '天' -- '太' FONTDATA_ITEM(178, 177, 177, fontpage_178_177_177), // '失' -- '失' + FONTDATA_ITEM(178, 180, 180, fontpage_178_180_180), // '头' -- '头' + FONTDATA_ITEM(178, 253, 253, fontpage_178_253_253), // '好' -- '好' FONTDATA_ITEM(179, 203, 203, fontpage_179_203_203), // '始' -- '始' FONTDATA_ITEM(182, 208, 208, fontpage_182_208_208), // 'å­' -- 'å­' FONTDATA_ITEM(182, 216, 216, fontpage_182_216_216), // 'å­˜' -- 'å­˜' @@ -1125,12 +1566,15 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(183, 140, 140, fontpage_183_140_140), // '完' -- '完' FONTDATA_ITEM(183, 154, 154, fontpage_183_154_154), // '定' -- '定' FONTDATA_ITEM(183, 162, 162, fontpage_183_162_162), // '客' -- '客' + FONTDATA_ITEM(183, 171, 171, fontpage_183_171_171), // '宫' -- '宫' FONTDATA_ITEM(183, 185, 185, fontpage_183_185_185), // '容' -- '容' FONTDATA_ITEM(183, 249, 249, fontpage_183_249_249), // '对' -- '对' + FONTDATA_ITEM(184, 134, 134, fontpage_184_134_134), // 'å°†' -- 'å°†' FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // 'å°' -- 'å°' FONTDATA_ITEM(184, 177, 177, fontpage_184_177_177), // 'å°±' -- 'å°±' FONTDATA_ITEM(184, 207, 207, fontpage_184_207_207), // 'å±' -- 'å±' FONTDATA_ITEM(187, 229, 229, fontpage_187_229_229), // 'å·¥' -- 'å·¥' + FONTDATA_ITEM(187, 238, 238, fontpage_187_238_238), // 'å·®' -- 'å·®' FONTDATA_ITEM(187, 242, 242, fontpage_187_242_242), // 'å·²' -- 'å·²' FONTDATA_ITEM(188, 243, 243, fontpage_188_243_243), // 'å¹³' -- 'å¹³' FONTDATA_ITEM(188, 246, 246, fontpage_188_246_246), // '并' -- '并' @@ -1139,15 +1583,22 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(189, 159, 159, fontpage_189_159_159), // '废' -- '废' FONTDATA_ITEM(189, 166, 166, fontpage_189_166_166), // '度' -- '度' FONTDATA_ITEM(190, 128, 128, fontpage_190_128_128), // 'å¼€' -- 'å¼€' + FONTDATA_ITEM(190, 131, 131, fontpage_190_131_131), // '弃' -- '弃' + FONTDATA_ITEM(190, 143, 143, fontpage_190_143_143), // 'å¼' -- 'å¼' + FONTDATA_ITEM(190, 149, 149, fontpage_190_149_149), // '引' -- '引' + FONTDATA_ITEM(190, 185, 185, fontpage_190_185_185), // 'å¼¹' -- 'å¼¹' FONTDATA_ITEM(190, 210, 210, fontpage_190_210_210), // 'å½’' -- 'å½’' FONTDATA_ITEM(191, 132, 133, fontpage_191_132_133), // '径' -- 'å¾…' + FONTDATA_ITEM(191, 170, 170, fontpage_191_170_170), // '循' -- '循' FONTDATA_ITEM(191, 174, 174, fontpage_191_174_174), // 'å¾®' -- 'å¾®' FONTDATA_ITEM(191, 195, 195, fontpage_191_195_195), // '心' -- '心' + FONTDATA_ITEM(191, 253, 253, fontpage_191_253_253), // '忽' -- '忽' FONTDATA_ITEM(192, 167, 167, fontpage_192_167_167), // '性' -- '性' FONTDATA_ITEM(192, 187, 187, fontpage_192_187_187), // '总' -- '总' FONTDATA_ITEM(192, 226, 226, fontpage_192_226_226), // 'æ¢' -- 'æ¢' FONTDATA_ITEM(192, 239, 239, fontpage_192_239_239), // 'æ¯' -- 'æ¯' - FONTDATA_ITEM(196, 144, 144, fontpage_196_144_144), // 'æˆ' -- 'æˆ' + FONTDATA_ITEM(194, 159, 159, fontpage_194_159_159), // 'æ„Ÿ' -- 'æ„Ÿ' + FONTDATA_ITEM(196, 143, 144, fontpage_196_143_144), // 'æˆ' -- 'æˆ' FONTDATA_ITEM(196, 183, 183, fontpage_196_183_183), // '户' -- '户' FONTDATA_ITEM(196, 192, 192, fontpage_196_192_192), // '所' -- '所' FONTDATA_ITEM(196, 199, 199, fontpage_196_199_199), // '扇' -- '扇' @@ -1156,81 +1607,115 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(196, 231, 231, fontpage_196_231_231), // '执' -- '执' FONTDATA_ITEM(196, 249, 249, fontpage_196_249_249), // '批' -- '批' FONTDATA_ITEM(197, 150, 150, fontpage_197_150_150), // '抖' -- '抖' + FONTDATA_ITEM(197, 165, 165, fontpage_197_165_165), // '报' -- '报' + FONTDATA_ITEM(197, 172, 172, fontpage_197_172_172), // '抬' -- '抬' FONTDATA_ITEM(197, 189, 189, fontpage_197_189_189), // '抽' -- '抽' FONTDATA_ITEM(197, 212, 212, fontpage_197_212_212), // 'æ‹”' -- 'æ‹”' FONTDATA_ITEM(197, 233, 233, fontpage_197_233_233), // 'æ‹©' -- 'æ‹©' FONTDATA_ITEM(198, 137, 137, fontpage_198_137_137), // '按' -- '按' FONTDATA_ITEM(198, 161, 161, fontpage_198_161_161), // '挡' -- '挡' FONTDATA_ITEM(198, 164, 164, fontpage_198_164_164), // '挤' -- '挤' + FONTDATA_ITEM(198, 223, 223, fontpage_198_223_223), // 'æŸ' -- 'æŸ' FONTDATA_ITEM(198, 226, 226, fontpage_198_226_226), // 'æ¢' -- 'æ¢' FONTDATA_ITEM(199, 137, 137, fontpage_199_137_137), // '掉' -- '掉' FONTDATA_ITEM(199, 162, 162, fontpage_199_162_162), // '探' -- '探' + FONTDATA_ITEM(199, 165, 165, fontpage_199_165_165), // '接' -- '接' FONTDATA_ITEM(199, 167, 167, fontpage_199_167_167), // '控' -- '控' + FONTDATA_ITEM(199, 208, 208, fontpage_199_208_208), // 'æ' -- 'æ' FONTDATA_ITEM(199, 210, 210, fontpage_199_210_210), // 'æ’' -- 'æ’' FONTDATA_ITEM(202, 182, 182, fontpage_202_182_182), // '收' -- '收' FONTDATA_ITEM(202, 190, 190, fontpage_202_190_190), // '放' -- '放' FONTDATA_ITEM(202, 240, 240, fontpage_202_240_240), // 'æ•°' -- 'æ•°' + FONTDATA_ITEM(202, 242, 242, fontpage_202_242_242), // '敲' -- '敲' FONTDATA_ITEM(202, 244, 244, fontpage_202_244_244), // 'æ•´' -- 'æ•´' + FONTDATA_ITEM(203, 135, 135, fontpage_203_135_135), // 'æ–‡' -- 'æ–‡' FONTDATA_ITEM(203, 153, 153, fontpage_203_153_153), // 'æ–™' -- 'æ–™' FONTDATA_ITEM(203, 156, 156, fontpage_203_156_156), // 'æ–œ' -- 'æ–œ' + FONTDATA_ITEM(203, 173, 173, fontpage_203_173_173), // 'æ–­' -- 'æ–­' FONTDATA_ITEM(203, 176, 176, fontpage_203_176_176), // 'æ–°' -- 'æ–°' + FONTDATA_ITEM(203, 185, 185, fontpage_203_185_185), // 'æ–¹' -- 'æ–¹' FONTDATA_ITEM(203, 224, 224, fontpage_203_224_224), // 'æ— ' -- 'æ— ' FONTDATA_ITEM(203, 246, 246, fontpage_203_246_246), // 'æ—¶' -- 'æ—¶' FONTDATA_ITEM(204, 142, 142, fontpage_204_142_142), // '明' -- '明' + FONTDATA_ITEM(204, 175, 175, fontpage_204_175_175), // '是' -- '是' FONTDATA_ITEM(205, 130, 130, fontpage_205_130_130), // 'æš‚' -- 'æš‚' FONTDATA_ITEM(205, 171, 171, fontpage_205_171_171), // 'æš«' -- 'æš«' FONTDATA_ITEM(205, 244, 244, fontpage_205_244_244), // 'æ›´' -- 'æ›´' FONTDATA_ITEM(206, 128, 128, fontpage_206_128_128), // '最' -- '最' FONTDATA_ITEM(206, 137, 137, fontpage_206_137_137), // '有' -- '有' + FONTDATA_ITEM(206, 159, 159, fontpage_206_159_159), // '期' -- '期' FONTDATA_ITEM(206, 186, 186, fontpage_206_186_186), // '机' -- '机' FONTDATA_ITEM(206, 192, 192, fontpage_206_192_192), // 'æ€' -- 'æ€' + FONTDATA_ITEM(206, 223, 223, fontpage_206_223_223), // 'æŸ' -- 'æŸ' FONTDATA_ITEM(206, 225, 225, fontpage_206_225_225), // 'æ¡' -- 'æ¡' FONTDATA_ITEM(206, 229, 229, fontpage_206_229_229), // 'æ¥' -- 'æ¥' FONTDATA_ITEM(206, 255, 255, fontpage_206_255_255), // 'æ¿' -- 'æ¿' FONTDATA_ITEM(207, 241, 241, fontpage_207_241_241), // '柱' -- '柱' FONTDATA_ITEM(208, 161, 161, fontpage_208_161_161), // 'æ ¡' -- 'æ ¡' FONTDATA_ITEM(208, 188, 188, fontpage_208_188_188), // 'æ ¼' -- 'æ ¼' + FONTDATA_ITEM(209, 175, 175, fontpage_209_175_175), // '梯' -- '梯' FONTDATA_ITEM(209, 192, 192, fontpage_209_192_192), // '检' -- '检' FONTDATA_ITEM(211, 253, 253, fontpage_211_253_253), // '槽' -- '槽' + FONTDATA_ITEM(212, 161, 161, fontpage_212_161_161), // '模' -- '模' FONTDATA_ITEM(212, 217, 217, fontpage_212_217_217), // 'æ©™' -- 'æ©™' FONTDATA_ITEM(214, 226, 227, fontpage_214_226_227), // 'æ­¢' -- 'æ­£' FONTDATA_ITEM(214, 229, 229, fontpage_214_229_229), // 'æ­¥' -- 'æ­¥' FONTDATA_ITEM(215, 212, 212, fontpage_215_212_212), // '比' -- '比' FONTDATA_ITEM(217, 161, 161, fontpage_217_161_161), // '没' -- '没' FONTDATA_ITEM(217, 226, 226, fontpage_217_226_226), // 'æ³¢' -- 'æ³¢' + FONTDATA_ITEM(217, 232, 232, fontpage_217_232_232), // '注' -- '注' + FONTDATA_ITEM(218, 151, 151, fontpage_218_151_151), // 'æ´—' -- 'æ´—' FONTDATA_ITEM(218, 187, 187, fontpage_218_187_187), // 'æ´»' -- 'æ´»' + FONTDATA_ITEM(218, 193, 193, fontpage_218_193_193), // 'æµ' -- 'æµ' FONTDATA_ITEM(218, 203, 203, fontpage_218_203_203), // '测' -- '测' FONTDATA_ITEM(219, 136, 136, fontpage_219_136_136), // '消' -- '消' FONTDATA_ITEM(219, 225, 225, fontpage_219_225_225), // 'æ·¡' -- 'æ·¡' + FONTDATA_ITEM(219, 247, 247, fontpage_219_247_247), // 'æ··' -- 'æ··' FONTDATA_ITEM(220, 133, 133, fontpage_220_133_133), // '清' -- '清' FONTDATA_ITEM(220, 169, 169, fontpage_220_169_169), // '温' -- '温' + FONTDATA_ITEM(220, 184, 184, fontpage_220_184_184), // '游' -- '游' FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // 'æº' -- 'æº' + FONTDATA_ITEM(221, 162, 162, fontpage_221_162_162), // '溢' -- '溢' + FONTDATA_ITEM(221, 209, 209, fontpage_221_209_209), // '滑' -- '滑' FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // 'æ¿€' -- 'æ¿€' FONTDATA_ITEM(224, 239, 239, fontpage_224_239_239), // 'ç¯' -- 'ç¯' FONTDATA_ITEM(225, 185, 185, fontpage_225_185_185), // '点' -- '点' FONTDATA_ITEM(225, 237, 237, fontpage_225_237_237), // '热' -- '热' FONTDATA_ITEM(228, 199, 199, fontpage_228_199_199), // '片' -- '片' + FONTDATA_ITEM(228, 233, 233, fontpage_228_233_233), // '物' -- '物' FONTDATA_ITEM(228, 249, 249, fontpage_228_249_249), // '特' -- '特' FONTDATA_ITEM(231, 135, 135, fontpage_231_135_135), // '率' -- '率' + FONTDATA_ITEM(231, 175, 175, fontpage_231_175_175), // '环' -- '环' FONTDATA_ITEM(234, 168, 168, fontpage_234_168_168), // '用' -- '用' FONTDATA_ITEM(234, 181, 181, fontpage_234_181_181), // '电' -- '电' + FONTDATA_ITEM(234, 229, 229, fontpage_234_229_229), // 'ç•¥' -- 'ç•¥' FONTDATA_ITEM(236, 253, 253, fontpage_236_253_253), // '白' -- '白' FONTDATA_ITEM(237, 132, 132, fontpage_237_132_132), // 'çš„' -- 'çš„' + FONTDATA_ITEM(237, 209, 209, fontpage_237_209_209), // '监' -- '监' FONTDATA_ITEM(237, 244, 244, fontpage_237_244_244), // 'ç›´' -- 'ç›´' FONTDATA_ITEM(238, 129, 129, fontpage_238_129_129), // 'çœ' -- 'çœ' FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' FONTDATA_ITEM(240, 238, 238, fontpage_240_238_238), // 'ç¡®' -- 'ç¡®' + FONTDATA_ITEM(243, 187, 187, fontpage_243_187_187), // '离' -- '离' FONTDATA_ITEM(243, 239, 239, fontpage_243_239_239), // '积' -- '积' FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // '移' -- '移' + FONTDATA_ITEM(244, 250, 250, fontpage_244_250_250), // '空' -- '空' FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' + FONTDATA_ITEM(246, 172, 172, fontpage_246_172_172), // '第' -- '第' FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // 'ç­‰' -- 'ç­‰' + FONTDATA_ITEM(247, 128, 128, fontpage_247_128_128), // '简' -- '简' FONTDATA_ITEM(247, 161, 161, fontpage_247_161_161), // '管' -- '管' + FONTDATA_ITEM(247, 177, 177, fontpage_247_177_177), // 'ç®±' -- 'ç®±' FONTDATA_ITEM(248, 251, 251, fontpage_248_251_251), // 'ç±»' -- 'ç±»' + FONTDATA_ITEM(250, 162, 162, fontpage_250_162_162), // 'ç´¢' -- 'ç´¢' FONTDATA_ITEM(250, 171, 171, fontpage_250_171_171), // 'ç´«' -- 'ç´«' FONTDATA_ITEM(253, 162, 162, fontpage_253_162_162), // '红' -- '红' + FONTDATA_ITEM(253, 167, 167, fontpage_253_167_167), // '级' -- '级' FONTDATA_ITEM(253, 191, 191, fontpage_253_191_191), // '线' -- '线' FONTDATA_ITEM(253, 198, 198, fontpage_253_198_198), // '细' -- '细' FONTDATA_ITEM(253, 200, 200, fontpage_253_200_200), // '终' -- '终' + FONTDATA_ITEM(253, 211, 211, fontpage_253_211_211), // '结' -- '结' + FONTDATA_ITEM(253, 217, 217, fontpage_253_217_217), // 'ç»™' -- 'ç»™' FONTDATA_ITEM(253, 223, 223, fontpage_253_223_223), // '统' -- '统' FONTDATA_ITEM(253, 231, 231, fontpage_253_231_231), // '继' -- '继' FONTDATA_ITEM(253, 234, 234, fontpage_253_234_234), // '绪' -- '绪' @@ -1241,13 +1726,17 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(254, 209, 209, fontpage_254_209_209), // '网' -- '网' FONTDATA_ITEM(254, 238, 238, fontpage_254_238_238), // 'ç½®' -- 'ç½®' FONTDATA_ITEM(254, 242, 242, fontpage_254_242_242), // 'ç½²' -- 'ç½²' + FONTDATA_ITEM(256, 133, 133, fontpage_256_133_133), // '者' -- '者' FONTDATA_ITEM(256, 234, 234, fontpage_256_234_234), // 'èª' -- 'èª' + FONTDATA_ITEM(257, 253, 253, fontpage_257_253_253), // '能' -- '能' FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' FONTDATA_ITEM(263, 220, 220, fontpage_263_220_220), // 'èœ' -- 'èœ' FONTDATA_ITEM(265, 221, 221, fontpage_265_221_221), // 'è“' -- 'è“' + FONTDATA_ITEM(269, 199, 199, fontpage_269_199_199), // '蛇' -- '蛇' FONTDATA_ITEM(272, 204, 204, fontpage_272_204_204), // 'è¡Œ' -- 'è¡Œ' FONTDATA_ITEM(273, 171, 171, fontpage_273_171_171), // '被' -- '被' FONTDATA_ITEM(273, 197, 197, fontpage_273_197_197), // '装' -- '装' + FONTDATA_ITEM(275, 129, 129, fontpage_275_129_129), // 'è¦' -- 'è¦' FONTDATA_ITEM(275, 210, 210, fontpage_275_210_210), // '角' -- '角' FONTDATA_ITEM(279, 161, 161, fontpage_279_161_161), // '计' -- '计' FONTDATA_ITEM(279, 174, 174, fontpage_279_174_174), // 'è®®' -- 'è®®' @@ -1255,8 +1744,15 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(279, 213, 213, fontpage_279_213_213), // '试' -- '试' FONTDATA_ITEM(279, 239, 239, fontpage_279_239_239), // '误' -- '误' FONTDATA_ITEM(279, 247, 247, fontpage_279_247_247), // '请' -- '请' + FONTDATA_ITEM(279, 251, 251, fontpage_279_251_251), // '读' -- '读' FONTDATA_ITEM(280, 131, 131, fontpage_280_131_131), // 'è°ƒ' -- 'è°ƒ' FONTDATA_ITEM(282, 165, 165, fontpage_282_165_165), // 'è´¥' -- 'è´¥' + FONTDATA_ITEM(282, 170, 170, fontpage_282_170_170), // 'è´ª' -- 'è´ª' + FONTDATA_ITEM(282, 247, 247, fontpage_282_247_247), // 'èµ·' -- 'èµ·' + FONTDATA_ITEM(283, 133, 133, fontpage_283_133_133), // '超' -- '超' + FONTDATA_ITEM(283, 221, 221, fontpage_283_221_221), // 'è·' -- 'è·' + FONTDATA_ITEM(286, 236, 236, fontpage_286_236_236), // '转' -- '转' + FONTDATA_ITEM(286, 239, 239, fontpage_286_239_239), // '软' -- '软' FONTDATA_ITEM(286, 244, 244, fontpage_286_244_244), // 'è½´' -- 'è½´' FONTDATA_ITEM(286, 253, 253, fontpage_286_253_253), // 'è½½' -- 'è½½' FONTDATA_ITEM(287, 145, 145, fontpage_287_145_145), // '辑' -- '辑' @@ -1266,31 +1762,45 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // 'è¿”' -- 'è¿”' FONTDATA_ITEM(287, 216, 216, fontpage_287_216_216), // '还' -- '还' FONTDATA_ITEM(287, 219, 219, fontpage_287_219_219), // 'è¿›' -- 'è¿›' + FONTDATA_ITEM(287, 222, 222, fontpage_287_222_222), // 'è¿ž' -- 'è¿ž' + FONTDATA_ITEM(287, 247, 247, fontpage_287_247_247), // 'è¿·' -- 'è¿·' FONTDATA_ITEM(288, 128, 128, fontpage_288_128_128), // '退' -- '退' FONTDATA_ITEM(288, 137, 137, fontpage_288_137_137), // '选' -- '选' FONTDATA_ITEM(288, 159, 159, fontpage_288_159_159), // '速' -- '速' FONTDATA_ITEM(289, 232, 232, fontpage_289_232_232), // '部' -- '部' + FONTDATA_ITEM(290, 205, 205, fontpage_290_205_205), // 'é…' -- 'é…' FONTDATA_ITEM(291, 202, 202, fontpage_291_202_202), // '释' -- '释' FONTDATA_ITEM(291, 205, 205, fontpage_291_205_205), // 'é‡' -- 'é‡' FONTDATA_ITEM(291, 207, 207, fontpage_291_207_207), // 'é‡' -- 'é‡' FONTDATA_ITEM(297, 136, 136, fontpage_297_136_136), // 'é’ˆ' -- 'é’ˆ' FONTDATA_ITEM(297, 174, 174, fontpage_297_174_174), // 'é’®' -- 'é’®' FONTDATA_ITEM(298, 153, 153, fontpage_298_153_153), // 'é”™' -- 'é”™' - FONTDATA_ITEM(298, 174, 174, fontpage_298_174_174), // 'é”®' -- 'é”®' + FONTDATA_ITEM(298, 220, 220, fontpage_298_220_220), // 'é•œ' -- 'é•œ' FONTDATA_ITEM(298, 255, 255, fontpage_298_255_255), // 'é•¿' -- 'é•¿' FONTDATA_ITEM(299, 237, 237, fontpage_299_237_237), // 'é—­' -- 'é—­' + FONTDATA_ITEM(299, 242, 242, fontpage_299_242_242), // 'é—²' -- 'é—²' FONTDATA_ITEM(299, 244, 244, fontpage_299_244_244), // 'é—´' -- 'é—´' + FONTDATA_ITEM(300, 136, 136, fontpage_300_136_136), // '阈' -- '阈' FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // 'é™' -- 'é™' FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' + FONTDATA_ITEM(300, 233, 233, fontpage_300_233_233), // '险' -- '险' + FONTDATA_ITEM(301, 246, 246, fontpage_301_246_246), // '零' -- '零' + FONTDATA_ITEM(302, 128, 128, fontpage_302_128_128), // '需' -- '需' FONTDATA_ITEM(302, 210, 210, fontpage_302_210_210), // 'é’' -- 'é’' FONTDATA_ITEM(302, 222, 222, fontpage_302_222_222), // 'éž' -- 'éž' + FONTDATA_ITEM(302, 224, 224, fontpage_302_224_224), // 'é ' -- 'é ' + FONTDATA_ITEM(302, 226, 226, fontpage_302_226_226), // 'é¢' -- 'é¢' + FONTDATA_ITEM(304, 245, 245, fontpage_304_245_245), // '页' -- '页' FONTDATA_ITEM(304, 249, 249, fontpage_304_249_249), // '项' -- '项' FONTDATA_ITEM(305, 132, 132, fontpage_305_132_132), // '预' -- '预' + FONTDATA_ITEM(305, 145, 145, fontpage_305_145_145), // '频' -- '频' FONTDATA_ITEM(305, 157, 157, fontpage_305_157_157), // 'é¢' -- 'é¢' FONTDATA_ITEM(305, 206, 206, fontpage_305_206_206), // '风' -- '风' FONTDATA_ITEM(306, 241, 241, fontpage_306_241_241), // '饱' -- '饱' FONTDATA_ITEM(308, 241, 241, fontpage_308_241_241), // '驱' -- '驱' FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' FONTDATA_ITEM(317, 196, 196, fontpage_317_196_196), // '黄' -- '黄' + FONTDATA_ITEM(317, 222, 222, fontpage_317_222_222), // '點' -- '點' + FONTDATA_ITEM(318, 208, 208, fontpage_318_208_208), // 'é½' -- 'é½' FONTDATA_ITEM(510, 154, 154, fontpage_510_154_154), // ':' -- ':' }; From c1dcc56a0b5bc110289ac9c4aeefa8263c5174d4 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 27 Jun 2020 22:57:01 -0400 Subject: [PATCH 043/483] Tool Change Migration fixes and debugging (#18448) --- Marlin/src/feature/runout.cpp | 15 ++++++++++++-- Marlin/src/gcode/config/M217.cpp | 2 +- Marlin/src/module/tool_change.cpp | 34 +++++++++++++++++++++++++++---- Marlin/src/module/tool_change.h | 2 +- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 452781b7f29b..80bce6d75844 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -40,6 +40,7 @@ bool FilamentMonitorBase::enabled = true, #endif #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + //#define DEBUG_TOOLCHANGE_MIGRATION_FEATURE #include "../module/tool_change.h" #endif @@ -80,8 +81,18 @@ void event_filament_runout() { if (TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print)) return; // Action already in progress. Purge triggered repeated runout. #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - if (migration.in_progress) return; // Action already in progress. Purge triggered repeated runout. - if (migration.automode) { extruder_migration(); return; } + if (migration.in_progress) { + #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHOLN("Migration Already In Progress"); + #endif + return; // Action already in progress. Purge triggered repeated runout. + } + if (migration.automode) { + #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHOLN("Migration Starting"); + #endif + if (extruder_migration()) return; + } #endif TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getActiveTool())); diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index a1e53e5ecb43..a3a9d7b0aaa5 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -49,7 +49,7 @@ void M217_report(const bool eeprom=false) { " G", toolchange_settings.fan_time); #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOPAIR(" N", int(migration.automode)); + SERIAL_ECHOPAIR(" A", int(migration.automode)); SERIAL_ECHOPAIR(" L", LINEAR_UNIT(migration.last)); #endif diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 8aa367555dc3..3a283f8357da 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1222,16 +1222,27 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - void extruder_migration() { + bool extruder_migration() { #if ENABLED(PREVENT_COLD_EXTRUSION) - if (thermalManager.targetTooColdToExtrude(active_extruder)) return; + if (thermalManager.targetTooColdToExtrude(active_extruder)) { + #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHOLN("Migration Source Too Cold"); + #endif + return false; + } #endif // No auto-migration or specified target? if (!migration.target && active_extruder >= migration.last) { + #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHO_MSG("No Migration Target"); + SERIAL_ECHO_MSG("Target: ", migration.target, + " Last: ", migration.last, + " Active: ", active_extruder); + #endif migration.automode = false; - return; + return false; } // Migrate to a target or the next extruder @@ -1239,6 +1250,9 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { uint8_t migration_extruder = active_extruder; if (migration.target) { + #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHOLN("Migration using fixed target"); + #endif // Specified target ok? const int16_t t = migration.target - 1; if (t != active_extruder) migration_extruder = t; @@ -1246,9 +1260,17 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { else if (migration.automode && migration_extruder < migration.last && migration_extruder < EXTRUDERS - 1) migration_extruder++; - if (migration_extruder == active_extruder) return; + if (migration_extruder == active_extruder) { + #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHOLN("Migration source matches active"); + #endif + return false; + } // Migration begins + #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHOLN("Beginning migration"); + #endif migration.in_progress = true; // Prevent runout script planner.synchronize(); @@ -1294,6 +1316,10 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { planner.synchronize(); planner.set_e_position_mm(current_position.e); // New extruder primed and ready + #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHOLN("Migration Complete"); + #endif + return true; } #endif // TOOLCHANGE_MIGRATION_FEATURE diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 4b004950ab75..d39d7bc7833f 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -59,7 +59,7 @@ } migration_settings_t; constexpr migration_settings_t migration_defaults = { 0, 0, false, false }; extern migration_settings_t migration; - void extruder_migration(); + bool extruder_migration(); #endif #endif From 3b80690a71c0a97f75efb1721fc007ef5a018c1c Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 27 Jun 2020 23:02:28 -0400 Subject: [PATCH 044/483] ExtUI additions (#18447) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 4 ++++ Marlin/src/lcd/extui/ui_api.cpp | 3 +++ Marlin/src/lcd/extui/ui_api.h | 3 +++ Marlin/src/libs/buzzer.cpp | 3 ++- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 7c8222f014d5..04e4461db375 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2121,6 +2121,10 @@ // //#define EXTENSIBLE_UI +#if ENABLED(EXTENSIBLE_UI) + //#define EXTUI_LOCAL_BEEPER // Enables use of local Beeper pin with external display +#endif + //============================================================================= //=============================== Graphical TFTs ============================== //============================================================================= diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 65518908cb3d..5e1f2cfacf2f 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -590,6 +590,8 @@ namespace ExtUI { #if HAS_FILAMENT_SENSOR bool getFilamentRunoutEnabled() { return runout.enabled; } void setFilamentRunoutEnabled(const bool value) { runout.enabled = value; } + bool getFilamentRunoutState() { return runout.filament_ran_out; } + void setFilamentRunoutState(const bool value) { runout.filament_ran_out = value; } #if HAS_FILAMENT_RUNOUT_DISTANCE float getFilamentRunoutDistance_mm() { return runout.runout_distance(); } @@ -884,6 +886,7 @@ namespace ExtUI { #endif void injectCommands_P(PGM_P const gcode) { queue.inject_P(gcode); } + void injectCommands(char * const gcode) { queue.inject(gcode); } bool commandsInQueue() { return (planner.movesplanned() || queue.has_commands_queued()); } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 0f9c6ff48eec..103cf6c1047f 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -74,6 +74,7 @@ namespace ExtUI { bool canMove(const axis_t); bool canMove(const extruder_t); void injectCommands_P(PGM_P const); + void injectCommands(char * const); bool commandsInQueue(); bool isHeaterIdle(const heater_t); @@ -236,6 +237,8 @@ namespace ExtUI { #if HAS_FILAMENT_SENSOR bool getFilamentRunoutEnabled(); void setFilamentRunoutEnabled(const bool); + bool getFilamentRunoutState(); + void setFilamentRunoutState(const bool); #if HAS_FILAMENT_RUNOUT_DISTANCE float getFilamentRunoutDistance_mm(); diff --git a/Marlin/src/libs/buzzer.cpp b/Marlin/src/libs/buzzer.cpp index 3b0a23917871..d684dce81625 100644 --- a/Marlin/src/libs/buzzer.cpp +++ b/Marlin/src/libs/buzzer.cpp @@ -66,7 +66,8 @@ void Buzzer::tick() { CRITICAL_SECTION_START(); ExtUI::onPlayTone(state.tone.frequency, state.tone.duration); CRITICAL_SECTION_END(); - #elif ENABLED(SPEAKER) + #endif + #if ENABLED(SPEAKER) && (DISABLED(EXTENSIBLE_UI) || ENABLED(EXTUI_LOCAL_BEEPER)) CRITICAL_SECTION_START(); ::tone(BEEPER_PIN, state.tone.frequency, state.tone.duration); CRITICAL_SECTION_END(); From 59e4de8a55abc7eb0fd0b8c3c753e22c9aee0fb1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 27 Jun 2020 22:59:44 -0500 Subject: [PATCH 045/483] Add Romanian language (#18455) Co-authored-by: cristyanul <47246451+cristyanul@users.noreply.github.com> --- Marlin/Configuration.h | 4 +- Marlin/src/core/language.h | 1 + Marlin/src/lcd/dogm/fontdata/langdata_ro.h | 9 + Marlin/src/lcd/language/language_ro.h | 643 +++++++++++++++++++++ buildroot/share/fonts/genallfont.sh | 2 +- buildroot/tests/mega2560-tests | 4 +- 6 files changed, 658 insertions(+), 5 deletions(-) create mode 100644 Marlin/src/lcd/dogm/fontdata/langdata_ro.h create mode 100644 Marlin/src/lcd/language/language_ro.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 04e4461db375..6daedf815641 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1638,9 +1638,9 @@ * Select the language to display on the LCD. These languages are available: * * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it, - * jp_kana, ko_KR, nl, pl, pt, pt_br, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * jp_kana, ko_KR, nl, pl, pt, pt_br, ro ru, sk, tr, uk, vi, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 4bd853d219c9..ce4bfa18dfbc 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -65,6 +65,7 @@ // pl Polish // pt Portuguese // pt_br Portuguese (Brazilian) +// ro Romanian // ru Russian // sk Slovak // tr Turkish diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ro.h b/Marlin/src/lcd/dogm/fontdata/langdata_ro.h new file mode 100644 index 000000000000..ffda82764fa2 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_ro.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h new file mode 100644 index 000000000000..643589f1bddd --- /dev/null +++ b/Marlin/src/lcd/language/language_ro.h @@ -0,0 +1,643 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + + /** + * Romanian + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + * + * Translation by cristyanul + */ +namespace Language_ro { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Romanian"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Pregatit."); + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("DA"); + PROGMEM Language_Str MSG_NO = _UxGT("NU"); + PROGMEM Language_Str MSG_BACK = _UxGT("Inapoi"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Abandon..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media Introdus"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media Inlaturat"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Astept Media"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Eroare Citire Media"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Dispozitiv USB Inlaturat"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Pornire USB Esuata"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Eroare:Subcall Overflow"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Principal"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Setari Avansate"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configurare"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Dezactivare Motoare"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Meniu Debug"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test Bara Progres"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Acasa"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Acasa X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Acasa Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Acasa Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Aliniere-Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Acasa XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click pentru a incepe"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Urmatorul Punct"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivelare Terminata!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Inaltime"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Seteaza Offseturile Acasa"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offseturi Aplicate"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Seteaza Originea"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preincalzeste ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preincalzeste ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Patul"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Conf"); + PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Preincalzeste ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Preincalzeste ") PREHEAT_2_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Capatul"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Capatul ~"); + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Patul"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Conf"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preincalzeste Personalizat"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Racire"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecventa"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Laser"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Oprit"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser Pornit"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Puterea Laserului"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Controlul Spindle"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Oprit"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle Pornit"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Puterea Spindle"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Invers"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Porneste"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Opreste"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudeaza"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retracteaza"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Muta Axa"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelarea Patului"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveleaza Patul"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Niveleaza Colturile"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Urmatorul Colt"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mesh"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editeaza Mesh"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Editarea Meshului Oprita"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punctul de Probare"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valoare Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comenzi Personalizate"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviation"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mode"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2nd Nozzle X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2nd Nozzle Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Doing G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Tools"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Tilting Point"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manually Build Mesh"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Place Shim & Measure"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Measure"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Remove & Measure Bed"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Moving to next"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activate UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deactivate UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Mesh Edit"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit Custom Mesh"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Fine Tuning Mesh"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Build Mesh (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Build Mesh (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Build Cold Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Adjust Mesh Height"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Height Amount"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validate Mesh"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Validate Mesh (") PREHEAT_1_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Validate Mesh (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validate Custom Mesh"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Heating Bed"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manual priming..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fixed Length Prime"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Done Priming"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Canceled"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Leaving G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continue Bed Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Mesh Leveling"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Point Leveling"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Grid Mesh Leveling"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Level Mesh"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Side Points"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Map Type"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Output Mesh Map"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Output for Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Output for CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Off Imprimanta Backup"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Output UBL Info"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Fill-in Amount"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manual Fill-in"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Smart Fill-in"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Fill-in Mesh"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidate All"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidate Closest"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Fine Tune All"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Fine Tune Closest"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Storage"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memory Slot"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Load Bed Mesh"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Save Bed Mesh"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Mesh %i Loaded"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Mesh %i Saved"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("No Storage"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: UBL Save"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: UBL Restore"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Stopped"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Step-By-Step UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Build Cold Mesh"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Smart Fill-in"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validate Mesh"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Fine Tune All"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validate Mesh"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Fine Tune All"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Save Bed Mesh"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Control"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Lights"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Light Presets"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Red"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Yellow"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Green"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blue"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("White"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Default"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Custom Lights"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Red Intensity"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Green Intensity"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Blue Intensity"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("White Intensity"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brightness"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Moving..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Free XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Move X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Move Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Move Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Capat Prea Rece"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Move %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Move 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Move 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Move 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Speed"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Nozzle ~"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Nozzle Parked"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Nozzle Standby"); + PROGMEM Language_Str MSG_BED = _UxGT("Bed"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Speed"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Speed ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Stored Fan ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fan Speed"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra Fan Speed ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controller Fan"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Idle Speed"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto Mode"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Active Speed"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Idle Period"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flow"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flow ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("On"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Off"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed. Bad extruder."); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed. Temperature too high."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); + PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); + PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Select"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Select *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); + PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Jerk"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Jerk"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Jerk"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Jerk"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocity"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VTrav Min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Acceleration"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-Retract"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-Travel"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequency max"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("steps/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("steps/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("steps/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Esteps/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*steps/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Motion"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Unload mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Load mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Contrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Store Settings"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Load Settings"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restore Defaults"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initialize EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Error"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Error"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Error"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Settings Stored"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Media Update"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reset Imprimanta"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info Screen"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepare"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Tune"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Power monitor"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Intensitate"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Voltaj"); + PROGMEM Language_Str MSG_POWER = _UxGT("Putere"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start Imprimare"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Urmatorul"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Initiere"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimeaza"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reseteaza"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignora"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Anuleaza"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("OK"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Inapoi"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Proceed"); + PROGMEM Language_Str MSG_PAUSING = _UxGT("Pausing..."); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause Print"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resume Print"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop Print"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Printing Object"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancel Object"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancel Object ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Outage Recovery"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print from Media"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No Media"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Sleep..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Click to Resume..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Print Paused"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Printing..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print Aborted"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Print Done"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("No Move."); + PROGMEM Language_Str MSG_KILLED = _UxGT("KILLED. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPED. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S UnRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("UnRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRetr."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Swap Length"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Swap Extra"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purge Length"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Tool Inlocuire"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Raise"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime Speed"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Retract Speed"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Park Head"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Fan Speed"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Fan Time"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto Pornit"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto Oprit"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Tool Migration"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migrare"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Last Extruder"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrate to *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Inlocuire Filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Inlocuire Filament *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Incarcare Filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Incarcare Filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Scoatere Filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Scoatere Filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Scoate Tot"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Atasare Media"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Inlocuire Media"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Eliberare Media"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Probe Past Bed"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Skew Factor"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Stow"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Deploy"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Mode-Store"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("DANGER: Bad settings can cause damage! Proceed anyway?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Save"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Deploy TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Deploy Z-Probe"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Stow Z-Probe"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s First"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Probe Offsets"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Probe X Offset"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Probe Y Offset"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Probe Z Offset"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bed Heating Failed"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chamber Heating Fail"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: MAXTEMP BED"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: MINTEMP BED"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP CHAMBER"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP CHAMBER"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY First"); + PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Please Reset"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Heating..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Cooling..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bed Heating..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bed Cooling..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chamber Heating..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrate X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrate Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrate Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrate Center"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Settings"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibration"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Set Delta Height"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Probe Z-offset"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Inaltime"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Despre Imprimanta"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info Imprimanta"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelare in 3 puncte"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelare Lineara"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelare Bilineara"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelarea Patului Unificata"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelare Mesh"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Status Imprimanta"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Informatii Placa"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistoare"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudere"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocol"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: OFF"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: ON"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Case Light"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Light Brightness"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("INCORRECT PRINTER"); + +#if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total Printuri"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completat"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Timp Imprimare Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extrudat"); +#else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Prints"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded"); +#endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temperatura Minima"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temperatura Maxima"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Drive Strength"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CONNECTION ERROR"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Write"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT CHANGE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PRINT PAUSED"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("LOAD FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("UNLOAD FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("RESUME OPTIONS:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purge more"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continue"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout Sensor"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Homing Failed"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: Too Cold"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Update MMU Firmware!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Needs Attention."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("MMU Resume"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("MMU Resuming..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Load"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("MMU Load All"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Load to Nozzle"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Eject"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Eject ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Unload"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Loading Fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejecting Fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Unloading Fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("All"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reset MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Resetting..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Remove, click"); + + PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Component ="); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Full Gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Toggle Mix"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cycle Mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Reverse Gradient"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Active V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Start V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" End V-tool"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit V-tool Mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools Were Reset"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Start Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" End Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Jocuri"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); + + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Bad page index"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Bad page speed"); + + // + // Filament Inlocuire screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // +#if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Apasa Butonul", "pentru a reveni la print")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcare...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Astept ca", "inlocuirea filamentului", "sa inceapa")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insert filament", "and press button", "to continue")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Press button", "to heat nozzle")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle heating", "Please wait...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wait for", "filament unload")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wait for", "filament load")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Wait for", "filament purge")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Click to finish", "filament purge")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wait for print", "to resume...")); +#else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Click to continue")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcare...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Va rog asteptati...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insert and Click")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Click pentru incalzire")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Incalzire...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejectare...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Incarcare...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Curatare...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click pentru a termina")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Se Reia...")); +#endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver Current"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" in:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Backlash"); + PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; + PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; + PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Corectare"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Nivelare Axa X"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrare"); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Timeout Incalzitor"); + PROGMEM Language_Str MSG_REHEAT = _UxGT("Reincalzire"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Reincalzire..."); +} + +#if FAN_COUNT == 1 + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED + #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/buildroot/share/fonts/genallfont.sh b/buildroot/share/fonts/genallfont.sh index e41baac263a5..84f7bb92aa7f 100755 --- a/buildroot/share/fonts/genallfont.sh +++ b/buildroot/share/fonts/genallfont.sh @@ -62,7 +62,7 @@ OLDWD=`pwd` # # By default loop through all languages # -LANGS_DEFAULT="an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana ko_KR nl pl pt pt_br ru sk tr uk vi zh_CN zh_TW test" +LANGS_DEFAULT="an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana ko_KR nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test" # # Generate data for language list MARLIN_LANGS or all if not provided diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 32be906c9e5e..1c299ad30755 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -234,11 +234,11 @@ exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home # #restore_configs #opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done +#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done # #restore_configs #opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done +#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done ######## Example Configurations ############## # From 31349fd69af69dc855062ac7f8f6b3750ec5f1ca Mon Sep 17 00:00:00 2001 From: JP Flouret Date: Sat, 27 Jun 2020 21:09:15 -0700 Subject: [PATCH 046/483] Fix "probing failed" false positives (#18435) --- Marlin/src/module/probe.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 08aa53fc9676..b077b3a0e397 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -544,7 +544,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { // Do a first probe at the fast speed if (try_to_probe(PSTR("FAST"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_FAST), - sanity_check, _MAX(Z_CLEARANCE_BETWEEN_PROBES, 4) / 2) ) return NAN; + sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return NAN; const float first_probe_z = current_position.z; @@ -582,7 +582,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { { // Probe downward slowly to find the bed if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_SLOW), - sanity_check, _MAX(Z_CLEARANCE_MULTI_PROBE, 4) / 2) ) return NAN; + sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return NAN; TERN_(MEASURE_BACKLASH_WHEN_PROBING, backlash.measure_with_probe()); From 29753baeee75a00d3085c07643629b9e8439f447 Mon Sep 17 00:00:00 2001 From: Fabio Santos Date: Sat, 27 Jun 2020 21:53:44 -0700 Subject: [PATCH 047/483] Adjustable delta_diagonal_rod_trim (#18423) --- Marlin/src/gcode/calibrate/M665.cpp | 8 +++++++- Marlin/src/module/configuration_store.cpp | 15 +++++++++++---- Marlin/src/module/delta.cpp | 10 +++++----- Marlin/src/module/delta.h | 1 + 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp index 0436736b4a13..8b2e7f99ed49 100644 --- a/Marlin/src/gcode/calibrate/M665.cpp +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -38,8 +38,11 @@ * R = delta radius * S = segments per second * X = Alpha (Tower 1) angle trim - * Y = Beta (Tower 2) angle trim + * Y = Beta (Tower 2) angle trim * Z = Gamma (Tower 3) angle trim + * A = Alpha (Tower 1) digonal rod trim + * B = Beta (Tower 2) digonal rod trim + * C = Gamma (Tower 3) digonal rod trim */ void GcodeSuite::M665() { if (parser.seen('H')) delta_height = parser.value_linear_units(); @@ -49,6 +52,9 @@ if (parser.seen('X')) delta_tower_angle_trim.a = parser.value_float(); if (parser.seen('Y')) delta_tower_angle_trim.b = parser.value_float(); if (parser.seen('Z')) delta_tower_angle_trim.c = parser.value_float(); + if (parser.seen('A')) delta_diagonal_rod_trim.a = parser.value_float(); + if (parser.seen('B')) delta_diagonal_rod_trim.b = parser.value_float(); + if (parser.seen('C')) delta_diagonal_rod_trim.c = parser.value_float(); recalc_delta_settings(); } diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index e7de76000e0a..41ce618a0432 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -257,11 +257,12 @@ typedef struct SettingsDataStruct { // #if ENABLED(DELTA) float delta_height; // M666 H - abc_float_t delta_endstop_adj; // M666 XYZ + abc_float_t delta_endstop_adj; // M666 X Y Z float delta_radius, // M665 R delta_diagonal_rod, // M665 L delta_segments_per_second; // M665 S - abc_float_t delta_tower_angle_trim; // M665 XYZ + abc_float_t delta_tower_angle_trim, // M665 X Y Z + delta_diagonal_rod_trim; // M665 A B C #elif HAS_EXTRA_ENDSTOPS float x2_endstop_adj, // M666 X y2_endstop_adj, // M666 Y @@ -775,6 +776,7 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(delta_diagonal_rod); // 1 float EEPROM_WRITE(delta_segments_per_second); // 1 float EEPROM_WRITE(delta_tower_angle_trim); // 3 floats + EEPROM_WRITE(delta_diagonal_rod_trim); // 3 floats #elif HAS_EXTRA_ENDSTOPS @@ -1638,6 +1640,7 @@ void MarlinSettings::postprocess() { EEPROM_READ(delta_diagonal_rod); // 1 float EEPROM_READ(delta_segments_per_second); // 1 float EEPROM_READ(delta_tower_angle_trim); // 3 floats + EEPROM_READ(delta_diagonal_rod_trim); // 3 floats #elif HAS_EXTRA_ENDSTOPS @@ -2510,13 +2513,14 @@ void MarlinSettings::reset() { // #if ENABLED(DELTA) - const abc_float_t adj = DELTA_ENDSTOP_ADJ, dta = DELTA_TOWER_ANGLE_TRIM; + const abc_float_t adj = DELTA_ENDSTOP_ADJ, dta = DELTA_TOWER_ANGLE_TRIM, ddr = DELTA_DIAGONAL_ROD_TRIM_TOWER; delta_height = DELTA_HEIGHT; delta_endstop_adj = adj; delta_radius = DELTA_RADIUS; delta_diagonal_rod = DELTA_DIAGONAL_ROD; delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND; delta_tower_angle_trim = dta; + delta_diagonal_rod_trim = ddr; #endif #if ENABLED(X_DUAL_ENDSTOPS) @@ -3065,7 +3069,7 @@ void MarlinSettings::reset() { , SP_Z_STR, LINEAR_UNIT(delta_endstop_adj.c) ); - CONFIG_ECHO_HEADING("Delta settings: L R H S XYZ"); + CONFIG_ECHO_HEADING("Delta settings: L R H S XYZ ABC"); CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR_P( PSTR(" M665 L"), LINEAR_UNIT(delta_diagonal_rod) @@ -3075,6 +3079,9 @@ void MarlinSettings::reset() { , SP_X_STR, LINEAR_UNIT(delta_tower_angle_trim.a) , SP_Y_STR, LINEAR_UNIT(delta_tower_angle_trim.b) , SP_Z_STR, LINEAR_UNIT(delta_tower_angle_trim.c) + , PSTR(" A"), LINEAR_UNIT(delta_diagonal_rod_trim.a) + , PSTR(" B"), LINEAR_UNIT(delta_diagonal_rod_trim.b) + , PSTR(" C"), LINEAR_UNIT(delta_diagonal_rod_trim.c) ); #elif HAS_EXTRA_ENDSTOPS diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 56b9e0a11e19..84293936ea6b 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -59,6 +59,7 @@ abc_float_t delta_tower_angle_trim; xy_float_t delta_tower[ABC]; abc_float_t delta_diagonal_rod_2_tower; float delta_clip_start_height = Z_MAX_POS; +abc_float_t delta_diagonal_rod_trim; float delta_safe_distance_from_top(); @@ -67,17 +68,16 @@ float delta_safe_distance_from_top(); * settings have been changed (e.g., by M665). */ void recalc_delta_settings() { - constexpr abc_float_t trt = DELTA_RADIUS_TRIM_TOWER, - drt = DELTA_DIAGONAL_ROD_TRIM_TOWER; + constexpr abc_float_t trt = DELTA_RADIUS_TRIM_TOWER; delta_tower[A_AXIS].set(cos(RADIANS(210 + delta_tower_angle_trim.a)) * (delta_radius + trt.a), // front left tower sin(RADIANS(210 + delta_tower_angle_trim.a)) * (delta_radius + trt.a)); delta_tower[B_AXIS].set(cos(RADIANS(330 + delta_tower_angle_trim.b)) * (delta_radius + trt.b), // front right tower sin(RADIANS(330 + delta_tower_angle_trim.b)) * (delta_radius + trt.b)); delta_tower[C_AXIS].set(cos(RADIANS( 90 + delta_tower_angle_trim.c)) * (delta_radius + trt.c), // back middle tower sin(RADIANS( 90 + delta_tower_angle_trim.c)) * (delta_radius + trt.c)); - delta_diagonal_rod_2_tower.set(sq(delta_diagonal_rod + drt.a), - sq(delta_diagonal_rod + drt.b), - sq(delta_diagonal_rod + drt.c)); + delta_diagonal_rod_2_tower.set(sq(delta_diagonal_rod + delta_diagonal_rod_trim.a), + sq(delta_diagonal_rod + delta_diagonal_rod_trim.b), + sq(delta_diagonal_rod + delta_diagonal_rod_trim.c)); update_software_endstops(Z_AXIS); set_all_unhomed(); } diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index f263a28ddd31..ff18e74c71c5 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -37,6 +37,7 @@ extern abc_float_t delta_tower_angle_trim; extern xy_float_t delta_tower[ABC]; extern abc_float_t delta_diagonal_rod_2_tower; extern float delta_clip_start_height; +extern abc_float_t delta_diagonal_rod_trim; /** * Recalculate factors used for delta kinematics whenever From ed96b507b90836940c05840206dc4216c1682646 Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Sun, 28 Jun 2020 07:59:02 +0300 Subject: [PATCH 048/483] Russian, Ukranian for wide LCD (#18433) --- Marlin/src/lcd/language/language_ru.h | 618 +++++++++++++++------ Marlin/src/lcd/language/language_uk.h | 762 ++++++++++++++++++++++---- 2 files changed, 1102 insertions(+), 278 deletions(-) diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index b559acad4633..229e8199375a 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -36,15 +36,27 @@ namespace Language_ru { constexpr uint8_t CHARSIZE = 2; PROGMEM Language_Str LANGUAGE = _UxGT("Russian"); - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" готов."); + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Готов."); + PROGMEM Language_Str MSG_YES = _UxGT("Да"); + PROGMEM Language_Str MSG_NO = _UxGT("Ðет"); PROGMEM Language_Str MSG_BACK = _UxGT("Ðазад"); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Карта вÑтавлена"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Карта извлечена"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("ЭндÑтопы"); // Max length 8 characters + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Прерывание..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD-карта вÑтавлена"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD-карта извлечена"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Ð’Ñтавьте SD-карту"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Ошибка ÑчитываниÑ"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB диÑк удалён"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Ошибка USB диÑка"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполнение вызова"); + #else + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполн. вызова"); + #endif PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр. ÑндÑтопы"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Меню"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("ЭндÑтопы"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("ОÑновное меню"); PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Другие наÑтройки"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("ÐаÑтройки"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("КонфигурациÑ"); PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ÐвтоÑтарт"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Выключить двигатели"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню отладки"); @@ -53,14 +65,19 @@ namespace Language_ru { PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Парковка X"); PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Парковка Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Парковка Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Ðвто Z-выравнивание"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Ðулевое положение"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Ðажмите чтобы начать"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ°"); PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Выравнивание готово!"); PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Ð’Ñ‹Ñота Ñпада"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Запомнить парковку"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Коррекции применены"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Запомнить ноль"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("УÑтанов. ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¼Ð°"); + #else + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("УÑтанов.Ñмещ.дома"); + #endif + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ð¡Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ñ‹"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("УÑтановить ноль"); PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ðагрев ") PREHEAT_1_LABEL " ~"; PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" Ñопло"); @@ -75,38 +92,55 @@ namespace Language_ru { PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Ðагрев ") PREHEAT_2_LABEL _UxGT(" вÑÑ‘"); PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Ðагрев ") PREHEAT_2_LABEL _UxGT(" Ñтол"); PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ðагрев ") PREHEAT_2_LABEL _UxGT(" правка"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Ðагрев Свой"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждение"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Управление лазером"); PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Выключить лазер"); PROGMEM Language_Str MSG_LASER_ON = _UxGT("Включить лазер"); PROGMEM Language_Str MSG_LASER_POWER = _UxGT("МощноÑÑ‚ÑŒ лазера"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Шпиндель управление"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Управление шпинделем"); PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Выключить шпиндель"); PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Включить шпиндель"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("МощноÑÑ‚ÑŒ шпинделÑ"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("МощноÑÑ‚ÑŒ шпинделÑ"); + #else + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Мощн.шпинделÑ"); + #endif PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("ИнверÑÐ¸Ñ ÑˆÐ¿Ð¸Ð½Ð´ÐµÐ»Ñ"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Включить питание"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Выключить питание"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("ЭкÑтрузиÑ"); PROGMEM Language_Str MSG_RETRACT = _UxGT("Ð’Ñ‚Ñгивание"); PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Движение по оÑÑм"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Калибровка Ñтола"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Калибровать Ñтол"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Выравнивание Ñтола"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("ВыровнÑÑ‚ÑŒ Ñтол"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("ВыровнÑÑ‚ÑŒ углы"); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Следующий угол"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Смещение по Z"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Правка Ñетки окончена"); + #else + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Смещение Z"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Правка окончена"); + #endif PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Редактировать Ñетку"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Правка Ñетки окончена"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Точка Ñетки:"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Точка Ñетки"); PROGMEM Language_Str MSG_MESH_X = _UxGT("Ð˜Ð½Ð´ÐµÐºÑ X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ð˜Ð½Ð´ÐµÐºÑ Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Значение Z"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Свои команды"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("Проверка Z-датчика"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 теÑÑ‚ Z-зонда"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Отклонение"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("Измерение"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 точка"); + + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Меню IDEX"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Ðвто парковка"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Размножение"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Полный контроль"); - // TODO: IDEX Menu PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Размещение Ñопел"); PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2-е Ñопло X"); @@ -114,72 +148,115 @@ namespace Language_ru { PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2-е Ñопло Z"); PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("ВыполнÑем G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Утилиты UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Калибровка UBL"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Правка Ñетки вручную"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Z-пробник и замеры"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("ИнÑтрументы UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("ÐаÑтройка UBL"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Точка разворота"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручной ввод Ñетки"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("РазмеÑтить шайбу и измерить"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Убрать и замерить Ñтол"); + #else + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Разм.шайбу,измерить"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Убрать, измер. Ñтол"); + #endif PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Измерение"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Убрать и замер Ñтола"); PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("ДвигаемÑÑ Ð´Ð°Ð»ÑŒÑˆÐµ"); PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Ðктивировать UBL"); PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивировать UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура Ñтола"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура Ñтола"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура Ñопла"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура Ñопла"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Редактор Ñеток"); PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Править Ñвою Ñетку"); + + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура Ñтола"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура Ñтола"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура Ñопла"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура Ñопла"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("ПоÑтроить Ñвою Ñетку"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка Ñетки завершена"); + #else + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" Ñтола, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" Ñтола, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" Ñопла, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" Ñопла, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("ПоÑтроить Ñвою"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка завершена"); + #endif PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ð¢Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° Ñетки"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка Ñетки завершена"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("ПоÑтроить Ñвою Ñетку"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("ПоÑтроить Ñетку"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("ПоÑтроить Ñетку ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("ПоÑтроить Ñетку ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("ПоÑтроить хол. Ñетку"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("ПоÑтроить холодную Ñетку"); + #else + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Строить холод.Ñетку"); + #endif PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Правка выÑоты Ñетки"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Ð’Ñ‹Ñота"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Проверить Ñетку"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Проверить Ñетку ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Проверить Ñетку ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Проверить Ñвою Ñетку"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Проверить Ñетку ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Проверить Ñетку ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Проверить Ñвою Ñетку"); + #else + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Провер. Ñетку ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Провер. Ñетку ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Провер. Ñвою Ñетку"); + #endif + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрев Ñтола"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрев Ñопла"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ð ÑƒÑ‡Ð½Ð°Ñ Ð³Ñ€ÑƒÐ½Ñ‚Ð¾Ð²ÐºÐ°"); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Грунт фикÑ. длины"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Грунтовка Ñделана"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 завершена"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Выйти из G26"); PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Продолжить Ñетку"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Калибровка Ñетки"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Калибровка 3-Ñ… точек"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Выравнивание Ñетки"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Ñ… точечное выравнивание"); + #else + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-точечное выравн."); + #endif PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Калибровка раÑтера"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Выровнить Ñетку"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("ВыровнÑÑ‚ÑŒ Ñетку"); PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Крайние точки"); PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Тип карты"); PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("ВывеÑти карту Ñетки"); PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("ВывеÑти на хоÑÑ‚"); PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("ВывеÑти в CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Резервировать Ñетку"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Вывод информации UBL"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Сохранить Ñетку Ñнаружи"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Вывод информации UBL"); + #else + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Сохранить Ñнаружи"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ UBL"); + #endif PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Кол-во заполнителÑ"); PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ручное заполнение"); PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Умное заполнение"); PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Заполнить Ñетку"); PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Ðннулировать вÑÑ‘"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Обнулить ближ. точку"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ð¢Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° вÑего"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("ÐаÑÑ‚Ñ€. ближ. точки"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Ðннулир. ближайшую"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно править вÑÑ‘"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("ÐаÑÑ‚Ñ€. ближ. точку"); PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Хранилище Ñеток"); PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Слот памÑти"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Загрузить Ñетку Ñтола"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Сохранить Ñетку Ñтола"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Загрузить Ñетку"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Сохранить Ñетку"); PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Сетка %i загружена"); PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Сетка %i Ñохранена"); PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Ðет хранилища"); PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Ошибка: Сохран. UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Ошибка: ВоÑÑтан. UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Ошибка: ВоÑÑтан.UBL"); PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Смещение Z оÑтанов."); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Пошаговое UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.ПоÑтроить хол. Ñетку"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL пошагово"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Строить холодную"); PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Умное заполнение"); PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Проверить Ñетку"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ð¢Ð¾Ñ‡Ð½Ð°Ñ Ð½Ð°ÑÑ‚Ñ€. вÑего"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точно наÑÑ‚Ñ€. вÑÑ‘"); PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Проверить Ñетку"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ð¢Ð¾Ñ‡Ð½Ð°Ñ Ð½Ð°ÑÑ‚Ñ€. вÑего"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Сохранить Ñетку Ñтола"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Точно наÑÑ‚Ñ€. вÑÑ‘"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Сохранить Ñетку"); PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("ÐаÑтройка подÑветки"); PROGMEM Language_Str MSG_LEDS = _UxGT("ПодÑветка"); @@ -201,7 +278,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("ЯркоÑÑ‚ÑŒ"); PROGMEM Language_Str MSG_MOVING = _UxGT("ДвижемÑÑ..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("ОÑвобождаем XY"); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("ОÑвободить XY"); PROGMEM Language_Str MSG_MOVE_X = _UxGT("Движение по X"); PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Движение по Y"); PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Движение по Z"); @@ -214,29 +291,39 @@ namespace Language_ru { PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Движение 10мм"); PROGMEM Language_Str MSG_SPEED = _UxGT("СкороÑÑ‚ÑŒ"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Ñтола"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C"; PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Сопло ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Стол"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Сопло запарковано"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Сопло ожидает"); + PROGMEM Language_Str MSG_BED = _UxGT("Стол, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C"; PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Кулер"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Кулер ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Кулер доп."); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Кулер доп. ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Обдув платы"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Обороты проÑтоÑ"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Сохранённый кулер ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Дополн. кулер"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Дополн. кулер ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Контроллер кулера"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("ХолоÑтые обороты"); PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Ðвтовключение"); PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Рабочие обороты"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("ПроÑтой поÑле"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Период проÑтоÑ"); PROGMEM Language_Str MSG_FLOW = _UxGT("Поток"); PROGMEM Language_Str MSG_FLOW_N = _UxGT("Поток ~"); PROGMEM Language_Str MSG_CONTROL = _UxGT("ÐаÑтройки"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Мин"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" МакÑ"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С мин"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С макÑ"); PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Ðвтотемпература"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Ðвтотемпер."); PROGMEM Language_Str MSG_LCD_ON = _UxGT("Вкл"); PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Выкл"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("ÐвтонаÑтройка"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("ÐвтонаÑтройка *"); + + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("Ðвтоподбор PID"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Ðвтоподбор PID *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Подбор PID выполнен"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Сбой автоподбора. Плохой ÑкÑтрудер."); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Сбой автоподбора. Температура повышена."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Сбой автоподбора! Завершение времени."); + PROGMEM Language_Str MSG_SELECT = _UxGT("Выбор"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Выбор *"); PROGMEM Language_Str MSG_ACC = _UxGT("УÑкорение"); @@ -245,126 +332,210 @@ namespace Language_ru { PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-рывок"); PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-рывок"); PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-рывок"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("БыÑтрота"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("VÐ¼Ð°ÐºÑ ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("VÐ¼Ð°ÐºÑ ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("VÐ¼Ð°ÐºÑ ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("VÐ¼Ð°ÐºÑ ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("VÐ¼Ð°ÐºÑ *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vмин"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vпутеш. мин"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("УÑкорение"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("AÐ¼Ð°ÐºÑ ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("AÐ¼Ð°ÐºÑ ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("AÐ¼Ð°ÐºÑ ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("AÐ¼Ð°ÐºÑ ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("AÐ¼Ð°ÐºÑ *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-втÑгивание"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-путеш."); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Шаг/мм"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("шаг/мм"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("шаг/мм"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("шаг/мм"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Eшаг/мм"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*шаг/мм"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Отклонение узла"); + #else + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Отклон. узла"); + #endif + PROGMEM Language_Str MSG_VELOCITY = _UxGT("СкороÑÑ‚ÑŒ, мм/Ñ"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Скор.Ð¼Ð°ÐºÑ ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Скор.Ð¼Ð°ÐºÑ ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Скор.Ð¼Ð°ÐºÑ ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Скор.Ð¼Ð°ÐºÑ ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Скор.Ð¼Ð°ÐºÑ *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("Скор.мин"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Перемещение мин"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("УÑкорение, мм/Ñ2"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("УÑкор.Ð¼Ð°ÐºÑ ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("УÑкор.Ð¼Ð°ÐºÑ ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("УÑкор.Ð¼Ð°ÐºÑ ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("УÑкор.Ð¼Ð°ÐºÑ ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("УÑкор.Ð¼Ð°ÐºÑ *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("УÑкор.втÑгив."); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("УÑкор.путеш."); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("ЧаÑтота макÑ."); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Подача мин."); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Шагов/мм"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" шаг/мм"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" шаг/мм"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" шаг/мм"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E шаг/мм"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* шаг/мм"); PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); PROGMEM Language_Str MSG_MOTION = _UxGT("Движение"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Филамент"); PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диаметр филамента"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Диаметр филамента *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Загрузка мм"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Выгрузка мм"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K продвижениÑ"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("КонтраÑÑ‚ LCD"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E огран.,мм³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E огран. *"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диам. филамента"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Диам. филамента *"); + #else + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диам. филам."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Диам. филам. *"); + #endif + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Загрузка, мм"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Выгрузка, мм"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("KоÑÑ„. продвиж."); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("KоÑÑ„. продвиж. *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("КонтраÑÑ‚ Ñкрана"); PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Сохранить наÑтройки"); PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Загрузить наÑтройки"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Вернуть наÑтройки"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Изначальный EEPROM"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Ðа базовые параметры"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ EEPROM"); + #else + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Инициализ. EEPROM"); + #endif + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Сбой EEPROM: CRC"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Сбой EEPROM: индекÑ"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Сбой EEPROM: верÑиÑ"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Параметры Ñохранены"); PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Обновление прошивки"); PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Обновить"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Обновить"); PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Главный Ñкран"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Подготовить"); PROGMEM Language_Str MSG_TUNE = _UxGT("ÐаÑтроить"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Монитор питаниÑ"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Ток"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("ÐапрÑжение"); + PROGMEM Language_Str MSG_POWER = _UxGT("МощноÑÑ‚ÑŒ"); PROGMEM Language_Str MSG_START_PRINT = _UxGT("Ðачало печати"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Дальше"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("ИнициализациÑ"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("ОÑтановить"); + + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Дальше"); //short text for buttons + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Иниц-Ñ"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Стоп"); PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Печать"); PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("СброÑ"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Игнорир."); PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Отмена"); PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Готово"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Ðазад"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Продолжить"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Пауза печати"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Продолжить печать"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("ОÑтановить печать"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Печать объекта"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Завершить объект"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Завершить объект ="); PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("ВоÑÑтановение ÑбоÑ"); PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Печать Ñ SD карты"); PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Ðет SD карты"); PROGMEM Language_Str MSG_DWELL = _UxGT("Сон..."); PROGMEM Language_Str MSG_USERWAIT = _UxGT("Продолжить..."); PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Печать на паузе"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Печать..."); PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Печать отменена"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Печать завершена"); PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ðет движениÑ."); PROGMEM Language_Str MSG_KILLED = _UxGT("УБИТО. "); PROGMEM Language_Str MSG_STOPPED = _UxGT("ОСТÐÐОВЛЕÐО. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ð’Ñ‚Ñгивание мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Ð’Ñ‚Ñгивание Ñмены мм"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ð’Ñ‚Ñгивание, мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Смена втÑгив., мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Возврат Ñмены, мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Возврат Ñмены, V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ÐвтовтÑгивание"); + #else + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ð’Ñ‚Ñгив., мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Смена втÑг.,мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Возвр.Ñмены,мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Возвр.Ñмены V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ÐвтовтÑгив."); + #endif + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("ПодÑкок, мм"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ð’Ñ‚Ñгивание V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ð’Ñ‚Ñг. прыжка мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Возврат мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Возврат Ñмены мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Возврат, мм"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Возврат V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Возврат Ñмены V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ÐвтовтÑгивание"); - // TODO: Filament Change Swap / Purge Length + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("ПоменÑÑ‚ÑŒ длины"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("ПоменÑÑ‚ÑŒ дополнительно"); + #else + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("ПоменÑÑ‚ÑŒ дополнит."); + #endif + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("ОчиÑтить длину"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Смена Ñопел"); PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("ПоднÑтие по Z"); - - // TODO: Singlenozzle, nozzle standby - + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñкор."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("СкороÑÑ‚ÑŒ втÑгив."); + #else + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Ðачаль.Ñкор."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Скор.втÑгив."); + #endif + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Парковать голову"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Вернуть ÑкороÑÑ‚ÑŒ"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Обороти кулера"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Ð’Ñ€ÐµÐ¼Ñ ÐºÑƒÐ»ÐµÑ€Ð°"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Ðвто Вкл."); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Ðвто Выкл."); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Замена инÑтрумента"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Ðвто замена"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("ПоÑледний ÑкÑтрудер"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Замена на *"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Смена филамента"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Смена филамента *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Загрузка филамента"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Загрузка филамента *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Выгрузка филамента *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Загрузить филамент"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Загрузить филамент *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Выгрузить филамент *"); + #else + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Подать филамент *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Убрать филамент *"); + #endif PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Выгрузить вÑÑ‘"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Ðктивировать SD"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("УÑтановить SD карту"); PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Сменить SD карту"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Деактивировать SD"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-датчик вне Ñтола"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("ОÑвободить SD карту"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-зонд вне Ñтола"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Фактор наклона"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("Z-зонд BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("ТеÑтирование BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Ð¡Ð±Ñ€Ð¾Ñ BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("ОпуÑтить BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("ПоднÑÑ‚ÑŒ BLTouch"); - - // TODO: TouchMI Probe, Manual deploy/stow - - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Паркуй %s%s%s Ñначала"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("ОтÑтупы Z-датчика"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("ОпуÑтить BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Режим SW"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Режим 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Режим OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Режим ÑохранениÑ"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("УÑтановить на 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("УÑтановить на OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Слив отчёта"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ОПÐСÐОСТЬ: Ðеправильные параметры приводÑÑ‚ к повреждениÑм! Продолжить?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("Z-Зонд TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("ИнициализациÑ"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("ТеÑÑ‚ Z-ÑмещениÑ"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Сохранить"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("УÑтановить TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("УÑтановить зонд"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Загрузить зонд"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Сначала паркуй %s%s%s"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Ð¡Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Z-зонда"); PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Смещение X"); PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Смещение Y"); PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Смещение Z"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Микрошаг X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Микрошаг Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Микрошаг Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Сработал концевик"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Разогрев не удалÑÑ"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Ðеудача нагрева Ñтола"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Ошибка: Ð˜Ð·Ð±Ñ‹Ñ‚Ð¾Ñ‡Ð½Ð°Ñ Ð¢"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("УБЕГÐÐИЕ ТЕПЛÐ"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("УБЕГÐÐИЕ ТЕПЛРСТОЛÐ"); - // TODO: Heated chamber + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Сбой нагрева Ñтола"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Сбой нагрева камеры"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Ошибка:Ð˜Ð·Ð±Ñ‹Ñ‚Ð¾Ñ‡Ð½Ð°Ñ Ð¢"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("УТЕЧКРТЕПЛÐ"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("УТЕЧКРТЕПЛРСТОЛÐ"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("УТЕЧКРТЕПЛРКÐМЕРЫ"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Ошибка: Т макÑ."); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Ошибка: Т мин."); PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Ошибка: Т Ñтола макÑ"); PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Ошибка: Т Ñтола мин."); - // TODO: Heated chamber + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Ошибка:Т камеры макÑ"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Ошибка:Т камеры мин."); PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Паркуй XY Ñначала"); PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИÐТЕР ОСТÐÐОВЛЕÐ"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Сделайте ÑброÑ"); @@ -374,8 +545,9 @@ namespace Language_ru { PROGMEM Language_Str MSG_HEATING = _UxGT("Ðагрев..."); PROGMEM Language_Str MSG_COOLING = _UxGT("Охлаждение..."); PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ðагрев Ñтола..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ðагрев камеры..."); PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охлаждение Ñтола..."); - // TODO: Heated chamber + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охладжение камеры..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калибровка Delta"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калибровать X"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калибровать Y"); @@ -383,67 +555,151 @@ namespace Language_ru { PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калибровать центр"); PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("ÐаÑтройки Delta"); PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Ðвто калибровка"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Задать выÑоту Delta"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Задать Z-Ñмещение"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Диаг. Ñтержень"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Ð’Ñ‹Ñота Delta"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондировать Z-Ñмещение"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стержень диагонали"); + #else + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондир. Z-ÑмещениÑ"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стержень диаг."); + #endif PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Ð’Ñ‹Ñота"); PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("РадиуÑ"); PROGMEM Language_Str MSG_INFO_MENU = _UxGT("О принтере"); PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Данные принтера"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Калибровка 3-Ñ… точек"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Калибровка линейнаÑ"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Калибровка билинейнаÑ"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Калибровка UBL"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Калибровка Ñетки"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точечное выравнивание"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Линейное выравнивание"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Билинейное выравнивание"); + #else + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точ. выравнив."); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Линейное выравн."); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Билин. выравнив."); + #endif + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Управление UBL"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Выравнивание Ñетки"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("СтатиÑтика принтера"); PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Данные платы"); PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("ТермиÑторы"); PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("ЭкÑтрудеры"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("СкороÑÑ‚ÑŒ БОД"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("СкороÑÑ‚ÑŒ,БОД"); PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Протокол"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль темп.: Выкл"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контроль темп.: Вкл"); - + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль утечки Т: Выкл"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контроль утечки Т: Вкл"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ñ…Ð¾Ñ‚ÐµÐ½Ð´Ð°"); + #else + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контр.утечки Т:Выкл"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контр.утечки Т:Вкл"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚.хот-а"); + #endif PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("ПодÑветка корпуÑа"); PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("ЯркоÑÑ‚ÑŒ подÑветки"); PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Ðеверный принтер"); #if LCD_WIDTH >= 20 PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Счётчик печати"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Закончено"); PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Общее Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸"); PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Ðаидольшее задание"); PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Длина филамента"); #else PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Отпечатков"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Закончено"); PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Ð’Ñего"); PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Ðаидольшее"); PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Выдавлено"); #endif - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Температура мин."); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Температура макÑ"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Мин. ") LCD_STR_THERMOMETER; + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("МакÑ. ") LCD_STR_THERMOMETER; PROGMEM Language_Str MSG_INFO_PSU = _UxGT("БП"); PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Сила привода"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Привод %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Привод %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Привод %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Привод %"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("ЗапиÑÑŒ DAC EEPROM"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Привод, %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Привод, %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Привод, %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Привод, %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("СБОЙ СВЯЗИ С TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("ЗапиÑÑŒ DAC в EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("ЗÐМЕÐРФИЛÐМЕÐТÐ"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("ПЕЧÐТЬ ÐРПÐУЗЕ"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ЗÐГРУЗКРФИЛÐМЕÐТÐ"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("ВЫГРУЗКРФИЛÐМЕÐТÐ"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ОПЦИИ ВОЗОБÐОВЛЕÐИЯ:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ОПЦИИ ПРОДОЛЖЕÐИЯ:"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Выдавить ещё"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Возобновить печать"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Сопла: "); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Возврат не удалÑÑ"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Ðе удалоÑÑŒ прощупать"); - PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: ÐÐ¸Ð·ÐºÐ°Ñ Ð¢"); - - // TODO: MMU2 + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Датчик оконч. филамента"); + #else + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Датчик оконч.филам."); + #endif + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("До конца, мм"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Ошибка парковки"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Ошибка зондированиÑ"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: ÐÐ¸Ð·ÐºÐ°Ñ Ð¢") LCD_STR_DEGREE; - // TODO: Mixing + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ВЫБИРЕТЕ ФИЛÐМЕÐТ"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("ÐаÑтройки MMU"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Обновить прошивку MMU!"); + #else + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Обнови прошивку MMU"); + #endif + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU требует вниманиÑ"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Продолжить печать"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Продолжение..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Загрузить филамент"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Загрузить вÑÑ‘"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Загрузить в Ñопло"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Извлечь филамент"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Извлечь филамент ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Выгрузить филамент"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Загрузка %i..."); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Извлечение филамента..."); + #else + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Извлеч.филамента..."); + #endif + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Выгрузка...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Ð’ÑÑ‘"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Филамент ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("ПерезапуÑк MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("ПерезапуÑк MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Удалите и нажмите"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_MIX = _UxGT("Смешивание"); + #else + PROGMEM Language_Str MSG_MIX = _UxGT("Смешив."); + #endif + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Компонент ="); + PROGMEM Language_Str MSG_MIXER = _UxGT("СмеÑитель"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Градиент"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Полний градиент"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Цикличное Ñмешивание"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Градиент ÑмешиваниÑ"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Сменить градиент"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Переключить Ñмешивание"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð’-инÑтрум."); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Ðачало Ð’-инÑтрумента"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Конец Ð’-инÑтрумента"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдоним Ð’-инÑтрумента"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð¡Ð±Ñ€Ð¾Ñ Ð’-инÑтрументов"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-инÑтрументи Ñброшены"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Смешать Ð’-инÑтрументи"); + #else + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перекл. Ñмешивание"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Ðктив.Ð’-инÑтрум."); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Ð’-инÑтрум.нач."); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ð’-инÑтрум.кон."); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдоним Ð’-инÑÑ‚Ñ€."); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð¡Ð±Ñ€Ð¾Ñ Ð’-инÑтрум."); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-инÑтрум. Ñброшены"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Смешать Ð’-инÑтрум."); + #endif + PROGMEM Language_Str MSG_START_Z = _UxGT("Ðачало Z"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Конец Z"); PROGMEM Language_Str MSG_GAMES = _UxGT("Игры"); PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Кирпичи"); @@ -451,26 +707,40 @@ namespace Language_ru { PROGMEM Language_Str MSG_SNAKE = _UxGT("Змейка"); PROGMEM Language_Str MSG_MAZE = _UxGT("Лабиринт"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Плохой Ð¸Ð½Ð´ÐµÐºÑ Ñтраницы"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ÐŸÐ¾Ð»Ð¾Ñ…Ð°Ñ ÑкороÑÑ‚ÑŒ Ñтраницы"); + #else + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("ÐŸÐ¾Ð»Ð¾Ñ…Ð°Ñ Ñтраница"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ÐŸÐ¾Ð»Ð¾Ñ…Ð°Ñ Ñкор.Ñтран."); + #endif + + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Парковка...")); // // Filament Change screens show up to 3 lines on a 4-line display // ...or up to 2 lines on a 3-line display // #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Ожидайте", "начала Ñмены", "филамента")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Ожидайте", "выгрузки", "филамента")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Ð’Ñтавьте пруток", "и нажмите кнопку", "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Ðажмите кнопку длÑ", "нагрева Ñопла...")); + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Ðажмите кнопку", "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ", "печати")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Ожидайте начала", "Ñмены филамента")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Ð’Ñтавьте филамент", "и нажмите кнопку", "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_3_LINE("Ðажмите кнопку", "Ð´Ð»Ñ Ð½Ð°Ð³Ñ€ÐµÐ²Ð°", "Ñопла...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Ðагрев Ñопла", "Ждите...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Ожидайте", "загрузки прутка")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Ожидайте", "выгрузки", "филамента")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Ожидайте", "загрузки", "филамента")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Ожидайте", "ÑкÑтрузии", "филамента")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Ðажмите кнопку", "Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ", "очиÑтки филамента")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Ожидайте", "возобновлениÑ", "печати")); #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Продолжить печать")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Ожидайте...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Выгрузка...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Ð’Ñтавь и нажми")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Ðагреть Ñопло")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Ðагрев...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Выгрузка...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Загрузка...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Выдавливание...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Завершить очиÑтку")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Возобновление...")); #endif @@ -481,7 +751,27 @@ namespace Language_ru { PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Режим шага"); PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); - // TODO: Service + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("СброÑ"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" в:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Люфт"); + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("ИÑправление"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Сглаживание"); - // TODO: Backlash + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Уровень оÑи X"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Ðвто калибровка"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ð³Ñ€ÐµÐ²Ð°Ñ‚ÐµÐ»Ñ Ð²Ñ‹ÑˆÐ»Ð¾"); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ð³Ñ€ÐµÐ². вышло"); + #endif + PROGMEM Language_Str MSG_REHEAT = _UxGT("Возобновить нагрев"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Ðагрев..."); } + +#if FAN_COUNT == 1 + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED + #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index c5d85fe6bf98..2572d1b0ae11 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -37,205 +37,739 @@ namespace Language_uk { constexpr uint8_t CHARSIZE = 2; PROGMEM Language_Str LANGUAGE = _UxGT("Ukranian"); - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" готовий."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Картка вÑтавлена"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Картка видалена"); + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Готовий."); + PROGMEM Language_Str MSG_YES = _UxGT("ТÐК"); + PROGMEM Language_Str MSG_NO = _UxGT("ÐІ"); + PROGMEM Language_Str MSG_BACK = _UxGT("Ðазад"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("ПерериваннÑ..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD-картка вÑтавлена"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD-картка видалена"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Ð’Ñтавте SD-картку"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Помилка зчитуваннÑ"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB диÑк видалений"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Помилка USB диÑку"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("ÐŸÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Програмні кінцевики"); + #else + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переповн. виклику"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр.кінцевики"); + #endif PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Кінцевик"); // Max length 8 characters - PROGMEM Language_Str MSG_MAIN = _UxGT("Меню"); + PROGMEM Language_Str MSG_MAIN = _UxGT("ОÑновне меню"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Інші налаштуваннÑ"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("КонфігураціÑ"); PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ÐвтоÑтарт"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Вимк. двигуни"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Вимкнути двигуни"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню Debug"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("ТеÑÑ‚ Progress Bar"); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ðвто паркуваннÑ"); PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ X"); PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Ðвто Z-вирівнюваннÑ"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("ÐŸÐ°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Почати"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Слідуюча Точка"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("ÐаÑтупна точка"); PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Завершено!"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Зберегти паркув."); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°ÑтоÑ."); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ð’Ñтанов. початок"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("ВиÑота Ñпаду"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ð’Ñтанов. Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼Ñƒ"); + #else + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ð’Ñтанов.зміщ.дому"); + #endif + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¹Ð½ÑÑ‚Ñ–"); + PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ð’Ñтановити ноль"); PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Ðагрів ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ðагрів ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Сопло"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Сопло ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ð’Ñе"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Стіл"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" нал."); + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñопло"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñопло ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" вÑе"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñтіл"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" налашт"); PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Ðагрів ") PREHEAT_2_LABEL; PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Ðагрів ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Сопло"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Сопло ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Ð’Ñе"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Стіл"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" нал."); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("ОхолодженнÑ"); + PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Ñопло"); + PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Ñопло ~"); + PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" вÑе"); + PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Ñтіл"); + PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" налашт"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Ðагрів Свій"); + PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Вимкнути нагрів"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ð°Ð·ÐµÑ€Ð¾Ð¼"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Вимкнути лазер"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Увімкнути лазер"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("ПотужніÑÑ‚ÑŒ лазера"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐ¿Ñ–Ð½Ð´ÐµÐ»ÐµÐ¼"); + #else + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Потуж.лазера"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керув. шпінделем"); + #endif + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Вимкнути шпіндель"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Увімкнути шпіндель"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінделÑ"); + #else + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінд."); + #endif + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("ÐапрÑмок шпінделÑ"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Увімкнути живленнÑ"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Вимкнути живленнÑ"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("ЕкÑтрузіÑ"); PROGMEM Language_Str MSG_RETRACT = _UxGT("Ð’Ñ‚ÑгуваннÑ"); PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Рух по оÑÑм"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("ÐÑ–Ð²ÐµÐ»ÑŽÐ²Ð°Ð½Ð½Ñ Ñтолу"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("ÐÑ–Ð²ÐµÐ»ÑŽÐ²Ð°Ð½Ð½Ñ Ñтолу"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ð’Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñтолу"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("ВирівнÑти Ñтіл"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("ВирівнÑти кути"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("ÐаÑтупний кут"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ Z"); + #else + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z"); + #endif + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Редагувати Ñітку"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Редагув. зупинено"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Точка Ñітки"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Ð†Ð½Ð´ÐµÐºÑ X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Ð†Ð½Ð´ÐµÐºÑ Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("ВлаÑні команди"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 теÑÑ‚ зонду"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 точка"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("ВідхиленнÑ"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Меню IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñопел"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Ðвто паркуваннÑ"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("РозмноженнÑ"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Дзеркальна копіÑ"); + PROGMEM Language_Str MSG_IDEX_MODE_FU1L_CTRL = _UxGT("Повний контроль"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("Друге Ñопло X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("Друге Ñопло Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("Друге Ñопло Z"); + + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("ВиконуєтьÑÑ G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("ІнÑтрументи UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ UBL"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Точка розвороту"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручне Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñітки"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("РозміÑтити шайбу Ñ– вимір."); + #else + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручне введ. Ñітки"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Розм. шайбу Ñ– вимір."); + #endif + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("ВимірюваннÑ"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Видалити Ñ– вимірÑти"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("До наÑтупної точки"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Ðктивувати UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивувати UBL"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура Ñтолу"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура Ñтолу"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура Ñопла"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура Ñопла"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати Ñвою Ñітку"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñітки"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати Ñвою Ñітку"); + #else + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" Ñтолу, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" Ñтолу, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" Ñопла, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" Ñопла, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати Ñвою"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне редаг. Ñітки"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати Ñвою"); + #endif + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñітки"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Сітка побудована"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Будувати Ñітку"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Будувати Ñітку ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Будувати Ñітку ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Буд. холодну Ñітку"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ð’Ñтан.виÑоту Ñітки"); + PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("ВиÑота"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Підтвердити Ñітку"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Підтвердити ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Підтвердити ") PREHEAT_2_LABEL; + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Підтвердити Ñвою"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрів Ñтолу"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрів Ñопла"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ручне грунтуваннÑ"); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Грунт фікÑ. довж."); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Грунтув. виконане"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 завершена"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Вийти з G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Продовжити Ñітку"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Ð’Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñітки"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-точкове вирівн."); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Ð’Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ€Ð°Ñтру"); + #else + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Вирівнюв. раÑтру"); + #endif + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("ВирівнÑти Ñітку"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Крайні точки"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Тип мапи Ñітки"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("ВивеÑти мапу Ñітки"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("ВивеÑти на хоÑÑ‚"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("ВивеÑти в CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Зберегти зовні"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ð¾ UBL"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("ОбÑÑг заповнювача"); + #else + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("ОбÑÑг заповн."); + #endif + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ручне заповненнÑ"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Розумне заповненнÑ"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Заповнити Ñітку"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Ðнулювати вÑе"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Ðнулювати найближчу"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налашт. вÑе"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно налашт.найближчу"); + #else + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно найближчу"); + #endif + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñітки"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Слот пам'ÑÑ‚Ñ–"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Завантажити Ñітку"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Зберегти Ñітку"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Сітка %i завантажена"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Сітка %i збережена"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Ðемає ноÑÑ–Ñ"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Збій: збереж. UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Збій: відновл. UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z зупинено"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL покроково"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Будувати холодну"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Розумне заповн-Ñ"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Затвердити Ñітку"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точно налашт.вÑе"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Затвердити Ñітку"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Точно налашт.вÑе"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Зберегти Ñітку"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñвітлом"); + PROGMEM Language_Str MSG_LEDS = _UxGT("ПідÑвітка"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("ПередуÑтановки Ñвітла"); + #else + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("ПередуÑтан. Ñвітла"); + #endif + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Червоний"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Оранжевий"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Жовтий"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Зелений"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Синій"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Індіго"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Фіолетовий"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Білий"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("За умовчаннÑм"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Свої кольори"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Рівень червоного"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Рівень зеленого"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Рівень Ñинього"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Рівень білого"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("ЯÑкравіÑÑ‚ÑŒ"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("ПереміщеннÑ..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Звільнити XY"); PROGMEM Language_Str MSG_MOVE_X = _UxGT("Рух по X"); PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Рух по Y"); PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Рух по Z"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("ЕкÑтрудер"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("ЕкÑтрудер *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Рух по %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Рух по 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Рух по 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Рух по 10mm"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Сопло дуже холодне"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Рух по %sмм"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Рух по 0.1мм"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Рух по 1мм"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Рух по 10мм"); PROGMEM Language_Str MSG_SPEED = _UxGT("ШвидкіÑÑ‚ÑŒ"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Столу"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C"; PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Сопло ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Стіл"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Охолодж."); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Охолодж. ~"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Сопло запарковане"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Сопло очикує"); + PROGMEM Language_Str MSG_BED = _UxGT("Стіл, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("ОхолодженнÑ"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ~"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збережене охолодж. ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Додаткове охолодж."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Додаткове охолодж. ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Контролер охолодженнÑ"); + #else + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збереж.охолодж. ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Додат. охолодж."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Додат.охолодж ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Контролер охолодж."); + #endif + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("ХолоÑÑ‚Ñ– оберти"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Робочі оберти"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Ðвто-режим"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Період проÑтою"); PROGMEM Language_Str MSG_FLOW = _UxGT("Потік"); PROGMEM Language_Str MSG_FLOW_N = _UxGT("Потік ~"); PROGMEM Language_Str MSG_CONTROL = _UxGT("ÐалаштуваннÑ"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Мін"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" МакÑ"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Факт"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С мін"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С макÑ"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор"); PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Ðвтотемпер."); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Увімк."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Увімк"); PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Вимк."); + + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("Ðвтопідбір PID"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Ðвтопідбір PID *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Підбір PID виконано"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Збій автопідбору. Поганий екÑтрудер."); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Збій автопідбору. Температура завищена."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Збій автопідбору! Ð—Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ‡Ð°Ñу."); + PROGMEM Language_Str MSG_SELECT = _UxGT("Вибрати"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Вибрати *"); - PROGMEM Language_Str MSG_ACC = _UxGT("ПриÑк."); + PROGMEM Language_Str MSG_ACC = _UxGT("ПриÑкорореннÑ"); PROGMEM Language_Str MSG_JERK = _UxGT("Ривок"); PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-ривок"); PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-ривок"); PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-ривок"); PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-ривок"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("VмакÑ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("VмакÑ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("VмакÑ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("VмакÑ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("VÐ¼Ð°ÐºÑ *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vмін"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vруху мін"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("AÐ¼Ð°ÐºÑ ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("AÐ¼Ð°ÐºÑ ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("AÐ¼Ð°ÐºÑ ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("AÐ¼Ð°ÐºÑ ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("AÐ¼Ð°ÐºÑ *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-втÑгув."); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-руху"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Кроків/мм"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("кроків/мм"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("кроків/мм"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("кроків/мм"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Eкроків/мм"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*кроків/мм"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Ð’Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ð°"); + #else + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Відхил.вузла"); + #endif + PROGMEM Language_Str MSG_VELOCITY = _UxGT("ШвидкіÑÑ‚ÑŒ, мм/Ñ"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Швидк.Ð¼Ð°ÐºÑ ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Швидк.Ð¼Ð°ÐºÑ ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Швидк.Ð¼Ð°ÐºÑ ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Швидк.Ð¼Ð°ÐºÑ ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Швидк.Ð¼Ð°ÐºÑ *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("Швидк.мін"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¼Ñ–Ð½"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("ПриÑкореннÑ, мм/Ñ2"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("ПриÑк.Ð¼Ð°ÐºÑ ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("ПриÑк.Ð¼Ð°ÐºÑ ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("ПриÑк.Ð¼Ð°ÐºÑ ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("ПриÑк.Ð¼Ð°ÐºÑ ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("ПриÑк.Ð¼Ð°ÐºÑ *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("ПриÑк.втÑгув."); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("ПриÑк.переміщ."); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("ЧаÑтота макÑ."); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Подача мін."); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Кроків на мм"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" кроків/мм"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" кроків/мм"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" кроків/мм"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E кроків/мм"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* кроків/мм"); PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); PROGMEM Language_Str MSG_MOTION = _UxGT("Рух"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Волокно"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Пруток"); PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Діам. волок."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Діам. волок. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("контраÑÑ‚ LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Зберегти в ПЗП"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Зчитати з ПЗП"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Відновити базові"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Поновити"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("ІнформаціÑ"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E обмеж.,мм³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E обмеж. *"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Діам. прутка"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Діам. прутка *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Вивантаж., мм"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Завантаж., мм"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Kоеф. проÑув."); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Kоеф. проÑув. *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("КонтраÑÑ‚ екрану"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Зберегти в EEPROM"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Зчитати з EEPROM"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Ðа базові параметри"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Ð†Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ EEPROM"); + #else + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Ініціаліз. EEPROM"); + #endif + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Збій EEPROM: CRC"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Збій EEPROM: індекÑ"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Збій EEPROM: верÑÑ–Ñ"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Параметри збережені"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Оновити SD-картку"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Зкинути принтер"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Поновити"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Головний екран"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Підготувати"); PROGMEM Language_Str MSG_TUNE = _UxGT("ПідлаштуваннÑ"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Монітор живленнÑ"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Струм"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Ðапруга"); + PROGMEM Language_Str MSG_POWER = _UxGT("ПотужніÑÑ‚ÑŒ"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Почати друк"); + + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Далі"); //short text for buttons + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Ініц-Ñ"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Зупинка"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Друк"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Зкинути"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ігнорув."); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Відміна"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Готово"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Ðазад"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Продовжити"); + + PROGMEM Language_Str MSG_PAUSING = _UxGT("ПризупиненнÑ..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Призупинити друк"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Відновити друк"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("СкаÑувати друк"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Друк об'єкта"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Завершити об'єкт"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Завершити об'єкт ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Віднов. піÑÐ»Ñ Ð·Ð±Ð¾ÑŽ"); PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Друкувати з SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("ВідÑÑƒÑ‚Ð½Ñ SD карт."); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD-картки немає"); PROGMEM Language_Str MSG_DWELL = _UxGT("СплÑчка..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ñ–Ð¹..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Продовжити..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Друк призупинено"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Друк..."); PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Друк ÑкаÑовано"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Друк завершено"); PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ðемає руху."); PROGMEM Language_Str MSG_KILLED = _UxGT("ПЕРЕРВÐÐО. "); PROGMEM Language_Str MSG_STOPPED = _UxGT("ЗУПИÐЕÐО. "); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Зміна волокна"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Зміна волокна *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Старт SD картки"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Заміна SD карти"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z дет. не в межах"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ð’Ñ‚ÑгуваннÑ, мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Зміна втÑгув.,мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("ПоверненнÑ, мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Поверн.зміни, мм"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ÐвтовтÑгуваннÑ"); + #else + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ð’Ñ‚Ñгув., мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Зміна втÑг.мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Поверн., мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Повер.зміни,мм"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ÐвтовтÑгув."); + #endif + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ð’Ñ‚ÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("ПідÑкок, мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ÐŸÐ¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Поверн.зміни V"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("ПомінÑти довжини"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("ПомінÑти додатково"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("ОчиÑтити довжину"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Зміна Ñопла"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("ПіднÑти по Z"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Початк.швидкіÑÑ‚ÑŒ"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("ШвидкіÑÑ‚ÑŒ втÑгув."); + #else + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Початк.швидк."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Швидк.втÑгув."); + #endif + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Паркувати голову"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Відновити швидкіÑÑ‚ÑŒ"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти охолодженнÑ"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Ð§Ð°Ñ Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ"); + #else + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти охолодж."); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Ð§Ð°Ñ Ð¾Ñ…Ð¾Ð»Ð¾Ð´Ð¶."); + #endif + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Ðвто Увімк."); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Ðвто Вимкн."); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Заміна інÑтрументу"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Ðвто заміна"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("ОÑтанній екÑтрудер"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Заміна на *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Заміна прутка"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Заміна прутка *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Подати пруток"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Подати пруток *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Видалити пруток"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Видалити пруток *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Видалити вÑе"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Ð’Ñтавити SD-картку"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Заміна SD-картки"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Звільніть SD-картку"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-Зонд поза Ñтолом"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Фактор нахилу"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("Z-зонд BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Само-ТеÑÑ‚"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Скинути BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Зкинути BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("ПіднÑти зонд"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("ОпуÑтити зонд"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Режим SW"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Режим 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Режим OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Режим збереженнÑ"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Ð’Ñтановити на 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Ð’Ñтановити на OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Злив звіту"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ÐЕБЕЗПЕКÐ: Ðеправильні параметри приводÑÑ‚ÑŒ до пошкоджень! Продовжувати?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("Z-Зонд TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("ІніціалізаціÑ"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("ТеÑÑ‚ Z-зміщеннÑ"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Зберегти"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("УÑтановити TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("УÑтановити зонд"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Завантажити зонд"); PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Дім %s%s%s перший"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð¾Ð½Ð´Ñƒ"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ X"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Y"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("ТеÑÑ‚ Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Z"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Мікрокрок X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Мікрокрок Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Мікрокрок Z"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("невдача кінцевика"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Ðевдалий нагрів"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ЗБІЙ ТЕМПЕРÐТУРИ"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Дім XY перший"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Кінцевик Ñпрацював"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Збій нагріву"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Збій нагріву Ñтолу"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Збій нагріву камери"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("ЗÐВИЩЕÐРТ") LCD_STR_DEGREE; + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ВИТІК ТЕПЛÐ"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ВИТІК ТЕПЛРСТОЛУ"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ВИТІК ТЕПЛРКÐМЕРИ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ПЕРЕГРІВ"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE; + PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("ПЕРЕГРІВ СТОЛУ"); + PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE _UxGT(" СТОЛУ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("ПЕРЕГРІВ КÐМЕРИ"); + PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE _UxGT(" КÐМЕРИ"); + PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Першим дім по XY"); PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИÐТЕР ЗУПИÐЕÐО"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Перезавантажте"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("г"); // One character only PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("Ñ…"); // One character only PROGMEM Language_Str MSG_HEATING = _UxGT("ÐагріваннÑ..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("ÐÐ°Ð³Ñ€Ñ–Ð²Ð°Ð½Ð½Ñ Ñтолу..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібр. Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("ÐšÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("ÐšÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("ÐšÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калібр. Центру"); + PROGMEM Language_Str MSG_COOLING = _UxGT("ОхолодженнÑ..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ðагрів Ñтолу..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ðагрів камери..."); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñтолу..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("ÐžÑ…Ð¾Ð»Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ°Ð¼ÐµÑ€Ð¸..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("ÐšÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Delta"); + #else + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охол. Ñтолу..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охол. камери..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібрув. Delta"); + #endif + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калібрувати X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калібрувати Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Калібрувати Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калібр. центр"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Параметри Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("ÐвтокалібруваннÑ"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("ВиÑота Delta"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Ð—Ð¾Ð½Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Z-зміщ."); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стрижень діагоналі"); + #else + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондув. Z-зміщ."); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стрижень діаг."); + #endif + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("ВиÑота"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("РадіуÑ"); PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Про принтер"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("ІнформаціÑ"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("СтатиÑтика"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Данні принтера"); + + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точкове вирівнюваннÑ"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівнюваннÑ"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівнюваннÑ"); + #elif LCD_WIDTH == 20 + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точкове вирівнюв."); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівнюван."); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівнюв."); + #else + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точк. вирівн."); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівн."); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білін. вирівнюв."); + #endif + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ UBL"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Ð’Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñітки"); + + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("СтатиÑтика принтера"); PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Про плату"); PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("ТерміÑтори"); PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("ЕкÑтрудери"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("біт/Ñ"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Біт/Ñекунду"); PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Протокол"); - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("ПідÑвітка"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Ðеправильний принтер"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Вимк"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Увімк"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñтою хотенду"); + #else + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контр.витіку ") LCD_STR_THERMOMETER _UxGT(" Вимк"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контр.витіку ") LCD_STR_THERMOMETER _UxGT(" Увімк"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Ð§Ð°Ñ Ð¿Ñ€Ð¾ÑÑ‚. хот-у"); + #endif + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("ПідÑвітка"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("ЯÑкравіÑÑ‚ÑŒ Ñвітла"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("ÐЕ ТОЙ ПРИÐТЕР"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("ЕкÑтрудовано"); #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("К-ÑÑ‚ÑŒ друків"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("КількіÑÑ‚ÑŒ друків"); PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("ВеÑÑŒ Ñ‡Ð°Ñ Ð´Ñ€ÑƒÐºÑƒ"); PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Ðайдовший чаÑ"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("ЕкÑтрудовано"); #else PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Друків"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Загалом"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Ðайдовший"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("ЕкÑдруд."); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Ðайдовше"); #endif - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Мін Темп."); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("ÐœÐ°ÐºÑ Ð¢ÐµÐ¼Ð¿."); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Джерело жив."); - + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Мін. ") LCD_STR_THERMOMETER; + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("МакÑ. ") LCD_STR_THERMOMETER; + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Блок жив-нÑ"); PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Сила мотору"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X % мотору"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y % мотору"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z % мотору"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E % мотору"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Ð—Ð°Ð¿Ð¸Ñ Ð¦ÐП на ПЗП"); - + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("Драйвер X, %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Драйвер Y, %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Драйвер Z, %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("Драйвер E, %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ЗБІЙ ЗВ'ЯЗКУ З TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Ð—Ð°Ð¿Ð¸Ñ Ð¦ÐП у EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("ЗÐМІÐРПРУТКÐ"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("ЗУПИÐКРДРУКУ"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ЗÐÐ’ÐÐТÐЖИТИ ПРУТОК"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("ВИВÐÐТÐЖИТИ ПРУТОК"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ПÐРÐМЕТРИ ПРОДОВЖЕÐÐЯ:"); + #else + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ПÐРÐÐœ.ПРОДОВЖЕÐÐЯ:"); + #endif + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Видавити ще"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Відновити друк"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Сопло: "); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Датчик Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("ВідÑтань закінч.,мм"); + #else + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Датчик закінч.прутка"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("До закінч.,мм"); + #endif + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Помилка паркуваннÑ"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Помилка зондуваннÑ"); + PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: низька Т") LCD_STR_DEGREE; + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ОБЕРІТЬ ПРУТОК"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Понови прошивку MMU!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU потребує уваги"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Продовжити друк"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("ПродовженнÑ..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Завантажити пруток"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Завантажити вÑе"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Завантажити в Ñопло"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Звільнити пруток"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Звільнити пруток ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Вивантажити пруток"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ð—Ð²Ñ–Ð»ÑŒÐ½ÐµÐ½Ð½Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Ð’Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Ð’Ñе"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Пруток ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("ПерезапуÑк MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("ПерезапуÑк MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Видаліть, натиÑніть"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_MIX = _UxGT("ЗмішуваннÑ"); + #else + PROGMEM Language_Str MSG_MIX = _UxGT("Змішув."); + #endif + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Компонент ="); + PROGMEM Language_Str MSG_MIXER = _UxGT("Змішувач"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Градієнт"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Повний градієнт"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Циклічне змішуваннÑ"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Градієнт змішуваннÑ"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Змінити градієнт"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перемкнути змішуваннÑ"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð’-інÑтрументу"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Початок Ð’-інÑтрументу"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Кінець Ð’-інÑтрументу"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдонім Ð’-інÑтрументу"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð—ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð’-інÑтрументів"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрументи зкинуті"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати Ð’-інÑтрументи"); + #else + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перемкнути змішув."); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Ðктив.Ð’-інÑтрум."); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Ð’-інÑтрум. поч."); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ð’-інÑтрум. кін."); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("ПÑевдонім Ð’-інÑÑ‚Ñ€."); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ð—ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð’-інÑтрум"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ð’-інÑтрум. зкинуті"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати Ð’-інÑтрум."); + #endif + PROGMEM Language_Str MSG_START_Z = _UxGT("Початок Z"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Кінець Z"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Ігри"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Цеглини"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("ВторгненнÑ"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Змійка"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Лабіринт"); + #if LCD_WIDTH > 21 + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Поганий Ñ–Ð½Ð´ÐµÐºÑ Ñторінки"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидкіÑÑ‚ÑŒ Ñторінки"); + #else + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Погана Ñторінка"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидк.Ñтор"); + #endif + + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("ПаркуваннÑ...")); #if LCD_HEIGHT >= 4 // Up to 3 lines allowed - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Зачекайте на", "початок заміни", "волокна")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Зачекайте на", "вивід волокна")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Ð’Ñтавте волокно", "та натиÑніть длÑ", "продовженнÑ...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Зачекайте на", "ввід волокна")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Зачекайте на", "відновленнÑ", "друку")); + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("ÐатиÑніть кнопку", "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ", "друку")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Зачекайте", "на початок", "заміни прутка")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Ð’Ñтавте пруток", "та натиÑніть", "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("ÐатиÑніть кнопку", "Ð´Ð»Ñ Ð½Ð°Ð³Ñ€Ñ–Ð²Ñƒ Ñопла")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Сопло нагріваєтьÑÑ", "зачекайте...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Зачекайте", "на вивід прутка")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Зачекайте", "на ввід прутка")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("ДочекайтеÑÑŒ", "Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("ÐатиÑніть кнопку", "Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ", "Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Зачекайте", "на відновленнÑ", "друку")); #else // Up to 2 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Продовжити друк")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Зачекайте...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Вивід...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Ð’Ñтавте Ñ– нат.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Ввід...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("ВідновленнÑ...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Ð’Ñтавте Ñ– натиÑніть")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Ðагріти Ñопло")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Ðагрів Ñопла...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Вивід прутка...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Ввід прутка...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Завершити очищеннÑ")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("ÐŸÐ¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ñ€ÑƒÐºÑƒ...")); #endif + + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Драйвери TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Струм драйвера"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Гібридний поріг"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Дім без кінцевиків"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Режим мікрокроку"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим увімк."); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("ЗкиданнÑ"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" в:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Люфт"); + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("ВиправленнÑ"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("ЗглажуваннÑ"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Рівень віÑÑ– X"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Ðвто калібруваннÑ"); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Ð§Ð°Ñ Ð½Ð°Ð³Ñ€Ñ–Ð²Ð°Ñ‡Ð° збіг"); + PROGMEM Language_Str MSG_REHEAT = _UxGT("Поновити нагрів"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("ÐагріваннÑ..."); } + +#if FAN_COUNT == 1 + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED + #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_FIRST_EXTRA_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif From f4e15967e8887b5e0010af73e64a947af0edc40e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 28 Jun 2020 00:12:22 -0500 Subject: [PATCH 049/483] Tweak pins formatting --- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 2 +- Marlin/src/pins/rambo/pins_RAMBO.h | 2 +- Marlin/src/pins/rambo/pins_SCOOVO_X9H.h | 2 +- Marlin/src/pins/sam/pins_ADSK.h | 4 ++-- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 2 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 4 ++-- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 2 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 9a7441936387..596c40540198 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -171,7 +171,7 @@ #define TEMP_2_PIN P0_26_A3 // A3 - (63) - J5-3 & AUX-2 #define TEMP_3_PIN P1_30_A4 // A4 - (37) - BUZZER_PIN //#define TEMP_4_PIN P1_31_A5 // A5 - (49) - SD_DETECT_PIN -//#define ?? P0_03_A6 // A6 - ( 0) - RXD0 - J4-4 & AUX-1 +//#define ?? P0_03_A6 // A6 - ( 0) - RXD0 - J4-4 & AUX-1 #define FILWIDTH_PIN P0_02_A7 // A7 - ( 1) - TXD0 - J4-5 & AUX-1 // diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 7a61053069f5..fecbb2620dea 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -112,7 +112,7 @@ #define E1_MS2_PIN 64 #define DIGIPOTSS_PIN 38 -#define DIGIPOT_CHANNELS { 4,5,3,0,1 } // X Y Z E0 E1 digipot channels to stepper driver mapping +#define DIGIPOT_CHANNELS { 4,5,3,0,1 } // X Y Z E0 E1 digipot channels to stepper driver mapping #ifndef DIGIPOT_MOTOR_CURRENT #define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) #endif diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h index 49237c706247..5439929ba7cd 100644 --- a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h +++ b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h @@ -92,7 +92,7 @@ #define E1_MS2_PIN 64 #define DIGIPOTSS_PIN 38 -#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping +#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping // // Temperature Sensors diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h index 61c2e1b494e6..116a6b87eecc 100644 --- a/Marlin/src/pins/sam/pins_ADSK.h +++ b/Marlin/src/pins/sam/pins_ADSK.h @@ -175,12 +175,12 @@ A stepper for E0 extruder #define ADC_BUTTONS_VALUE_SCALE (5.0/AREF_VOLTS) // The LCD module pullup voltage is 5.0V but ADC reference voltage is 3.3V - #define ADC_BUTTONS_R_PULLDOWN 4.7 // Moves voltage down to be bellow 3.3V instead of 5V + #define ADC_BUTTONS_R_PULLDOWN 4.7 // Moves voltage down to be bellow 3.3V instead of 5V // the resistors values will be scaled because of 4.7K pulldown parallel resistor #define _ADC_BUTTONS_R_SCALED(R) ((R) * (ADC_BUTTONS_R_PULLDOWN) / ((R) + ADC_BUTTONS_R_PULLDOWN)) // buttons pullup resistor - #define ADC_BUTTONS_R_PULLUP 4.7 // the resistor on the 2004 LCD panel + #define ADC_BUTTONS_R_PULLUP 4.7 // the resistor on the 2004 LCD panel // buttons resistors with scaled values because of parallel pulldown resistor #define ADC_BUTTONS_LEFT_R_PULLDOWN _ADC_BUTTONS_R_SCALED(0.47) #define ADC_BUTTONS_RIGHT_R_PULLDOWN _ADC_BUTTONS_R_SCALED(4.7) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 92feef321833..7aa02eb3e7c7 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -35,7 +35,7 @@ #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 6d8100e5d143..c1b2f3624997 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -33,7 +33,7 @@ #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index 661fbdb5e84d..5066fc04f522 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -35,7 +35,7 @@ #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index a835f69ea9bc..9396eb629bc4 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -41,7 +41,7 @@ #if ENABLED(FLASH_EEPROM_EMULATION) // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE) - #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) + #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE #else #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index e659dadb0967..a82637be9302 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -45,7 +45,7 @@ #if ENABLED(FLASH_EEPROM_EMULATION) // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE) - #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) + #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE #else #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index fc9cfd6a7ca2..a39635b91160 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -30,7 +30,7 @@ #define DISABLE_JTAG -#define pins_v2_20190128 // new pins define +#define pins_v2_20190128 // new pins define // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 @@ -40,7 +40,7 @@ // #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index e45059eab767..500a420babba 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -38,7 +38,7 @@ #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index aea7cedce718..87f1695b238b 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -163,7 +163,7 @@ #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64KB for now... #elif ENABLED(FLASH_EEPROM_EMULATION) // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE (EEPROM_PAGE_SIZE) #else diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 6d09b09aabbb..155db5a2238d 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -40,7 +40,7 @@ // #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 674deb6d5dbb..163d3e41e9f7 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -41,7 +41,7 @@ #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION // 2K in a AT24C16N - #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index fc9fa8721253..29699a4041b1 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -144,7 +144,7 @@ #endif #define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SDIO_CLOCK 4500000 // 4.5 MHz #define SD_DETECT_PIN PD12 #define ONBOARD_SD_CS_PIN PC11 From 30ee0d380090487eb7a78a940b07879e9d71cfda Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 28 Jun 2020 13:59:53 -0500 Subject: [PATCH 050/483] Suppress unused var warning --- Marlin/src/lcd/menu/menu_temperature.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 58ba8ae608f1..a94e79062793 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -97,7 +97,9 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #if HOTENDS == 1 PGM_P msg_preheat[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1), GET_TEXT(MSG_PREHEAT_2), GET_TEXT(MSG_PREHEAT_3), GET_TEXT(MSG_PREHEAT_4), GET_TEXT(MSG_PREHEAT_5)); - PGM_P msg_preheat_end[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END), GET_TEXT(MSG_PREHEAT_2_END), GET_TEXT(MSG_PREHEAT_3_END), GET_TEXT(MSG_PREHEAT_4_END), GET_TEXT(MSG_PREHEAT_5_END)); + #if HAS_HEATED_BED + PGM_P msg_preheat_end[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END), GET_TEXT(MSG_PREHEAT_2_END), GET_TEXT(MSG_PREHEAT_3_END), GET_TEXT(MSG_PREHEAT_4_END), GET_TEXT(MSG_PREHEAT_5_END)); + #endif #elif HAS_MULTI_HOTEND PGM_P msg_preheat_all[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_ALL), GET_TEXT(MSG_PREHEAT_2_ALL), GET_TEXT(MSG_PREHEAT_3_ALL), GET_TEXT(MSG_PREHEAT_4_ALL), GET_TEXT(MSG_PREHEAT_5_ALL)); #endif From 48151d177890d102c3e7adbc00ec5ee6f367a8fb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 28 Jun 2020 13:48:48 -0500 Subject: [PATCH 051/483] ClosedLoop as singleton --- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/feature/closedloop.cpp | 6 ++++-- Marlin/src/feature/closedloop.h | 11 +++++++++-- Marlin/src/gcode/calibrate/M12.cpp | 5 ++++- Marlin/src/module/planner.cpp | 11 ++++++----- buildroot/tests/mega1280-tests | 7 +++++-- 6 files changed, 29 insertions(+), 13 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 66d3c78ca464..b1aeaa40e19a 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1136,7 +1136,7 @@ void setup() { #endif #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) - SETUP_RUN(init_closedloop()); + SETUP_RUN(closedloop.init()); #endif #ifdef STARTUP_COMMANDS diff --git a/Marlin/src/feature/closedloop.cpp b/Marlin/src/feature/closedloop.cpp index b777243481ca..5d302683a17b 100644 --- a/Marlin/src/feature/closedloop.cpp +++ b/Marlin/src/feature/closedloop.cpp @@ -29,12 +29,14 @@ #include "closedloop.h" -void init_closedloop() { +ClosedLoop closedloop; + +void ClosedLoop::init() { OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, LOW); SET_INPUT_PULLUP(CLOSED_LOOP_MOVE_COMPLETE_PIN); } -void set_closedloop(const byte val) { +void ClosedLoop::set(const byte val) { OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, val); } diff --git a/Marlin/src/feature/closedloop.h b/Marlin/src/feature/closedloop.h index 7e5594447d0e..75c7109ce620 100644 --- a/Marlin/src/feature/closedloop.h +++ b/Marlin/src/feature/closedloop.h @@ -21,5 +21,12 @@ */ #pragma once -void init_closedloop(); -void set_closedloop(const byte val); +class ClosedLoop { +public: + static void init(); + static void set(const byte val); +}; + +extern ClosedLoop closedloop; + +#define CLOSED_LOOP_WAITING() (READ(CLOSED_LOOP_ENABLE_PIN) && !READ(CLOSED_LOOP_MOVE_COMPLETE_PIN)) diff --git a/Marlin/src/gcode/calibrate/M12.cpp b/Marlin/src/gcode/calibrate/M12.cpp index 26f15bb89213..97d5bbc1ab5b 100644 --- a/Marlin/src/gcode/calibrate/M12.cpp +++ b/Marlin/src/gcode/calibrate/M12.cpp @@ -28,9 +28,12 @@ #include "../../feature/closedloop.h" void GcodeSuite::M12() { + planner.synchronize(); + if (parser.seenval('S')) - set_closedloop(parser.value_int()); // Force a CLC set + closedloop.set(parser.value_int()); // Force a CLC set + } #endif diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 5715399e496c..1beb63c1a4ee 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -91,6 +91,10 @@ #include "../feature/power.h" #endif +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + #include "../feature/closedloop.h" +#endif + #if ENABLED(BACKLASH_COMPENSATION) #include "../feature/backlash.h" #endif @@ -1634,11 +1638,8 @@ float Planner::get_axis_position_mm(const AxisEnum axis) { * Block until all buffered steps are executed / cleaned */ void Planner::synchronize() { - while ( - has_blocks_queued() || cleaning_buffer_counter - #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) - || (READ(CLOSED_LOOP_ENABLE_PIN) && !READ(CLOSED_LOOP_MOVE_COMPLETE_PIN)) - #endif + while (has_blocks_queued() || cleaning_buffer_counter + || TERN0(EXTERNAL_CLOSED_LOOP_CONTROLLER, CLOSED_LOOP_WAITING()) ) idle(); } diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index 7f2872a0b46d..c9caf7d8525b 100644 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -20,8 +20,11 @@ opt_set LCD_LANGUAGE an opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING \ SENSORLESS_BACKOFF_MM HOMING_BACKOFF_POST_MM HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ - G26_MESH_VALIDATION MESH_EDIT_MENU GCODE_QUOTED_STRINGS -exec_test $1 $2 "Spindle, MESH_BED_LEVELING, and LCD" + G26_MESH_VALIDATION MESH_EDIT_MENU GCODE_QUOTED_STRINGS \ + EXTERNAL_CLOSED_LOOP_CONTROLLER +opt_set CLOSED_LOOP_ENABLE_PIN 44 +opt_set CLOSED_LOOP_MOVE_COMPLETE_PIN 45 +exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, and LCD" # # Test DUAL_X_CARRIAGE From ca4ade4c44e50b65a588b041735ed852b71ed721 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 29 Jun 2020 00:07:30 +0000 Subject: [PATCH 052/483] [cron] Bump distribution date (2020-06-29) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 04c666a9600b..6e079f3cf654 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-28" + #define STRING_DISTRIBUTION_DATE "2020-06-29" #endif /** From 69b5b91c9123537423147d7c76fb99dbd807480f Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 28 Jun 2020 22:59:08 -0700 Subject: [PATCH 053/483] MKS Robin Nano flash-based EEPROM (#18466) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 11 +++++++---- .../share/PlatformIO/ldscripts/mks_robin_nano.ld | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 29699a4041b1..2b9010f889a4 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -31,7 +31,7 @@ #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "MKS Robin nano" +#define BOARD_INFO_NAME "MKS Robin Nano" // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role @@ -41,10 +41,13 @@ // // EEPROM // -#if NO_EEPROM_SELECTED - //#define FLASH_EEPROM_EMULATION - #define SDCARD_EEPROM_EMULATION +#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) + #define FLASH_EEPROM_EMULATION + #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif + #define ENABLE_SPI2 // diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld index 785345543c0c..d8a138ca2e25 100755 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld +++ b/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld @@ -1,7 +1,7 @@ MEMORY { ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K + rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K } /* Provide memory region aliases for common.inc */ From bfcf7ac2fd164cdd079d419ad5ae48a5649de1f5 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 29 Jun 2020 08:02:36 +0200 Subject: [PATCH 054/483] Use "reset reason" defines (#18462) --- Marlin/src/HAL/STM32F1/HAL.cpp | 3 +-- Marlin/src/MarlinCore.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 658882943845..202d3bd5be4e 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -277,9 +277,8 @@ void HAL_clear_reset_source() { } /** * TODO: Check this and change or remove. - * currently returns 1 that's equal to poweron reset. */ -uint8_t HAL_get_reset_source() { return 1; } +uint8_t HAL_get_reset_source() { return RST_POWER_ON; } void _delay_ms(const int delay_ms) { delay(delay_ms); } diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index b1aeaa40e19a..1334b9506bdd 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -936,11 +936,11 @@ void setup() { // Check startup - does nothing if bootloader sets MCUSR to 0 const byte mcu = HAL_get_reset_source(); - if (mcu & 1) SERIAL_ECHOLNPGM(STR_POWERUP); - if (mcu & 2) SERIAL_ECHOLNPGM(STR_EXTERNAL_RESET); - if (mcu & 4) SERIAL_ECHOLNPGM(STR_BROWNOUT_RESET); - if (mcu & 8) SERIAL_ECHOLNPGM(STR_WATCHDOG_RESET); - if (mcu & 32) SERIAL_ECHOLNPGM(STR_SOFTWARE_RESET); + if (mcu & RST_POWER_ON) SERIAL_ECHOLNPGM(STR_POWERUP); + if (mcu & RST_EXTERNAL) SERIAL_ECHOLNPGM(STR_EXTERNAL_RESET); + if (mcu & RST_BROWN_OUT) SERIAL_ECHOLNPGM(STR_BROWNOUT_RESET); + if (mcu & RST_WATCHDOG) SERIAL_ECHOLNPGM(STR_WATCHDOG_RESET); + if (mcu & RST_SOFTWARE) SERIAL_ECHOLNPGM(STR_SOFTWARE_RESET); HAL_clear_reset_source(); serialprintPGM(GET_TEXT(MSG_MARLIN)); From 34b84d3e63ae313261e736389c60f8883701a70e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 30 Jun 2020 00:06:54 +0000 Subject: [PATCH 055/483] [cron] Bump distribution date (2020-06-30) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 6e079f3cf654..9e987c274f16 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-29" + #define STRING_DISTRIBUTION_DATE "2020-06-30" #endif /** From 2d6c17b044fc14162727fc5933de57d94973dfd5 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 1 Jul 2020 00:08:43 +0000 Subject: [PATCH 056/483] [cron] Bump distribution date (2020-07-01) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 9e987c274f16..f3fea10e0aac 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-06-30" + #define STRING_DISTRIBUTION_DATE "2020-07-01" #endif /** From 21cc924b75c037d87152ad57ec22cde8ada9fa8b Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 1 Jul 2020 18:10:46 +1200 Subject: [PATCH 057/483] Fix missing parenthesis (#18473) --- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index e34e098dfa10..8bf37fcd0220 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -1370,7 +1370,7 @@ #define STATUS_LOGO_X 0 #endif #ifndef STATUS_LOGO_Y - #define STATUS_LOGO_Y _MIN(0U, ((20 - (STATUS_LOGO_HEIGHT)) / 2) + #define STATUS_LOGO_Y _MIN(0U, (20 - (STATUS_LOGO_HEIGHT)) / 2) #endif #ifndef STATUS_LOGO_HEIGHT #define STATUS_LOGO_HEIGHT (sizeof(status_logo_bmp) / (STATUS_LOGO_BYTEWIDTH)) From 992dc14c86e6e4579481461375d3eb743dedab68 Mon Sep 17 00:00:00 2001 From: George Fu Date: Wed, 1 Jul 2020 14:13:00 +0800 Subject: [PATCH 058/483] Fix FYSETC CHEETAH V1.2 SD re-insert (#18474) Include this board with other Cheetah stepper reset. --- Marlin/src/sd/cardreader.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 2631edf4812e..53ba537311af 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -37,6 +37,7 @@ #include "../module/printcounter.h" #include "../gcode/queue.h" #include "../module/configuration_store.h" +#include "../module/stepper/indirection.h" #if ENABLED(EMERGENCY_PARSER) #include "../feature/e_parser.h" @@ -402,7 +403,7 @@ void CardReader::manage_media() { if (stat) { // Media Inserted safe_delay(500); // Some boards need a delay to get settled mount(); // Try to mount the media - #if MB(FYSETC_CHEETAH, FYSETC_AIO_II) + #if MB(FYSETC_CHEETAH, FYSETC_CHEETAH_V12, FYSETC_AIO_II) reset_stepper_drivers(); // Workaround for Cheetah bug #endif if (!isMounted()) stat = 0; // Not mounted? From d7e06198c5edfe76027789009581ca4b90704add Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 1 Jul 2020 18:14:18 +1200 Subject: [PATCH 059/483] Hide menu item with no fan (#18470) --- Marlin/src/lcd/menu/menu_configuration.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 9e4653cf3553..457f3dd174b7 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -307,8 +307,10 @@ void menu_advanced_settings(); #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0) START_MENU(); BACK_ITEM(MSG_CONFIGURATION); - editable.uint8 = uint8_t(ui.material_preset[m].fan_speed); - EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; }); + #if HAS_FAN + editable.uint8 = uint8_t(ui.material_preset[m].fan_speed); + EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; }); + #endif #if HAS_TEMP_HOTEND EDIT_ITEM(uint16_3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); #endif From 39105384ba1acfc387a687d053450b4b645cbb94 Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Wed, 1 Jul 2020 13:22:34 +0700 Subject: [PATCH 060/483] Permit independent X2,Y2,Z2,Z3,Z4 endstop inverting (#18481) --- Marlin/src/inc/Conditionals_post.h | 340 ++++++++++++++++------------- 1 file changed, 190 insertions(+), 150 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index be63d3ec36db..8eaa02b5e54b 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -660,20 +660,22 @@ */ #if ENABLED(X_DUAL_ENDSTOPS) #if X_HOME_DIR > 0 - #if X2_USE_ENDSTOP == _XMIN_ - #define X2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define X2_MAX_ENDSTOP_INVERTING false + #ifndef X2_MAX_ENDSTOP_INVERTING + #if X2_USE_ENDSTOP == _XMIN_ + #define X2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _XMAX_ + #define X2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _YMIN_ + #define X2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _YMAX_ + #define X2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _ZMIN_ + #define X2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _ZMAX_ + #define X2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define X2_MAX_ENDSTOP_INVERTING false + #endif #endif #ifndef X2_MAX_PIN #if X2_USE_ENDSTOP == _XMIN_ @@ -712,23 +714,27 @@ #define X2_MAX_PIN E7_DIAG_PIN #endif #endif - #define X2_MIN_ENDSTOP_INVERTING false - #else - #if X2_USE_ENDSTOP == _XMIN_ - #define X2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else + #ifndef X2_MIN_ENDSTOP_INVERTING #define X2_MIN_ENDSTOP_INVERTING false #endif + #else + #ifndef X2_MIN_ENDSTOP_INVERTING + #if X2_USE_ENDSTOP == _XMIN_ + #define X2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _XMAX_ + #define X2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _YMIN_ + #define X2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _YMAX_ + #define X2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _ZMIN_ + #define X2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif X2_USE_ENDSTOP == _ZMAX_ + #define X2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define X2_MIN_ENDSTOP_INVERTING false + #endif + #endif #ifndef X2_MIN_PIN #if X2_USE_ENDSTOP == _XMIN_ #define X2_MIN_PIN X_MIN_PIN @@ -766,7 +772,9 @@ #define X2_MIN_PIN E7_DIAG_PIN #endif #endif - #define X2_MAX_ENDSTOP_INVERTING false + #ifndef X2_MAX_ENDSTOP_INVERTING + #define X2_MAX_ENDSTOP_INVERTING false + #endif #endif #endif @@ -775,20 +783,22 @@ */ #if ENABLED(Y_DUAL_ENDSTOPS) #if Y_HOME_DIR > 0 - #if Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Y2_MAX_ENDSTOP_INVERTING false + #ifndef Y2_MAX_ENDSTOP_INVERTING + #if Y2_USE_ENDSTOP == _XMIN_ + #define Y2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _XMAX_ + #define Y2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _YMIN_ + #define Y2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _YMAX_ + #define Y2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _ZMIN_ + #define Y2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _ZMAX_ + #define Y2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define Y2_MAX_ENDSTOP_INVERTING false + #endif #endif #ifndef Y2_MAX_PIN #if Y2_USE_ENDSTOP == _XMIN_ @@ -827,23 +837,27 @@ #define Y2_MAX_PIN E7_DIAG_PIN #endif #endif - #define Y2_MIN_ENDSTOP_INVERTING false - #else - #if Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else + #ifndef Y2_MIN_ENDSTOP_INVERTING #define Y2_MIN_ENDSTOP_INVERTING false #endif + #else + #ifndef Y2_MIN_ENDSTOP_INVERTING + #if Y2_USE_ENDSTOP == _XMIN_ + #define Y2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _XMAX_ + #define Y2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _YMIN_ + #define Y2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _YMAX_ + #define Y2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _ZMIN_ + #define Y2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif Y2_USE_ENDSTOP == _ZMAX_ + #define Y2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define Y2_MIN_ENDSTOP_INVERTING false + #endif + #endif #ifndef Y2_MIN_PIN #if Y2_USE_ENDSTOP == _XMIN_ #define Y2_MIN_PIN X_MIN_PIN @@ -881,7 +895,9 @@ #define Y2_MIN_PIN E7_DIAG_PIN #endif #endif - #define Y2_MAX_ENDSTOP_INVERTING false + #ifndef Y2_MAX_ENDSTOP_INVERTING + #define Y2_MAX_ENDSTOP_INVERTING false + #endif #endif #endif @@ -891,20 +907,22 @@ #if ENABLED(Z_MULTI_ENDSTOPS) #if Z_HOME_DIR > 0 - #if Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z2_MAX_ENDSTOP_INVERTING false + #ifndef Z2_MAX_ENDSTOP_INVERTING + #if Z2_USE_ENDSTOP == _XMIN_ + #define Z2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _XMAX_ + #define Z2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _YMIN_ + #define Z2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _YMAX_ + #define Z2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _ZMIN_ + #define Z2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _ZMAX_ + #define Z2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define Z2_MAX_ENDSTOP_INVERTING false + #endif #endif #ifndef Z2_MAX_PIN #if Z2_USE_ENDSTOP == _XMIN_ @@ -943,23 +961,27 @@ #define Z2_MAX_PIN E7_DIAG_PIN #endif #endif - #define Z2_MIN_ENDSTOP_INVERTING false - #else - #if Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else + #ifndef Z2_MIN_ENDSTOP_INVERTING #define Z2_MIN_ENDSTOP_INVERTING false #endif + #else + #ifndef Z2_MIN_ENDSTOP_INVERTING + #if Z2_USE_ENDSTOP == _XMIN_ + #define Z2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _XMAX_ + #define Z2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _YMIN_ + #define Z2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _YMAX_ + #define Z2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _ZMIN_ + #define Z2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif Z2_USE_ENDSTOP == _ZMAX_ + #define Z2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define Z2_MIN_ENDSTOP_INVERTING false + #endif + #endif #ifndef Z2_MIN_PIN #if Z2_USE_ENDSTOP == _XMIN_ #define Z2_MIN_PIN X_MIN_PIN @@ -997,25 +1019,29 @@ #define Z2_MIN_PIN E7_DIAG_PIN #endif #endif - #define Z2_MAX_ENDSTOP_INVERTING false + #ifndef Z2_MAX_ENDSTOP_INVERTING + #define Z2_MAX_ENDSTOP_INVERTING false + #endif #endif #if NUM_Z_STEPPER_DRIVERS >= 3 #if Z_HOME_DIR > 0 - #if Z3_USE_ENDSTOP == _XMIN_ - #define Z3_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _XMAX_ - #define Z3_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _YMIN_ - #define Z3_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _YMAX_ - #define Z3_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _ZMIN_ - #define Z3_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _ZMAX_ - #define Z3_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z3_MAX_ENDSTOP_INVERTING false + #ifndef Z3_MAX_ENDSTOP_INVERTING + #if Z3_USE_ENDSTOP == _XMIN_ + #define Z3_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _XMAX_ + #define Z3_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _YMIN_ + #define Z3_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _YMAX_ + #define Z3_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _ZMIN_ + #define Z3_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _ZMAX_ + #define Z3_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define Z3_MAX_ENDSTOP_INVERTING false + #endif #endif #ifndef Z3_MAX_PIN #if Z3_USE_ENDSTOP == _XMIN_ @@ -1054,23 +1080,27 @@ #define Z3_MAX_PIN E7_DIAG_PIN #endif #endif - #define Z3_MIN_ENDSTOP_INVERTING false - #else - #if Z3_USE_ENDSTOP == _XMIN_ - #define Z3_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _XMAX_ - #define Z3_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _YMIN_ - #define Z3_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _YMAX_ - #define Z3_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _ZMIN_ - #define Z3_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _ZMAX_ - #define Z3_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else + #ifndef Z3_MIN_ENDSTOP_INVERTING #define Z3_MIN_ENDSTOP_INVERTING false #endif + #else + #ifndef Z3_MIN_ENDSTOP_INVERTING + #if Z3_USE_ENDSTOP == _XMIN_ + #define Z3_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _XMAX_ + #define Z3_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _YMIN_ + #define Z3_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _YMAX_ + #define Z3_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _ZMIN_ + #define Z3_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif Z3_USE_ENDSTOP == _ZMAX_ + #define Z3_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define Z3_MIN_ENDSTOP_INVERTING false + #endif + #endif #ifndef Z3_MIN_PIN #if Z3_USE_ENDSTOP == _XMIN_ #define Z3_MIN_PIN X_MIN_PIN @@ -1108,26 +1138,30 @@ #define Z3_MIN_PIN E7_DIAG_PIN #endif #endif - #define Z3_MAX_ENDSTOP_INVERTING false + #ifndef Z3_MAX_ENDSTOP_INVERTING + #define Z3_MAX_ENDSTOP_INVERTING false + #endif #endif #endif #if NUM_Z_STEPPER_DRIVERS >= 4 #if Z_HOME_DIR > 0 - #if Z4_USE_ENDSTOP == _XMIN_ - #define Z4_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _XMAX_ - #define Z4_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _YMIN_ - #define Z4_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _YMAX_ - #define Z4_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _ZMIN_ - #define Z4_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _ZMAX_ - #define Z4_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z4_MAX_ENDSTOP_INVERTING false + #ifndef Z4_MAX_ENDSTOP_INVERTING + #if Z4_USE_ENDSTOP == _XMIN_ + #define Z4_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _XMAX_ + #define Z4_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _YMIN_ + #define Z4_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _YMAX_ + #define Z4_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _ZMIN_ + #define Z4_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _ZMAX_ + #define Z4_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define Z4_MAX_ENDSTOP_INVERTING false + #endif #endif #ifndef Z4_MAX_PIN #if Z4_USE_ENDSTOP == _XMIN_ @@ -1166,23 +1200,27 @@ #define Z4_MAX_PIN E7_DIAG_PIN #endif #endif - #define Z4_MIN_ENDSTOP_INVERTING false - #else - #if Z4_USE_ENDSTOP == _XMIN_ - #define Z4_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _XMAX_ - #define Z4_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _YMIN_ - #define Z4_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _YMAX_ - #define Z4_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _ZMIN_ - #define Z4_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _ZMAX_ - #define Z4_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else + #ifndef Z4_MIN_ENDSTOP_INVERTING #define Z4_MIN_ENDSTOP_INVERTING false #endif + #else + #ifndef Z4_MIN_ENDSTOP_INVERTING + #if Z4_USE_ENDSTOP == _XMIN_ + #define Z4_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _XMAX_ + #define Z4_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _YMIN_ + #define Z4_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _YMAX_ + #define Z4_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _ZMIN_ + #define Z4_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #elif Z4_USE_ENDSTOP == _ZMAX_ + #define Z4_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #else + #define Z4_MIN_ENDSTOP_INVERTING false + #endif + #endif #ifndef Z4_MIN_PIN #if Z4_USE_ENDSTOP == _XMIN_ #define Z4_MIN_PIN X_MIN_PIN @@ -1220,7 +1258,9 @@ #define Z4_MIN_PIN E7_DIAG_PIN #endif #endif - #define Z4_MAX_ENDSTOP_INVERTING false + #ifndef Z4_MAX_ENDSTOP_INVERTING + #define Z4_MAX_ENDSTOP_INVERTING false + #endif #endif #endif From e5bc9d31cc87be5c7ef2bd3cd70c2599f76d2bd7 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 1 Jul 2020 03:30:24 -0300 Subject: [PATCH 061/483] Add TFT_LVGL_UI support (#18438) --- Marlin/Configuration.h | 7 +- .../STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp | 2 +- Marlin/src/MarlinCore.cpp | 9 +- Marlin/src/feature/touch/xpt2046.cpp | 56 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 27 +- .../extui/lib/mks_ui/draw_change_speed.cpp | 12 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 12 +- .../extui/lib/mks_ui/draw_error_message.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 8 +- .../lcd/extui/lib/mks_ui/draw_language.cpp | 12 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_opration.cpp | 12 +- .../extui/lib/mks_ui/draw_pause_message.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 86 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 10 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 48 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 119 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 9 +- .../lcd/extui/lib/mks_ui/gb2312_puhui16.cpp | 8 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 7 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 827 +++++------ Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 125 +- .../lcd/extui/lib/mks_ui/printer_opration.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 6 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 1294 ++++++++--------- .../extui/lib/mks_ui/tft_multi_language.cpp | 4 +- Marlin/src/pins/pins.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 65 + Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 65 + Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- platformio.ini | 19 +- 39 files changed, 1515 insertions(+), 1388 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6daedf815641..ac32add6b9cc 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2135,9 +2135,12 @@ //#define FSMC_GRAPHICAL_TFT // -// TFT Little VGL UI +// TFT LVGL UI // -//#define TFT_LITTLE_VGL_UI +// Default MKS icons and fonts: https://git.io/JJvzK +// Copy mks_pic and mks_font folders to the root of your SD +// +//#define TFT_LVGL_UI //============================================================================= //============================ Other Controllers ============================ diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp index cc26a003d19a..d61723e269eb 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp @@ -291,7 +291,7 @@ uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { return uint32_t(data); } -#if ENABLED(LCD_USE_DMA_FSMC) +#ifdef LCD_USE_DMA_FSMC void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { while (count > 0) { diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 1334b9506bdd..976edfe7ce70 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -59,7 +59,7 @@ #include "gcode/parser.h" #include "gcode/queue.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lvgl.h" #include "lcd/extui/lib/mks_ui/tft_lvgl_configuration.h" #include "lcd/extui/lib/mks_ui/draw_ui.h" @@ -743,7 +743,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { // Direct Stepping TERN_(DIRECT_STEPPING, page_manager.write_responses()); - #if ENABLED(TFT_LITTLE_VGL_UI) + #if ENABLED(TFT_LVGL_UI) LV_TASK_HANDLER(); #endif } @@ -1180,7 +1180,8 @@ void setup() { SETUP_RUN(page_manager.init()); #endif - #if ENABLED(TFT_LITTLE_VGL_UI) + #if ENABLED(TFT_LVGL_UI) + if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts SETUP_RUN(tft_lvgl_init()); #endif @@ -1216,7 +1217,7 @@ void loop() { endstops.event_handler(); - TERN_(TFT_LITTLE_VGL_UI, printer_state_polling()); + TERN_(TFT_LVGL_UI, printer_state_polling()); } while (ENABLED(__AVR__)); // Loop forever on slower (AVR) boards } diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index 463034d96b98..9c84e4d95ca9 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -101,39 +101,41 @@ void XPT2046::init() { #include "../../lcd/ultralcd.h" // For EN_C bit mask uint8_t XPT2046::read_buttons() { - int16_t tsoffsets[4] = { 0 }; - - if (tsoffsets[0] + tsoffsets[1] == 0) { - // Not yet set, so use defines as fallback... - tsoffsets[0] = XPT2046_X_CALIBRATION; - tsoffsets[1] = XPT2046_X_OFFSET; - tsoffsets[2] = XPT2046_Y_CALIBRATION; - tsoffsets[3] = XPT2046_Y_OFFSET; - } + #ifdef HAS_SPI_LCD + int16_t tsoffsets[4] = { 0 }; + + if (tsoffsets[0] + tsoffsets[1] == 0) { + // Not yet set, so use defines as fallback... + tsoffsets[0] = XPT2046_X_CALIBRATION; + tsoffsets[1] = XPT2046_X_OFFSET; + tsoffsets[2] = XPT2046_Y_CALIBRATION; + tsoffsets[3] = XPT2046_Y_OFFSET; + } - // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible. + // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible. - if (!isTouched()) return 0; - const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], - y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; - if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. + if (!isTouched()) return 0; + const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], + y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; + if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. - // Touch within the button area simulates an encoder button - if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) - return WITHIN(x, 14, 77) ? EN_D - : WITHIN(x, 90, 153) ? EN_A - : WITHIN(x, 166, 229) ? EN_B - : WITHIN(x, 242, 305) ? EN_C - : 0; + // Touch within the button area simulates an encoder button + if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) + return WITHIN(x, 14, 77) ? EN_D + : WITHIN(x, 90, 153) ? EN_A + : WITHIN(x, 166, 229) ? EN_B + : WITHIN(x, 242, 305) ? EN_C + : 0; - if (x > TOUCH_SCREEN_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0; + if (x > TOUCH_SCREEN_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0; - // Column and row above BUTTON_AREA_TOP - int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH), - row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT); + // Column and row above BUTTON_AREA_TOP + int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH), + row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT); - // Send the touch to the UI (which will simulate the encoder wheel) - MarlinUI::screen_click(row, col, x, y); + // Send the touch to the UI (which will simulate the encoder wheel) + MarlinUI::screen_click(row, col, x, y); + #endif return 0; } diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 20fd44f5801f..0f602246b42f 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -64,7 +64,7 @@ #include -#if ENABLED(LCD_USE_DMA_FSMC) +#ifdef LCD_USE_DMA_FSMC extern void LCD_IO_WriteReg(uint16_t Reg); extern void LCD_IO_WriteData(uint16_t RegValue); extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp index 21ed3f999cb6..2ad14357a143 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp @@ -22,7 +22,7 @@ #include "../../../../inc/MarlinConfigPre.h" #if 1 // ENABLED(SPI_FLASH) -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include #include "../../../../inc/MarlinConfig.h" @@ -391,5 +391,5 @@ void ext_FLASH::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16 void ext_FLASH::lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);} -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI #endif // 1 ... SPI_FLASH diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index 8193563e41f7..a65bf818ec1b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -99,29 +99,28 @@ void lv_draw_about(void) { fw_version = lv_label_create(scr, NULL); lv_obj_set_style(fw_version, &tft_style_lable_rel); - lv_label_set_text(fw_version, "Version: V_2.0.5.3"); + lv_label_set_text(fw_version, SHORT_BUILD_VERSION); lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60); fw_type = lv_label_create(scr, NULL); lv_obj_set_style(fw_type, &tft_style_lable_rel); - #if (MOTHERBOARD == BOARD_MKS_ROBIN_PRO) - lv_label_set_text(fw_type, "Firmware: Robin_Pro35"); - #elif (MOTHERBOARD == BOARD_MKS_ROBIN_NANO) - lv_label_set_text(fw_type, "Firmware: Robin_Nano35"); - #endif + lv_label_set_text(fw_type, + #if MB(MKS_ROBIN_PRO) + "Firmware: Robin_Pro35" + #elif MB(MKS_ROBIN_NANO) + "Firmware: Robin_Nano35" + #else + CUSTOM_MACHINE_NAME + #endif + ); lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20); board = lv_label_create(scr, NULL); lv_obj_set_style(board, &tft_style_lable_rel); - #if (MOTHERBOARD == BOARD_MKS_ROBIN_PRO) - lv_label_set_text(board, "Board: MKS Robin pro"); - #elif (MOTHERBOARD == BOARD_MKS_ROBIN_NANO) - lv_label_set_text(board, "Board: MKS Robin nano"); - #endif - + lv_label_set_text(board, "Board: " BOARD_INFO_NAME); lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, 20); } void lv_clear_about() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index 6d44ecb71c1c..864b5781b443 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -310,13 +310,13 @@ void disp_print_speed() { void disp_speed_type() { switch (speedType) { case 1: - lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct_speed_sel.bin", 0); - lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_Mov_speed.bin", 0); + lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_extruct_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_changespeed.bin", 0); break; default: - lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct_speed.bin", 0); - lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_Mov_speed_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct.bin", 0); + lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_sel.bin", 0); break; } lv_obj_refresh_ext_draw_pad(buttonExt); @@ -333,4 +333,4 @@ void disp_speed_type() { void lv_clear_change_speed() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 5620af8c99fa..c87df26b1d37 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -26,7 +26,7 @@ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -61,7 +61,9 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (DialogType == DIALOG_TYPE_PRINT_FILE) { - preview_gcode_prehandle(list_file.file_name[sel_id]); + #if HAS_GCODE_PREVIEW + preview_gcode_prehandle(list_file.file_name[sel_id]); + #endif reset_print_time(); start_print_time(); @@ -202,7 +204,7 @@ void lv_draw_dialog(uint8_t type) { style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM; style_btn_rel.body.radius = LV_RADIUS_CIRCLE; style_btn_rel.text.color = lv_color_hex3(0xDEF); - style_btn_rel.text.font = &gb2312_puhui32; + style_btn_rel.text.font = &lv_font_roboto_22; static lv_style_t style_btn_pr; // A variable to store the pressed style lv_style_copy(&style_btn_pr, &style_btn_rel); // Initialize from the released style @@ -211,7 +213,7 @@ void lv_draw_dialog(uint8_t type) { style_btn_pr.body.grad_color = lv_color_hex3(0x24A); style_btn_pr.body.shadow.width = 2; style_btn_pr.text.color = lv_color_hex3(0xBCD); - style_btn_pr.text.font = &gb2312_puhui32; + style_btn_pr.text.font = &lv_font_roboto_22; lv_obj_t * labelDialog = lv_label_create(scr, NULL); lv_obj_set_style(labelDialog, &tft_style_lable_rel); @@ -340,4 +342,4 @@ void lv_draw_dialog(uint8_t type) { void lv_clear_dialog() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index de57804c2d41..6c7a73d8cfb1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -81,4 +81,4 @@ void lv_draw_error_message(PGM_P const msg) { void lv_clear_error_message() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 14d7ed0410ed..a8290d39fe1b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -375,4 +375,4 @@ void disp_ext_step() { void lv_clear_extrusion() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index d5bf62ab3e33..0d907fea3d57 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" #include "lv_conf.h" @@ -244,4 +244,4 @@ void disp_fan_value() { void lv_clear_fan() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 79f550afefe8..87c9a35105cc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" #include "draw_ready_print.h" @@ -190,13 +190,13 @@ void lv_draw_home(void) { lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_PR, &tft_style_lable_pre); lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_REL, &tft_style_lable_rel); - lv_obj_set_event_cb_mks(buttonOffAll, event_handler, ID_H_OFF_ALL, "bmp_Motor_off.bin", 0); + lv_obj_set_event_cb_mks(buttonOffAll, event_handler, ID_H_OFF_ALL, "bmp_manual_off.bin", 0); lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_PR, &tft_style_lable_pre); lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_REL, &tft_style_lable_rel); - lv_obj_set_event_cb_mks(buttonOffXY, event_handler, ID_H_OFF_XY, "bmp_Motor_off.bin", 0); + lv_obj_set_event_cb_mks(buttonOffXY, event_handler, ID_H_OFF_XY, "bmp_manual_off.bin", 0); lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_PR, &tft_style_lable_pre); @@ -280,4 +280,4 @@ void lv_draw_home(void) { void lv_clear_home() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index c5c77e898572..1237c12bbe9b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -61,7 +61,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_Simple_cn_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_simplified_cn_sel.bin", 0); gCfgItems.language = LANG_SIMPLE_CHINESE; gCfg_to_spiFlah(); disp_language_init(); @@ -73,7 +73,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_Tradition_cn_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_traditional_cn_sel.bin", 0); gCfgItems.language = LANG_COMPLEX_CHINESE; gCfg_to_spiFlah(); disp_language_init(); @@ -258,14 +258,14 @@ void lv_draw_language(void) { buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_Simple_cn.bin", 0); + lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_simplified_cn.bin", 0); lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_PR, &tft_style_lable_pre); lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_REL, &tft_style_lable_rel); lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_Tradition_cn.bin", 0); + lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_traditional_cn.bin", 0); lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_PR, &tft_style_lable_pre); @@ -367,4 +367,4 @@ void lv_draw_language(void) { void lv_clear_language() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index b97483ec9daa..d4e6fa81cbb4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" #include "lv_conf.h" @@ -281,4 +281,4 @@ void lv_draw_manualLevel(void) { void lv_clear_manualLevel() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 71d5d7427a14..ed5af48b90e3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" #include "lv_conf.h" @@ -326,4 +326,4 @@ void disp_move_dist() { void lv_clear_move_motor() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp index 483de3fcc8d5..1fbaf056e223 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -116,7 +116,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (gCfgItems.finish_power_off == 1) { gCfgItems.finish_power_off = 0; - lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_Mamual.bin", 0); + lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0); //dindt find bmp_Mamual... lv_label_set_text(label_PowerOff, printing_more_menu.manual); lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_obj_refresh_ext_draw_pad(label_PowerOff); @@ -124,7 +124,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else { gCfgItems.finish_power_off = 1; - lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_Auto.bin", 0); + lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_auto_off.bin", 0); lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_obj_refresh_ext_draw_pad(label_PowerOff); @@ -218,9 +218,9 @@ void lv_draw_opration(void) { lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_lable_rel); } if (gCfgItems.finish_power_off == 1) - lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_Auto.bin", 0); + lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_auto_off.bin", 0); else - lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_Mamual.bin", 0); + lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0); lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_PR, &tft_style_lable_pre); @@ -319,4 +319,4 @@ void lv_draw_opration(void) { void lv_clear_opration() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp index cf477ec10400..f66c2bde9916 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if BOTH(TFT_LITTLE_VGL_UI, ADVANCED_PAUSE_FEATURE) +#if BOTH(TFT_LVGL_UI, ADVANCED_PAUSE_FEATURE) #include "draw_ui.h" #include "lv_conf.h" @@ -52,4 +52,4 @@ void lv_draw_pause_message(const PauseMessage msg) { } } -#endif // TFT_LITTLE_VGL_UI && ADVANCED_PAUSE_FEATURE +#endif // TFT_LVGL_UI && ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index beea30018c3d..27d011e00095 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -389,4 +389,4 @@ void disp_step_heat() { void lv_clear_preHeat() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index cc9fa0e04dfe..e8647aaa3719 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" #include "lv_conf.h" @@ -324,7 +324,7 @@ void disp_gcode_icon(uint8_t file_num) { lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_PR, &tft_style_lable_pre); lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_REL, &tft_style_lable_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_Back.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_Return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic_117x92); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic_117x92); lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); @@ -445,21 +445,9 @@ void disp_gcode_icon(uint8_t file_num) { void lv_open_gcode_file(char *path) { #if ENABLED(SDSUPPORT) - //uint32_t read; - uint32_t *ps4; - int pre_sread_cnt; char *cur_name; - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - card.read(public_buf, 512); - ps4 = (uint32_t *)strstr((char *)public_buf, ";simage:"); - - if (ps4) { - pre_sread_cnt = (uint32_t)ps4 - (uint32_t)((uint32_t *)(&public_buf[0])); - card.setIndex(pre_sread_cnt + 8); - } #endif } @@ -480,30 +468,64 @@ int ascii2dec_test(char *ascii) { return result; } -void lv_gcode_file_read(uint8_t *data_buf) { - #if ENABLED(SDSUPPORT) - uint16_t i = 0, j = 0, k = 0; - //uint32_t read; - uint16_t row_1 = 0; +void lv_gcode_file_read(uint8_t *data_buf) +{ + #if ENABLED (SDSUPPORT) + uint16_t i=0,j=0,k=0; + uint16_t row_1=0; + bool ignore_start = true; char temp_test[200]; + volatile uint16_t *p_index; + + memset(public_buf, 0, 200); - while (1) { - card.read(temp_test, 200); - for (i = 0; i < 200;) { - public_buf[row_1 * 200 + 100 * k + j] = (char)(ascii2dec_test(&temp_test[i]) << 4 | ascii2dec_test(&temp_test[i + 1])); + while(card.isFileOpen()) + { + if (ignore_start) card.read(temp_test, 8); //line start -> ignore + card.read(temp_test, 200); //data + //\r;;gimage: we got the bit img, so stop here + if (temp_test[1] == ';') { + card.closefile(); + break; + } + for(i=0;i<200;) { + public_buf[row_1*200+100*k+j] = (char)(ascii2dec_test(&temp_test[i])<<4|ascii2dec_test(&temp_test[i+1])); j++; - i += 2; + i+=2; } - k++; - j = 0; - if (k >= 2) { - k = 0; - card.read(temp_test, 9); + + uint16_t c = card.get(); + //check if we have more data or finished the line (CR) + if (c == '\r') { break; } + card.setIndex(card.getIndex()); + k++; + j=0; + ignore_start = false; } - memcpy(data_buf, public_buf, 200); - #endif + #if ENABLED(SPI_GRAPHICAL_TFT) + for(i=0;i<200;) + { + p_index = (uint16_t *)(&public_buf[i]); + + //Color = (*p_index >> 8); + //*p_index = Color | ((*p_index & 0xff) << 8); + i+=2; + if(*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; + } + #else + for(i=0;i<200;) + { + p_index = (uint16_t *)(&public_buf[i]); + //Color = (*p_index >> 8); + //*p_index = Color | ((*p_index & 0xff) << 8); + i+=2; + if(*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; // 0x18C3; // + } + #endif + memcpy(data_buf,public_buf,200); + #endif } void lv_close_gcode_file() {TERN_(SDSUPPORT, card.closefile());} @@ -592,4 +614,4 @@ void cutFileName(char *path, int len, int bytePerLine, char *outStr) { void lv_clear_print_file() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 6580cc9e4321..e15de7021f1c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -308,13 +308,13 @@ void lv_draw_printing(void) { lv_label_set_text(labelPause, printing_menu.pause); else lv_label_set_text(labelPause, printing_menu.resume); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); + lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 20, 0); lv_label_set_text(labelStop, printing_menu.stop); - lv_obj_align(labelStop, buttonStop, LV_ALIGN_CENTER, 30, 0); + lv_obj_align(labelStop, buttonStop, LV_ALIGN_CENTER, 20, 0); lv_label_set_text(labelOperat, printing_menu.option); - lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 30, 0); + lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 20, 0); } lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color); @@ -440,4 +440,4 @@ void setProBarRate() { void lv_clear_printing() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index a3708ef3cc19..1551705704c1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "draw_ready_print.h" #include "draw_tool.h" @@ -260,7 +260,7 @@ void lv_draw_ready_print(void) { buttonTool = lv_imgbtn_create(scr, NULL); buttonSet = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, "bmp_Print.bin", 0); + lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, "bmp_printing.bin", 0); //lv_imgbtn_set_src_mks(buttonPrint, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_printing.bin"); lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, &bmp_pic); @@ -316,4 +316,4 @@ void lv_draw_ready_print(void) { void lv_clear_ready_print() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index e41e943e8cb1..45354def6562 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" #include "draw_ready_print.h" @@ -33,6 +33,7 @@ //#include "../lvgl/src/lv_core/lv_refr.h" #include "draw_ui.h" #include "../../../../gcode/queue.h" +#include "pic_manager.h" static lv_obj_t * scr; @@ -110,7 +111,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { void lv_draw_set(void) { lv_obj_t *buttonFan, *buttonAbout; - lv_obj_t *buMotorOff, *buttonLanguage, *buttonBack; + lv_obj_t *buMotorOff, *buttonBack; + #if HAS_LANG_SELECT_SCREEN + lv_obj_t *buttonLanguage; + #endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) { disp_state_stack._disp_index++; @@ -141,7 +145,9 @@ void lv_draw_set(void) { buttonAbout = lv_imgbtn_create(scr, NULL); //buttonContinue = lv_imgbtn_create(scr, NULL); buMotorOff = lv_imgbtn_create(scr, NULL); - buttonLanguage = lv_imgbtn_create(scr, NULL); + #if HAS_LANG_SELECT_SCREEN + buttonLanguage = lv_imgbtn_create(scr, NULL); + #endif buttonBack = lv_imgbtn_create(scr, NULL); @@ -170,20 +176,22 @@ void lv_draw_set(void) { //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_lable_pre); //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_lable_rel); #if HAS_SUICIDE - lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_Mamual.bin", 0); + lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_manual_off.bin", 0); #else - lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_Motor_off.bin", 0); + lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_manual_off.bin", 0); #endif lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_PR, &tft_style_lable_pre); lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_REL, &tft_style_lable_rel); - lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, "bmp_Language.bin", 0); - lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_lable_rel); + #if HAS_LANG_SELECT_SCREEN + lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, "bmp_Language.bin", 0); + lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, &bmp_pic); + lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, &bmp_pic); + lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_lable_pre); + lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_lable_rel); + #endif lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN, "bmp_Return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); @@ -205,7 +213,9 @@ void lv_draw_set(void) { lv_obj_set_pos(buttonAbout, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); lv_obj_set_pos(buMotorOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonLanguage, INTERVAL_V, titleHeight); + #if HAS_LANG_SELECT_SCREEN + lv_obj_set_pos(buttonLanguage, INTERVAL_V, titleHeight); + #endif lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ @@ -214,7 +224,9 @@ void lv_draw_set(void) { lv_btn_set_layout(buttonAbout, LV_LAYOUT_OFF); //lv_btn_set_layout(buttonContinue, LV_LAYOUT_OFF); lv_btn_set_layout(buMotorOff, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF); + #if HAS_LANG_SELECT_SCREEN + lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF); + #endif lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); //lv_obj_t * labelWifi= lv_label_create(buttonWifi, NULL); @@ -222,7 +234,9 @@ void lv_draw_set(void) { lv_obj_t * label_About = lv_label_create(buttonAbout, NULL); //lv_obj_t * label_Continue = lv_label_create(buttonContinue, NULL); lv_obj_t * label_MotorOff = lv_label_create(buMotorOff, NULL); - lv_obj_t * label_Language = lv_label_create(buttonLanguage, NULL); + #if HAS_LANG_SELECT_SCREEN + lv_obj_t * label_Language = lv_label_create(buttonLanguage, NULL); + #endif lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); @@ -245,8 +259,10 @@ void lv_draw_set(void) { #endif lv_obj_align(label_MotorOff, buMotorOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(label_Language, set_menu.language); - lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #if HAS_LANG_SELECT_SCREEN + lv_label_set_text(label_Language, set_menu.language); + lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + #endif lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -255,4 +271,4 @@ void lv_draw_set(void) { void lv_clear_set() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index dc87ec57173f..d980d4c08da0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "lv_conf.h" #include "draw_ui.h" @@ -267,4 +267,4 @@ void lv_draw_tool(void) { void lv_clear_tool() { lv_obj_del(scr); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index c8df85203ecb..52e83204e980 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -21,11 +21,10 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "W25Qxx.h" #include "tft_lvgl_configuration.h" -#include "pic_manager.h" #include @@ -38,6 +37,8 @@ #include "../../../../module/motion.h" #include "../../../../module/planner.h" +#include "pic_manager.h" + #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif @@ -73,7 +74,33 @@ extern void LCD_IO_WriteData(uint16_t RegValue); void gCfgItems_init() { gCfgItems.multiple_language = MULTI_LANGUAGE_ENABLE; - gCfgItems.language = LANG_ENGLISH; + #if 1 //LCD_LANGUAGE == en + gCfgItems.language = LANG_ENGLISH; + #elif LCD_LANGUAGE == zh_CN + gCfgItems.language = LANG_SIMPLE_CHINESE; + #elif LCD_LANGUAGE == zh_TW + gCfgItems.language = LANG_COMPLEX_CHINESE; + #elif LCD_LANGUAGE == jp_kana + gCfgItems.language = LANG_JAPAN; + #elif LCD_LANGUAGE == de + gCfgItems.language = LANG_GERMAN; + #elif LCD_LANGUAGE == fr + gCfgItems.language = LANG_FRENCH; + #elif LCD_LANGUAGE == ru + gCfgItems.language = LANG_RUSSIAN; + #elif LCD_LANGUAGE == ko_KR + gCfgItems.language = LANG_KOREAN; + #elif LCD_LANGUAGE == tr + gCfgItems.language = LANG_TURKISH; + #elif LCD_LANGUAGE == es + gCfgItems.language = LANG_SPANISH; + #elif LCD_LANGUAGE == el + gCfgItems.language = LANG_GREEK; + #elif LCD_LANGUAGE == it + gCfgItems.language = LANG_ITALY; + #elif LCD_LANGUAGE == pt + gCfgItems.language = LANG_PORTUGUESE; + #endif gCfgItems.leveling_mode = 0; gCfgItems.from_flash_pic = 0; gCfgItems.curFilesize = 0; @@ -139,8 +166,13 @@ void tft_style_init() { tft_style_lable_rel.body.grad_color = LV_COLOR_BACKGROUND; tft_style_lable_rel.text.color = LV_COLOR_TEXT; tft_style_lable_rel.text.sel_color = LV_COLOR_TEXT; - tft_style_lable_pre.text.font = &gb2312_puhui32; - tft_style_lable_rel.text.font = &gb2312_puhui32; + #if HAS_SPI_FLASH_FONT + tft_style_lable_pre.text.font = &gb2312_puhui32; + tft_style_lable_rel.text.font = &gb2312_puhui32; + #else + tft_style_lable_pre.text.font = LV_FONT_DEFAULT; + tft_style_lable_rel.text.font = LV_FONT_DEFAULT; + #endif tft_style_lable_pre.line.width = 0; tft_style_lable_rel.line.width = 0; tft_style_lable_pre.text.letter_space = 0; @@ -325,6 +357,9 @@ char *creat_title_text() { return public_buf_m; } +#if HAS_GCODE_PREVIEW +uint32_t gPicturePreviewStart = 0; + void preview_gcode_prehandle(char *path) { #if ENABLED(SDSUPPORT) //uint8_t re; @@ -333,6 +368,7 @@ void preview_gcode_prehandle(char *path) { uint32_t *p1; char *cur_name; + gPicturePreviewStart = 0; cur_name = strrchr(path, '/'); card.openFileRead(cur_name); card.read(public_buf, 512); @@ -369,7 +405,24 @@ void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { cur_name = strrchr(path, '/'); card.openFileRead(cur_name); - card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); + if (gPicturePreviewStart <= 0) { + while (1) { + uint32_t br = card.read(public_buf, 400); + uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:"); + if (p1) { + gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); + break; + } + else { + gPicturePreviewStart += br; + } + if (br < 400) break; + } + } + + // SERIAL_ECHOLNPAIR("gPicturePreviewStart: ", gPicturePreviewStart, " PREVIEW_LITTLE_PIC_SIZE: ", PREVIEW_LITTLE_PIC_SIZE); + + card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); #if ENABLED(SPI_GRAPHICAL_TFT) SPI_TFT.spi_init(SPI_FULL_SPEED); //SPI_TFT.SetCursor(0,0); @@ -417,14 +470,16 @@ void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { #else for (i = 0; i < 400;) { p_index = (uint16_t *)(&bmp_public_buf[i]); - //if (*p_index == 0x0000)*p_index=gCfgItems.preview_bk_color; + if (*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color; LCD_IO_WriteData(*p_index); i += 2; } #endif - W25QXX.init(SPI_QUARTER_SPEED); - if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); - W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); + #if HAS_BAK_VIEW_IN_FLASH + W25QXX.init(SPI_QUARTER_SPEED); + if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); + W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); + #endif row++; if (row >= 200) { size = 809; @@ -489,15 +544,19 @@ void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { int x_off = 0, y_off = 0; int _y; uint16_t *p_index; - int i, j; - uint16_t temp_p, Color; + int i; + uint16_t temp_p; for (index = 0; index < 10; index++) { // 200*200 - if (sel == 1) flash_view_Read(bmp_public_buf, 8000); //20k - //memset(bmp_public_buf,0x1f,8000); - else + #if HAS_BAK_VIEW_IN_FLASH + if (sel == 1) flash_view_Read(bmp_public_buf, 8000); //20k //memset(bmp_public_buf,0x1f,8000); - default_view_Read(bmp_public_buf, 8000); //20k + else + //memset(bmp_public_buf,0x1f,8000); + default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); //20k + #else + default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); //20k + #endif i = 0; #if ENABLED(SPI_GRAPHICAL_TFT) @@ -534,6 +593,7 @@ void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { else { p_index = (uint16_t *)(&bmp_public_buf[i]); } + if (*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color; LCD_IO_WriteData(*p_index); i += 2; } @@ -547,15 +607,20 @@ void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { void disp_pre_gcode(int xpos_pixel, int ypos_pixel) { if (gcode_preview_over == 1) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel); - if (flash_preview_begin == 1) { - flash_preview_begin = 0; - Draw_default_preview(xpos_pixel, ypos_pixel, 1); - } - if (default_preview_flg == 1) { - Draw_default_preview(xpos_pixel, ypos_pixel, 0); - default_preview_flg = 0; - } + #if HAS_BAK_VIEW_IN_FLASH + if (flash_preview_begin == 1) { + flash_preview_begin = 0; + Draw_default_preview(xpos_pixel, ypos_pixel, 1); + } + #endif + #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH + if (default_preview_flg == 1) { + Draw_default_preview(xpos_pixel, ypos_pixel, 0); + default_preview_flg = 0; + } + #endif } +#endif void print_time_run() { static uint8_t lastSec = 0; @@ -1175,9 +1240,11 @@ void LV_TASK_HANDLER() { //lv_tick_inc(1); lv_task_handler(); TERN_(MKS_TEST, mks_test()); - disp_pre_gcode(2, 36); + #if HAS_GCODE_PREVIEW + disp_pre_gcode(2, 36); + #endif GUI_RefreshPage(); //sd_detection(); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 796c94ab2d30..924c131018ca 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -28,6 +28,11 @@ extern "C" { /* C-declarations for C++ */ #include #include #include "lvgl.h" + +//the colors of the last MKS Ui +#undef LV_COLOR_BACKGROUND +#define LV_COLOR_BACKGROUND LV_COLOR_MAKE(0x1A, 0x1A, 0x1A) //LV_COLOR_MAKE(0x00, 0x00, 0x00) + #include "tft_multi_language.h" #include "draw_ready_print.h" #include "draw_language.h" @@ -214,7 +219,9 @@ extern void tft_style_init(); extern char *creat_title_text(void); extern void preview_gcode_prehandle(char *path); extern void update_spi_flash(); -extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel); +#if HAS_GCODE_PREVIEW + extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel); +#endif extern void GUI_RefreshPage(); extern void clear_cur_ui(); extern void draw_return_ui(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp index 39fb836b6054..312229a16cad 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp @@ -21,12 +21,14 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" #include "lvgl.h" #include "pic_manager.h" +#if HAS_SPI_FLASH_FONT + typedef struct { uint16_t min; uint16_t max; @@ -108,4 +110,6 @@ void init_gb2312_font() { gb2312_puhui32.base_line = 0; } -#endif // TFT_LITTLE_VGL_UI +#endif // HAS_SPI_FLASH_FONT + +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index 08ce13c8aa80..913b67ab258b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -21,19 +21,20 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "tft_lvgl_configuration.h" #include "lvgl.h" #include "draw_ready_print.h" #include "W25Qxx.h" -#include "pic_manager.h" #include "mks_hardware_test.h" #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" #include "../../../../feature/touch/xpt2046.h" +#include "pic_manager.h" + #if ENABLED(MKS_TEST) extern uint8_t curent_disp_ui; @@ -591,4 +592,4 @@ void disp_font_update() { disp_string(120, 150, "FONT Updating...", 0xFFFF, 0x0000); } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 85049ed3a19c..4e9eee892953 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -21,11 +21,10 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" -//#include "type_define.h" #include "string.h" #include "pic_manager.h" @@ -34,10 +33,6 @@ #include "draw_ready_print.h" #include "mks_hardware_test.h" -//#include "gui.h" -//#include "spi_flash.h" - -//uint8_t DMA_ERRO_FLAG; extern uint16_t DeviceCode; extern unsigned char bmp_public_buf[17 * 1024]; @@ -45,7 +40,158 @@ extern unsigned char bmp_public_buf[17 * 1024]; extern char *createFilename(char * const buffer, const dir_t &p); #endif -/*void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) {}*/ +static char assets[][30] = { + //homing screen + "bmp_Zero.bin", + "bmp_zeroX.bin", + "bmp_zeroY.bin", + "bmp_zeroZ.bin", + "bmp_manual_off.bin", + + //tool screen + "bmp_PreHeat.bin", + "bmp_Extruct.bin", + "bmp_Mov.bin", + // "bmp_Zero.bin", + "bmp_Leveling.bin", + + //fan screen + "bmp_Add.bin", + "bmp_Dec.bin", + "bmp_Speed255.bin", + "bmp_Speed127.bin", + "bmp_Speed0.bin", + + //preheat screen + // "bmp_Add.bin", + // "bmp_Dec.bin", + "bmp_Speed0.bin", + // "bmp_Extru2.bin", + // "bmp_Extru1.bin", + "bmp_Bed.bin", + "bmp_Step1_degree.bin", + "bmp_Step5_degree.bin", + "bmp_Step10_degree.bin", + + //extrusion screen + "bmp_In.bin", + "bmp_Out.bin", + "bmp_Extru1.bin", + #if EXTRUDERS > 1 + "bmp_Extru2.bin", + #endif + "bmp_Speed_high.bin", + "bmp_Speed_slow.bin", + "bmp_Speed_normal.bin", + "bmp_Step1_mm.bin", + "bmp_Step5_mm.bin", + "bmp_Step10_mm.bin", + + //select file screen + "bmp_pageUp.bin", + "bmp_pageDown.bin", + //"bmp_Back.bin", //TODO: why two back buttons? Why not just one? (return / back) + "bmp_Dir.bin", + "bmp_File.bin", + + //move motor screen + //TODO: 6 equal icons, just in diffenct rotation... it may be optimized too + "bmp_xAdd.bin", + "bmp_xDec.bin", + "bmp_yAdd.bin", + "bmp_yDec.bin", + "bmp_zAdd.bin", + "bmp_zDec.bin", + "bmp_Step_move0_1.bin", + "bmp_Step_move1.bin", + "bmp_Step_move10.bin", + + //operation screen + "bmp_auto_off.bin", + "bmp_Speed.bin", + //"bmp_Mamual.bin", //TODO: didn't find it.. changed to bmp_manual_off.bin + "bmp_Fan.bin", + //"bmp_PreHeat.bin", + //"bmp_Extruct.bin", + // "bmp_Mov.bin", + + //change speed screen + "bmp_Step1_percent.bin", + "bmp_Step5_percent.bin", + "bmp_Step10_percent.bin", + "bmp_extruct_sel.bin", + "bmp_mov_changespeed.bin", + // "bmp_extrude_opr.bin", equal to "bmp_Extruct.bin" + "bmp_mov_sel.bin", + + //printing screen + "bmp_Pause.bin", + "bmp_Resume.bin", + "bmp_Stop.bin", + "bmp_Ext1_state.bin", + #if EXTRUDERS > 1 + "bmp_Ext2_state.bin", + #endif + "bmp_Bed_state.bin", + "bmp_Fan_state.bin", + "bmp_Time_state.bin", + "bmp_Zpos_state.bin", + "bmp_Operate.bin", + + //manual leval screen (only if disabled auto level) + #if DISABLED(AUTO_BED_LEVELING_BILINEAR) + "bmp_Leveling1.bin", + "bmp_Leveling2.bin", + "bmp_Leveling3.bin", + "bmp_Leveling4.bin", + "bmp_Leveling5.bin", + #endif + + //lang select screen + #if HAS_LANG_SELECT_SCREEN + "bmp_Language.bin", + "bmp_simplified_cn.bin", + "bmp_simplified_cn_sel.bin", + "bmp_traditional_cn.bin", + "bmp_traditional_cn_sel.bin", + "bmp_English.bin", + "bmp_English_sel.bin", + "bmp_Russian.bin", + "bmp_Russian_sel.bin", + "bmp_Spanish.bin", + "bmp_Spanish_sel.bin", + "bmp_French.bin", + "bmp_French_sel.bin", + "bmp_Italy.bin", + "bmp_Italy_sel.bin", + #endif //HAS_LANG_SELECT_SCREEN + + //gcode preview + #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH + "bmp_preview.bin", + #endif + + //settings screen + "bmp_About.bin", + //"bmp_Language.bin", + //"bmp_Fan.bin", + //"bmp_manual_off.bin", + + //start screen + "bmp_printing.bin", + "bmp_Set.bin", + "bmp_Tool.bin", + + //base icons + "bmp_Return.bin" +}; + +#if HAS_SPI_FLASH_FONT + static char fonts[][50] = { + "GBK16.bin", + "UNIGBK.bin", + }; +#endif uint32_t lv_get_pic_addr(uint8_t *Pname) { uint8_t Pic_cnt; @@ -54,21 +200,22 @@ uint32_t lv_get_pic_addr(uint8_t *Pname) { uint32_t tmp_cnt = 0; uint32_t addr = 0; + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("Getting picture SPI Flash Address: ", (const char*)Pname); + #endif + W25QXX.init(SPI_QUARTER_SPEED); W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1); - if (Pic_cnt == 0xff) - Pic_cnt = 0; + if (Pic_cnt == 0xFF) Pic_cnt = 0; for (i = 0; i < Pic_cnt; i++) { j = 0; - do - { + do { W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1); tmp_cnt++; - }while (PIC.name[j++] != '\0'); - - if ((strcmp((char*)Pname, (char*)PIC.name)) == 0) { + } while (PIC.name[j++] != '\0'); + if ((strcasecmp((char*)Pname, (char*)PIC.name)) == 0) { if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35; else @@ -86,111 +233,40 @@ const char *bakPath = "bak_pic"; const char *fontPath = "mks_font"; const char *bakFont = "bak_font"; -#if 1 - void spiFlashErase_PIC() { - #if 1 - volatile uint32_t pic_sectorcnt = 0; - - //LCD_Clear(BACK_COLOR); - //LCD_DisplayString(90,80,"SPI Flash"); - //LCD_DisplayString(120,90,"PIC Erasing..."); - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) { - //LCD_ShowString(180,100,200,24,24,"SPI Flash"); - //LCD_ShowString(170,130,200,24,24,"PIC Erasing..."); - } - else { - //LCD_ShowString(100,90,200,24,24,"SPI Flash"); - //LCD_ShowString(100,120,200,24,24,"PIC Erasing..."); - } - #if ENABLED(MKS_TEST) - for (pic_sectorcnt = 0; pic_sectorcnt < 2; pic_sectorcnt++) - W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024); - - #else - for (pic_sectorcnt = 0; pic_sectorcnt < PIC_SIZE_xM * 1024 / 64; pic_sectorcnt++) - W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024); - - #endif - /* - FLASH_Unlock(); - spiFlashEraseFlag = SPI_FLASH_ERASE_FLAG_DATA; - FLASH_ProgramHalfWord(SPI_FLASH_ERASE_FLAG_ADDR,spiFlashEraseFlag); - FLASH_Lock(); - */ - #if 0 - if (DeviceCode == 0x9488) - LCD_ShowString(170, 130, 200, 24, 24, "PIC Erase Done"); - else - LCD_ShowString(100, 120, 200, 24, 24, "PIC Erase Done"); - - #endif - //spiFlashEraseFlag = 1; - #endif + volatile uint32_t pic_sectorcnt = 0; + for (pic_sectorcnt = 0; pic_sectorcnt < TERN(MKS_TEST, 2, PIC_SIZE_xM * 1024 / 64); pic_sectorcnt++) + W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024); } -void spiFlashErase_FONT() { - volatile uint32_t Font_sectorcnt = 0; - - //LCD_Clear(BACK_COLOR); - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) { - //LCD_ShowString(180,100,200,24,24,"SPI Flash"); - //LCD_ShowString(170,130,200,24,24,"FONT Erasing..."); +#if HAS_SPI_FLASH_FONT + void spiFlashErase_FONT() { + volatile uint32_t Font_sectorcnt = 0; + for (Font_sectorcnt = 0; Font_sectorcnt < FONT_SIZE_xM * 1024 / 64; Font_sectorcnt++) + W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024); } - else { - //LCD_ShowString(100,90,200,24,24,"SPI Flash"); - //LCD_ShowString(90,120,200,24,24,"FONT Erasing..."); - } - - for (Font_sectorcnt = 0; Font_sectorcnt < FONT_SIZE_xM * 1024 / 64; Font_sectorcnt++) - W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024); - - /* - FLASH_Unlock(); - spiFlashEraseFlag = SPI_FLASH_ERASE_FLAG_DATA; - FLASH_ProgramHalfWord(SPI_FLASH_ERASE_FLAG_ADDR,spiFlashEraseFlag); - FLASH_Lock(); - */ - #if 0 - if (DeviceCode == 0x9488) - LCD_ShowString(170, 130, 200, 24, 24, "FONT Erase Done"); - else - LCD_ShowString(90, 120, 200, 24, 24, "FONT Erase Done"); - //LCD_DisplayString(120,90,"FONT Erase Done"); - #endif - //spiFlashEraseFlag = 1; -} +#endif uint32_t LogoWrite_Addroffset = 0; uint8_t Pic_Logo_Write(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWriteSize) { - //uint16_t n; - uint32_t i; - uint8_t temp1; - static uint32_t logo_maxsize; - if (LogoWriteSize <= 0) return 0; W25QXX.SPI_FLASH_BufferWrite(Logo_Wbuff, PIC_LOGO_ADDR + LogoWrite_Addroffset, LogoWriteSize); - for (i = 0; i < LogoWriteSize; i++) { + for (uint32_t i = 0; i < LogoWriteSize; i++) { + uint8_t temp1; W25QXX.SPI_FLASH_BufferRead(&temp1, PIC_LOGO_ADDR + LogoWrite_Addroffset + i, 1); if (*(Logo_Wbuff + i) != temp1) return 0; } LogoWrite_Addroffset += LogoWriteSize; - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) - logo_maxsize = LOGO_MAX_SIZE_TFT35; - else - logo_maxsize = LOGO_MAX_SIZE_TFT32; - if (LogoWrite_Addroffset >= logo_maxsize) - LogoWrite_Addroffset = 0; + const uint32_t logo_maxsize = DeviceCode == 0x9488 || DeviceCode == 0x5761 ? LOGO_MAX_SIZE_TFT35 : LOGO_MAX_SIZE_TFT32; + if (LogoWrite_Addroffset >= logo_maxsize) LogoWrite_Addroffset = 0; return 1; } uint32_t TitleLogoWrite_Addroffset = 0; uint8_t Pic_TitleLogo_Write(uint8_t *TitleLogoName, uint8_t *TitleLogo_Wbuff, uint32_t TitleLogoWriteSize) { - //uint32_t i; - //uint8_t temp1; if (TitleLogoWriteSize <= 0) return 0; if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) @@ -216,18 +292,11 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { uint32_t Pic_SaveAddr; uint32_t Pic_SizeSaveAddr; uint32_t Pic_NameSaveAddr; - //uint8_t temp; uint8_t Pname_temp; uint32_t i, j; uint32_t name_len = 0; uint32_t SaveName_len = 0; union union32 size_tmp; - //union union32 size1; - //uint8_t Pn[PIC_NAME_MAX_LEN]; - //uint8_t cnt_temp; - //uint16_t n0; - //uint32_t Name_saveAddr = 0; - //uint8_t pic_position; W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); @@ -266,386 +335,182 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { uint8_t public_buf[512]; -//uint8_t public_buf_test[512]; - #if ENABLED(SDSUPPORT) -void UpdatePic() { - //int r; - //unsigned char *p; - //char rootPath[10]={0}; - char *fn; - unsigned char logoFlag; - uint16_t pbr; - uint32_t pfileSize; - uint32_t Pic_Write_Addr; - /*----------------------------------*/ - - // FILINFO fno; - //DIR dir; - //char tmp[30]; - #if 0//_USE_LFN - static char lfn[_MAX_LFN + 1]; - finfo.lfname = lfn; - finfo.lfsize = sizeof(lfn); - #endif - //SdFile curDir; - //if (f_opendir(&dirs, picPath) == FR_OK) - //card.cd(picPath); - - //const uint16_t fileCnt = card.get_num_Files(); - - //SdFile *curDir; - //SdFile dir; - //dir.open(picPath, O_READ); - //const char * const fname = card.diveToFile(true, curDir, picPath); - //if (!fname) return; - - SdFile dir, root = card.getroot(); - if (dir.open(&root, picPath, O_RDONLY)) { - - disp_pic_update(); - spiFlashErase_PIC(); - - dir_t d; - while (dir.readDir(&d, card.longFilename) > 0) { - #if 1 - /* - if (power_det == 0) { - PW_DET_ON; - power_det=0; - } - SPI_FLASH_Init(); - */ +#if ENABLED(SDSUPPORT) - //for (uint16_t i = 0; i < fileCnt; i++) { - //res = f_readdir(&dirs, &finfo); - //card.getfilename_sorted(i); + static void dosName2LongName(const char dosName[11], char* longName) { + uint8_t j = 0; + LOOP_L_N(i, 11) { + if (i == 8) longName[j++] = '.'; + if (dosName[i] == '\0' || dosName[i] == ' ') continue; + longName[j++] = dosName[i]; + } + longName[j] = '\0'; + } + + void UpdatePic() { + char *fn; + unsigned char logoFlag; + uint16_t pbr; + uint32_t pfileSize; + uint32_t totalSizeLoaded = 0; + uint32_t Pic_Write_Addr; + + SdFile dir, root = card.getroot(); + if (dir.open(&root, picPath, O_RDONLY)) { + + disp_pic_update(); + spiFlashErase_PIC(); + + dir_t d; + while (dir.readDir(&d, card.longFilename) > 0) { + // if we dont get a long name, but gets a short one, try it + if (card.longFilename[0] == 0 && d.name[0] != 0) { + dosName2LongName((const char*)d.name, card.longFilename); + } if (card.longFilename[0] == 0) - break; - /*if ( card.filename[0] == '.') - continue; - */ + continue; if (card.longFilename[0] == '.') continue; - fn = card.longFilename; + uint8_t a = -1; + for(a = 0; a < COUNT(assets); a++) { + if (strcasecmp(assets[a], card.longFilename) == 0) { + break; + } + } + if (a < 0 || a >= COUNT(assets)) continue; - /*if ((finfo.lfname[0] == 0) || (finfo.lfname == 0)) - fn = finfo.fname; - else - fn = finfo.lfname;*/ + fn = assets[a]; + char dosFilename[FILENAME_LENGTH]; + createFilename(dosFilename, d); - /* if (fno.fattrib & AM_DIR) - { + SdFile file; + if (!file.open(&dir, dosFilename, O_READ)) { + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("Error opening Asset: ", fn); + #endif continue; } - else */ - //{ - //if ((strstr(fn, ".gco")) || (strstr(fn, ".GCO")) || (fno.fattrib & AM_DIR)) - if (strstr(fn, ".bin")) { - if (strstr(fn, "_logo")) - logoFlag = 1; - else if (strstr(fn, "_titlelogo")) - logoFlag = 2; - else if (strstr(fn, "_preview")) - logoFlag = 3; - else - logoFlag = 0; - - //public_buf[0] = '\0'; - //strcat(public_buf, picPath); - //strcat(public_buf, "/"); - char dosFilename[FILENAME_LENGTH]; - createFilename(dosFilename, d); - //strcat(public_buf, dosFilename); - - SdFile file; - if (file.open(&dir, dosFilename, O_READ)) { - #if 1 - /*LCD_Clear(BACK_COLOR); - - if ((DeviceCode==0x9488)||(DeviceCode==0x5761)) { - LCD_ShowString(170,100,200,24,24,(u8 *)fn); - LCD_ShowString(180,130,200,24,24,"Updating..."); - } - else { - LCD_ShowString(90,90,200,24,24,(u8 *)fn); - LCD_ShowString(90,120,200,24,24,"Updating..."); - } - */ - if (logoFlag == 1) { - while (1) { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } - } - else if (logoFlag == 2) { - while (1) { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } - } - else if (logoFlag == 3) { - while (1) - { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - default_view_Write(public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } - } - else { - pfileSize = file.fileSize(); - Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize); - //uint32_t addr_test = Pic_Write_Addr; - //memset(bmp_public_buf, 0xff, BMP_WRITE_BUF_LEN); - while (1) - { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); - Pic_Write_Addr += pbr; - if (pbr < BMP_WRITE_BUF_LEN) break; - } - //W25QXX.SPI_FLASH_BufferRead(public_buf_test,addr_test,BMP_WRITE_BUF_LEN); - } - /*--------------read test--------------------*/ - /* - BufferSet(picBuffer, 0xff, PICTURE_MAX_SIZE); - if (logoFlag == 0) - { - PicMsg_Init(); - Pic_Read(fn,picBuffer); - } - else - Pic_Logo_Read(fn,picBuffer,PICTURE_MAX_SIZE); - */ - /*--------------read test--------------------*/ - - file.close(); - #endif + if (strstr(fn, "_logo")) + logoFlag = 1; + else if (strstr(fn, "_titlelogo")) + logoFlag = 2; + else if (strstr(fn, "_preview")) + logoFlag = 3; + else + logoFlag = 0; + + pfileSize = file.fileSize(); + totalSizeLoaded += pfileSize; + if (logoFlag == 1) { + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); // + if (pbr < BMP_WRITE_BUF_LEN) + break; } - } - //} - //} - /* - LCD_Clear(LCD_COLOR_BLACK); - //LCD_ShowString(110,100,200,24,24,"Complete"); - LCD_DisplayString(110,80,"Complete"); - delay(0xfffff); - */ - //r = f_chdir("/"); - #if 1 - //SdFile dir, root = card.getroot(); - /*if (dir.open(&root, bakPath, O_RDONLY)) - { - dir.remove(); - }*/ - - //r = f_rename(picPath, bakPath); - - - //update_flag_ok = 1; + else if (logoFlag == 2) { + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); // + if (pbr < BMP_WRITE_BUF_LEN) + break; + } + } + else if (logoFlag == 3) { + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + default_view_Write(public_buf, pbr); // + if (pbr < BMP_WRITE_BUF_LEN) + break; + } + } + else { + Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize); + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); + Pic_Write_Addr += pbr; + if (pbr < BMP_WRITE_BUF_LEN) + break; + } + } + + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("Asset added: ", fn); #endif - #endif + + file.close(); + } + dir.rename(&root, bakPath); } - dir.rename(&root, bakPath); + dir.close(); + + #if ENABLED(MARLIN_DEV_MODE) + uint8_t pic_counter = 0; + W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); + SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter, ", Total size: ", totalSizeLoaded); + #endif } -} + #if HAS_SPI_FLASH_FONT -void spi_flash_read_test() {W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN);} - -void UpdateFont() { - //int r; - //unsigned char *p; - //char rootPath[10]={0}; - char *fn; - //unsigned char logoFlag; - uint16_t pbr; - uint32_t flashaddr = 0; - //uint32_t pfileSize; - //uint32_t Pic_Write_Addr; - /*----------------------------------*/ - - // FILINFO fno; - //DIR dir; - //char tmp[30]; - #if 0//_USE_LFN - static char lfn[_MAX_LFN + 1]; - finfo.lfname = lfn; - finfo.lfsize = sizeof(lfn); - #endif - //SdFile curDir; - //if (f_opendir(&dirs, picPath) == FR_OK) - //card.cd(picPath); - - //const uint16_t fileCnt = card.get_num_Files(); - - //SdFile *curDir; - //SdFile dir; - //dir.open(picPath, O_READ); - //const char * const fname = card.diveToFile(true, curDir, picPath); - //if (!fname) return; - - SdFile dir, root = card.getroot(); - if (dir.open(&root, fontPath, O_RDONLY)) { - - disp_font_update(); - spiFlashErase_FONT(); - - dir_t d; - while (dir.readDir(&d, card.longFilename) > 0) - { - #if 1 - /*if (power_det == 0) - { - PW_DET_ON; - power_det=0; - } - SPI_FLASH_Init();*/ + void spi_flash_read_test() { W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN); } + void UpdateFont() { + char *fn; + uint16_t pbr; + uint32_t flashaddr = 0; - //for (uint16_t i = 0; i < fileCnt; i++) - //{ - //res = f_readdir(&dirs, &finfo); - //card.getfilename_sorted(i); + SdFile dir, root = card.getroot(); + if (dir.open(&root, fontPath, O_RDONLY)) { - if (card.longFilename[0] == 0) - break; - /*if ( card.filename[0] == '.') - continue; - */ - if (card.longFilename[0] == '.') - continue; + disp_font_update(); + spiFlashErase_FONT(); - fn = card.longFilename; + dir_t d; + while (dir.readDir(&d, card.longFilename) > 0) { + if (card.longFilename[0] == 0) + break; - /*if ((finfo.lfname[0] == 0) || (finfo.lfname == 0)) - fn = finfo.fname; - else - fn = finfo.lfname;*/ + if (card.longFilename[0] == '.') + continue; + + fn = card.longFilename; + + if (strstr(fn, ".bin")) { + char dosFilename[FILENAME_LENGTH]; + createFilename(dosFilename, d); + //strcat(public_buf, dosFilename); + + SdFile file; + if (file.open(&dir, dosFilename, O_READ)) { - /* if (fno.fattrib & AM_DIR) - { - continue; - } - else */ - //{ - //if ((strstr(fn, ".gco")) || (strstr(fn, ".GCO")) || (fno.fattrib & AM_DIR)) - if (strstr(fn, ".bin")) { - char dosFilename[FILENAME_LENGTH]; - createFilename(dosFilename, d); - //strcat(public_buf, dosFilename); - - SdFile file; - if (file.open(&dir, dosFilename, O_READ)) { - - #if 1 - /*LCD_Clear(BACK_COLOR); - - if ((DeviceCode==0x9488)||(DeviceCode==0x5761)) - { - LCD_ShowString(170,100,200,24,24,(u8 *)fn); - LCD_ShowString(180,130,200,24,24,"Updating..."); - } - else - { - LCD_ShowString(90,90,200,24,24,(u8 *)fn); - LCD_ShowString(90,120,200,24,24,"Updating..."); - } - */ flashaddr = UNIGBK_FLASH_ADDR; pbr = 0; - while (1) - { + while (1) { flashaddr += pbr; pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); W25QXX.SPI_FLASH_BufferWrite(public_buf, flashaddr, pbr); - //W25QXX.SPI_FLASH_BufferRead(public_buf_test,flashaddr,pbr); - /*if (UNIGBKFlag == 1) - { - fontrate = (uint16_t)(((float)(flashaddr - UNIGBK_FLASH_ADDR)/(float)(psrc.fsize))*100); - } - else - { - fontrate = (uint16_t)(((float)(flashaddr - GBK_FLASH_ADDR)/(float)(psrc.fsize))*100); - } - - if (fontrate > 99) fontrate=99; - - if (fontrate < 10) - { - fontString[0] = fontrate%10 + 0x30; - fontString[1] = '%'; - fontString[2] = '\0'; - } - else - { - fontString[0] = fontrate/10 + 0x30; - fontString[1] = fontrate%10 + 0x30; - fontString[2] = '%'; - fontString[3] = '\0'; - }*/ - //LCD_DisplayString(140,130,fontString); - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) { - //LCD_ShowString(200,160,200,24,24,fontString); - } - else { - //LCD_ShowString(140,150,200,24,24,fontString); - } if (pbr < BMP_WRITE_BUF_LEN) break; } - /*--------------read test--------------------*/ - /* - BufferSet(picBuffer, 0xff, PICTURE_MAX_SIZE); - if (logoFlag == 0) - { - PicMsg_Init(); - Pic_Read(fn,picBuffer); - } - else - Pic_Logo_Read(fn,picBuffer,PICTURE_MAX_SIZE); - */ - /*--------------read test--------------------*/ - file.close(); - #endif - } + } + } } - //} - //} - /* - LCD_Clear(LCD_COLOR_BLACK); - //LCD_ShowString(110,100,200,24,24,"Complete"); - LCD_DisplayString(110,80,"Complete"); - delay(0xfffff); - */ - //r = f_chdir("/"); - #if 1 - //SdFile dir, root = card.getroot(); - /*if (dir.open(&root, bakPath, O_RDONLY)) - { - dir.remove(); - }*/ - dir.rename(&root, bakFont); - //r = f_rename(picPath, bakPath); - - - //update_flag_ok = 1; - #endif - #endif + + dir.rename(&root, bakFont); + dir.close(); + } } - } -} - #endif // SDSUPPORT -#endif + #endif // HAS_SPI_FLASH_FONT -#if 1 +#endif // SDSUPPORT void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { uint8_t i, j; @@ -653,30 +518,21 @@ void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { uint32_t tmp_cnt = 0; PIC_MSG PIC; - //void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead); - W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1); if (Pic_cnt == 0xff) Pic_cnt = 0; for (i = 0; i < Pic_cnt; i++) { - //pic name j = 0; - do - { + do { W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1); tmp_cnt++; - }while (PIC.name[j++] != '\0'); + } while (PIC.name[j++] != '\0'); //pic size W25QXX.SPI_FLASH_BufferRead(PIC.size.bytes, PIC_SIZE_ADDR + i * 4, 4); if ((strcmp((char*)Pname, (char*)PIC.name)) == 0) { W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35, PIC.size.dwords); - /*if (DMA_ERRO_FLAG) - { - DMA_ERRO_FLAG = 0; - SPI_FLASH_BufferRead((uint8_t *)P_Rbuff,PIC_DATA_ADDR+i*PER_PIC_MAX_SPACE,PIC.size.dwords); - }*/ break; } } @@ -685,41 +541,34 @@ void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) { W25QXX.init(SPI_QUARTER_SPEED); W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size); - /*if (DMA_ERRO_FLAG) { - DMA_ERRO_FLAG = 0; - SPI_FLASH_BufferRead((uint8_t *)P_Rbuff,addr,size); - }*/ - } -void get_spi_flash_data(const char *rec_buf, int addr, int size) { - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead((uint8_t *)rec_buf, UNIGBK_FLASH_ADDR + addr, size); -} - -#endif - -#if 1 - - uint32_t logo_addroffset = 0; - void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) { - W25QXX.SPI_FLASH_BufferRead(Logo_Rbuff, PIC_LOGO_ADDR + logo_addroffset, LogoReadsize); - logo_addroffset += LogoReadsize; - if (logo_addroffset >= LOGO_MAX_SIZE_TFT35) - logo_addroffset = 0; +#if HAS_SPI_FLASH_FONT + void get_spi_flash_data(const char *rec_buf, int addr, int size) { + W25QXX.init(SPI_QUARTER_SPEED); + W25QXX.SPI_FLASH_BufferRead((uint8_t *)rec_buf, UNIGBK_FLASH_ADDR + addr, size); } +#endif - uint32_t default_view_addroffset = 0; - void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize) { - W25QXX.init(SPI_QUARTER_SPEED); +uint32_t logo_addroffset = 0; +void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) { + W25QXX.SPI_FLASH_BufferRead(Logo_Rbuff, PIC_LOGO_ADDR + logo_addroffset, LogoReadsize); + logo_addroffset += LogoReadsize; + if (logo_addroffset >= LOGO_MAX_SIZE_TFT35) + logo_addroffset = 0; +} - W25QXX.SPI_FLASH_BufferRead(default_view_Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset + 4, default_view_Readsize); - default_view_addroffset += default_view_Readsize; - if (default_view_addroffset >= DEFAULT_VIEW_MAX_SIZE) - default_view_addroffset = 0; +uint32_t default_view_addroffset = 0; +void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize) { + W25QXX.init(SPI_QUARTER_SPEED); - } + W25QXX.SPI_FLASH_BufferRead(default_view_Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset, default_view_Readsize); + default_view_addroffset += default_view_Readsize; + if (default_view_addroffset >= DEFAULT_VIEW_MAX_SIZE) + default_view_addroffset = 0; +} +#if HAS_BAK_VIEW_IN_FLASH uint32_t flash_view_addroffset = 0; void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize) { W25QXX.init(SPI_QUARTER_SPEED); @@ -728,9 +577,7 @@ void get_spi_flash_data(const char *rec_buf, int addr, int size) { flash_view_addroffset += flash_view_Readsize; if (flash_view_addroffset >= FLASH_VIEW_MAX_SIZE) flash_view_addroffset = 0; - } - #endif -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index b307cc8dba0f..4176ee023005 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -29,21 +29,61 @@ extern "C" { /* C-declarations for C++ */ #include #include "lvgl.h" -#if 1 +#include "../../inc/MarlinConfigPre.h" - #define PIC_MAX_CN 100 // Maximum number of pictures - #define PIC_NAME_MAX_LEN 50 // Picture name maximum length +#ifndef HAS_SPI_FLASH_FONT + #define HAS_SPI_FLASH_FONT 0 //disabled until fix the font load code +#endif +#ifndef HAS_GCODE_PREVIEW + #define HAS_GCODE_PREVIEW 1 +#endif +#ifndef HAS_LANG_SELECT_SCREEN + #define HAS_LANG_SELECT_SCREEN 0 +#endif +#ifndef HAS_BAK_VIEW_IN_FLASH + #define HAS_BAK_VIEW_IN_FLASH 1 +#endif +#ifndef HAS_GCODE_DEFAULT_VIEW_IN_FLASH + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 1 +#endif +#ifndef SPI_FLASH_SIZE + #define SPI_FLASH_SIZE 0x1000000 // 16MB +#endif - #define LOGO_MAX_SIZE_TFT35 (300*1024) - #define LOGO_MAX_SIZE_TFT32 (150*1024) - #define TITLELOGO_MAX_SIZE (150*1024) // Little logo maximum - #define DEFAULT_VIEW_MAX_SIZE (200*200*2) - #define FLASH_VIEW_MAX_SIZE (200*200*2) +#define PIC_MAX_CN 100 // Maximum number of pictures +#define PIC_NAME_MAX_LEN 50 // Picture name maximum length - #define PER_PIC_MAX_SPACE_TFT35 (32*1024) - #define PER_PIC_MAX_SPACE_TFT32 (16*1024) - #define PER_FONT_MAX_SPACE (16*1024) +#define LOGO_MAX_SIZE_TFT35 (300*1024) +#define LOGO_MAX_SIZE_TFT32 (150*1024) +#define TITLELOGO_MAX_SIZE (150*1024) // Little logo maximum +#define DEFAULT_VIEW_MAX_SIZE (200*200*2) +#define FLASH_VIEW_MAX_SIZE (200*200*2) +#define PER_PIC_MAX_SPACE_TFT35 (32*1024) +#define PER_PIC_MAX_SPACE_TFT32 (16*1024) +#define PER_FONT_MAX_SPACE (16*1024) + +#if SPI_FLASH_SIZE == 0x200000 + //pic + //Robin_pro pic addr + #define PIC_NAME_ADDR 0x001000 // Pic information addr + #define PIC_SIZE_ADDR 0x001800 // Pic size information addr + #define PIC_COUNTER_ADDR 0x002000 // Pic total number + #define PER_PIC_SAVE_ADDR 0x000000 // Storage address of each picture + #define PIC_LOGO_ADDR 0x000000 // Logo addr + #define PIC_DATA_ADDR 0x003000 // + + // TFT35 + #define DEFAULT_VIEW_ADDR_TFT35 0x1ea070 + #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) + #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) + #define PIC_DATA_ADDR_TFT35 0x003000 // (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 + + #define PIC_DATA_ADDR_TFT32 0x00F000 + #define PIC_ICON_LOGO_ADDR_TFT32 0x5D8000 + #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 + +#else //pic //Robin_pro pic addr #define PIC_NAME_ADDR 0x003000 // Pic information addr @@ -51,13 +91,13 @@ extern "C" { /* C-declarations for C++ */ #define PIC_COUNTER_ADDR 0x008000 // Pic total number #define PER_PIC_SAVE_ADDR 0x009000 // Storage address of each picture #define PIC_LOGO_ADDR 0x00A000 // Logo addr - //#define PIC_DATA_ADDR 0x02F000 // + //#define PIC_DATA_ADDR 0x02F000 // // TFT35 - #define DEFAULT_VIEW_ADDR_TFT35 0XC5800 - #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) - #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) - #define PIC_DATA_ADDR_TFT35 (PIC_ICON_LOGO_ADDR_TFT35+350*1024)//0XC5800 + #define DEFAULT_VIEW_ADDR_TFT35 0xC5800 + #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) + #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) + #define PIC_DATA_ADDR_TFT35 (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 // TFT32 #define PIC_DATA_ADDR_TFT32 0x02F000 @@ -69,48 +109,37 @@ extern "C" { /* C-declarations for C++ */ #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024 - // Flash flag - #define FLASH_INF_VALID_FLAG 0xAA558761 - // SD card information first addr - #define VAR_INF_ADDR 0x000000 - - union union32 { - uint8_t bytes[4]; - uint32_t dwords; - }; - - // pic information - struct pic_msg { - uint8_t name[PIC_NAME_MAX_LEN]; - union union32 size; - }; +#endif - typedef struct pic_msg PIC_MSG; +// Flash flag +#define FLASH_INF_VALID_FLAG 0xAA558761 +// SD card information first addr +#define VAR_INF_ADDR 0x000000 - #define BMP_WRITE_BUF_LEN 512 +union union32 { + uint8_t bytes[4]; + uint32_t dwords; +}; - #define PICINFOADDR 0 +// pic information +struct pic_msg { + uint8_t name[PIC_NAME_MAX_LEN]; + union union32 size; +}; - #define PIC_SIZE_xM 6 - #define FONT_SIZE_xM 2 +typedef struct pic_msg PIC_MSG; - //extern void PicMsg_Init(void); - extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff); - //extern void bindBmpFileData(const uint8_t **pBuf, uint8_t *pName); - //extern void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize); - //extern void default_view_Read(uint8_t *default_view_Rbuff,uint32_t default_view_Readsize); - //extern void flash_view_Read(uint8_t *flash_view_Rbuff,uint32_t flash_view_Readsize); +#define BMP_WRITE_BUF_LEN 512 - //extern void lv_Pic_Read(uint8_t *Pname,uint8_t *P_Rbuff,uint32_t addr,uint32_t size); - extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); +#define PICINFOADDR 0 -#endif +#define PIC_SIZE_xM 6 +#define FONT_SIZE_xM 2 +extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff); +extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); extern uint32_t lv_get_pic_addr(uint8_t *Pname); - extern void get_spi_flash_data(const char *rec_buf, int offset, int size); -//extern void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); - extern void spi_flash_read_test(); extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp index 584a009badfb..ac876bb16a43 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" @@ -215,4 +215,4 @@ } } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index 25fd7082d9c5..7e782c3fefd0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -22,7 +22,7 @@ #include "../../../../inc/MarlinConfig.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs @@ -230,7 +230,7 @@ return uint32_t(data); } - #if ENABLED(LCD_USE_DMA_FSMC) + #ifdef LCD_USE_DMA_FSMC void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { while (count > 0) { @@ -270,4 +270,4 @@ #endif // LCD_USE_DMA_FSMC #endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index a34b1ff4709b..54c030f96711 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -27,765 +27,751 @@ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) - #include "../../../../MarlinCore.h" +#include "../../../../MarlinCore.h" - #include "tft_lvgl_configuration.h" - #include "lvgl.h" - #include "../../../../feature/touch/xpt2046.h" - #include "draw_ready_print.h" - #include "W25Qxx.h" - #include "pic_manager.h" +#include "tft_lvgl_configuration.h" +#include "lvgl.h" +#include "../../../../feature/touch/xpt2046.h" +#include "draw_ready_print.h" +#include "W25Qxx.h" +#include "pic_manager.h" - #include "mks_hardware_test.h" - #include "draw_ui.h" +#include "mks_hardware_test.h" +#include "draw_ui.h" - #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" - #endif - - #include - - #if ENABLED(SPI_GRAPHICAL_TFT) - #include "SPI_TFT.h" - #endif +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif -//#include "../../Configuration.h" -//#include "../../src/core/macros.h" +#include - extern void LCD_IO_Init(uint8_t cs, uint8_t rs); - extern void LCD_IO_WriteData(uint16_t RegValue); - extern void LCD_IO_WriteReg(uint16_t Reg); +#if ENABLED(SPI_GRAPHICAL_TFT) + #include "SPI_TFT.h" +#endif - extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); +extern void LCD_IO_Init(uint8_t cs, uint8_t rs); +extern void LCD_IO_WriteData(uint16_t RegValue); +extern void LCD_IO_WriteReg(uint16_t Reg); +extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); +extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); +#if HAS_SPI_FLASH_FONT extern void init_gb2312_font(); +#endif - static lv_disp_buf_t disp_buf; -//static lv_color_t buf[LV_HOR_RES_MAX * 18]; -//static lv_color_t buf[10*5]; -//extern lv_obj_t * scr; - #if ENABLED(SDSUPPORT) - extern void UpdatePic(); +static lv_disp_buf_t disp_buf; +#if ENABLED(SDSUPPORT) + extern void UpdatePic(); + #if HAS_SPI_FLASH_FONT extern void UpdateFont(); #endif - uint16_t DeviceCode = 0x9488; - extern uint8_t sel_id; +#endif +uint16_t DeviceCode = 0x9488; +extern uint8_t sel_id; + +#define SetCs +#define ClrCs + +#define HDP 799 // Horizontal Display Period +#define HT 1000 // Horizontal Total +#define HPS 51 // LLINE Pulse Start Position +#define LPS 3 // Horizontal Display Period Start Position +#define HPW 8 // LLINE Pulse Width + +#define VDP 479 // Vertical Display Period +#define VT 530 // Vertical Total +#define VPS 24 // LFRAME Pulse Start Position +#define FPS 23 // Vertical Display Period Start Positio +#define VPW 3 // LFRAME Pulse Width + +#define MAX_HZ_POSX HDP+1 +#define MAX_HZ_POSY VDP+1 + +extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg; + +void SysTick_Callback() { + lv_tick_inc(1); + print_time_count(); +} + +void tft_set_cursor(uint16_t x, uint16_t y) { + LCD_IO_WriteReg(0x002A); + LCD_IO_WriteData(x >> 8); + LCD_IO_WriteData(x & 0x00FF); + LCD_IO_WriteData(x >> 8); + LCD_IO_WriteData(x & 0x00FF); + //ILI9488_WriteData(0x01); + //ILI9488_WriteData(0xDF); + LCD_IO_WriteReg(0x002B); + LCD_IO_WriteData(y >> 8); + LCD_IO_WriteData(y & 0x00FF); + LCD_IO_WriteData(y >> 8); + LCD_IO_WriteData(y & 0x00FF); + //ILI9488_WriteData(0x01); + //ILI9488_WriteData(0x3F); +} + +void LCD_WriteRAM_Prepare(void) { + #if 0 + if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x8989)) { + ClrCs + LCD->LCD_REG = R34; + SetCs + } + else { + LCD_WrtReg(0x002C); + } + #else + LCD_IO_WriteReg(0x002C); + #endif +} + +void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { + //if (DeviceCode == 0x9488) { + if ((x > 480) || (y > 320)) return; + //} + //**if ( (x>320)||(y>240) ) return; + tft_set_cursor(x, y); /*设置光标ä½ç½®*/ + + LCD_WriteRAM_Prepare(); /* 开始写入GRAM*/ + //LCD_WriteRAM(point); + LCD_IO_WriteData(point); +} + +void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) { + /* Write 16-bit Index, then Write Reg */ + ClrCs + LCD_IO_WriteReg(LCD_Reg); + /* Write 16-bit Reg */ + LCD_IO_WriteData(LCD_RegValue); + SetCs +} + +void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh) { + uint16_t s_h, s_l, e_h, e_l; + uint16_t xEnd, yEnd; + xEnd = StartX + width; + yEnd = StartY + heigh - 1; + if (DeviceCode == 0x8989) { + /*LCD_WriteReg(0x0044, (StartX & 0xFF) | (xEnd << 8)); + LCD_WriteReg(0x0045, StartY); + LCD_WriteReg(0x0046, yEnd);*/ + LCD_WriteReg(0x0044, (StartY & 0xFF) | (yEnd << 8)); + LCD_WriteReg(0x0045, StartX); + LCD_WriteReg(0x0046, xEnd); + } + else if (DeviceCode == 0x9488) { + s_h = (StartX >> 8) & 0x00ff; + s_l = StartX & 0x00ff; + e_h = ((StartX + width - 1) >> 8) & 0x00ff; + e_l = (StartX + width - 1) & 0x00ff; + + LCD_IO_WriteReg(0x002A); + LCD_IO_WriteData(s_h); + LCD_IO_WriteData(s_l); + LCD_IO_WriteData(e_h); + LCD_IO_WriteData(e_l); + + s_h = (StartY >> 8) & 0x00ff; + s_l = StartY & 0x00ff; + e_h = ((StartY + heigh - 1) >> 8) & 0x00ff; + e_l = (StartY + heigh - 1) & 0x00ff; + + LCD_IO_WriteReg(0x002B); + LCD_IO_WriteData(s_h); + LCD_IO_WriteData(s_l); + LCD_IO_WriteData(e_h); + LCD_IO_WriteData(e_l); + } + else if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x1505)) { + /* LCD_WriteReg(0x0050, StartX); + LCD_WriteReg(0x0052, StartY); + LCD_WriteReg(0x0051, xEnd); + LCD_WriteReg(0x0053, yEnd);*/ + LCD_WriteReg(0x0050, StartY); //Specify the start/end positions of the window address in the horizontal direction by an address unit + LCD_WriteReg(0x0051, yEnd); //Specify the start positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0052, 320 - xEnd); + LCD_WriteReg(0x0053, 320 - StartX - 1); //Specify the end positions of the window address in the vertical direction by an address unit - #define SetCs - #define ClrCs + } + else { + s_h = (StartX >> 8) & 0xFF; + s_l = StartX & 0xFF; + e_h = ((StartX + width - 1) >> 8) & 0xFF; + e_l = (StartX + width - 1) & 0xFF; + + LCD_IO_WriteReg(0x2A); + LCD_IO_WriteData(s_h); + LCD_IO_WriteData(s_l); + LCD_IO_WriteData(e_h); + LCD_IO_WriteData(e_l); + + s_h = (StartY >> 8) & 0xFF; + s_l = StartY & 0xFF; + e_h = ((StartY + heigh - 1) >> 8) & 0xFF; + e_l = (StartY + heigh - 1) & 0xFF; + + LCD_IO_WriteReg(0x2B); + LCD_IO_WriteData(s_h); + LCD_IO_WriteData(s_l); + LCD_IO_WriteData(e_h); + LCD_IO_WriteData(e_l); + } +} + +void LCD_Clear(uint16_t Color) { + uint32_t index = 0; + unsigned int count; + + if (DeviceCode == 0x9488) { + tft_set_cursor(0, 0); + ili9320_SetWindows(0, 0, 480, 320); + LCD_WriteRAM_Prepare(); + #ifdef LCD_USE_DMA_FSMC + LCD_IO_WriteMultiple(Color, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT); + #else + //index = (160*480); + for (index = 0; index < 320 * 480; index++) + LCD_IO_WriteData(Color); + #endif + //LCD_IO_WriteMultiple(Color, (480*320)); + //while(index --) LCD_IO_WriteData(Color); + } + else if (DeviceCode == 0x5761) { + LCD_IO_WriteReg(0x002a); + LCD_IO_WriteData(0); + LCD_IO_WriteData(0); + LCD_IO_WriteData(HDP >> 8); + LCD_IO_WriteData(HDP & 0x00ff); + LCD_IO_WriteReg(0x002b); + LCD_IO_WriteData(0); + LCD_IO_WriteData(0); + LCD_IO_WriteData(VDP >> 8); + LCD_IO_WriteData(VDP & 0x00ff); + LCD_IO_WriteReg(0x002c); + LCD_IO_WriteReg(0x002c); + for (count = 0; count < (HDP + 1) * (VDP + 1); count++) + LCD_IO_WriteData(Color); + } + else { + tft_set_cursor(0, 0); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + for (index = 0; index < 76800; index++) + LCD_IO_WriteData(Color); + } +} - #define HDP 799//Horizontal Display Period //** - #define HT 1000//Horizontal Total - #define HPS 51//LLINE Pulse Start Position - #define LPS 3 // Horizontal Display Period Start Position - #define HPW 8 // LLINE Pulse Width +extern uint16_t ILI9488_ReadRAM(); - #define VDP 479//Vertical Display Period - #define VT 530//Vertical Total - #define VPS 24// LFRAME Pulse Start Position - #define FPS 23//Vertical Display Period Start Positio - #define VPW 3 // LFRAME Pulse Width //** +#if DISABLED(SPI_GRAPHICAL_TFT) - #define MAX_HZ_POSX HDP+1 - #define MAX_HZ_POSY VDP+1 +void init_tft() { + uint16_t i; + //************* Start Initial Sequence **********// - extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg; + //start lcd pins and dma + #if PIN_EXISTS(LCD_BACKLIGHT) + OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away + #endif - void SysTick_Callback() { - lv_tick_inc(1); - print_time_count(); - } + #if PIN_EXISTS(LCD_RESET) + // Perform a clean hardware reset with needed delays + OUT_WRITE(LCD_RESET_PIN, LOW); + _delay_ms(5); + WRITE(LCD_RESET_PIN, HIGH); + _delay_ms(5); + #endif - void tft_set_cursor(uint16_t x, uint16_t y) { - #if 0 - if (DeviceCode == 0x8989) { - LCD_WriteReg(0x004E, y); //è¡Œ - LCD_WriteReg(0x004F, x); //列 - } - else if ((DeviceCode == 0x9919)) { - LCD_WriteReg(0x004E, x); // è¡Œ - LCD_WriteReg(0x004F, y); // 列 - } - else if ((DeviceCode == 0x5761)) { //SSD1963 - LCD_WrtReg(0x002A); - LCD_WrtRAM(x >> 8); - LCD_WrtRAM(x & 0x00FF); - LCD_WrtRAM(HDP >> 8); - LCD_WrtRAM(HDP & 0x00FF); - LCD_WrtReg(0x002B); - LCD_WrtRAM(y >> 8); - LCD_WrtRAM(y & 0x00FF); - LCD_WrtRAM(VDP >> 8); - LCD_WrtRAM(VDP & 0x00FF); - } - else if (DeviceCode == 0x9488) { - ILI9488_WriteCmd(0x002A); - ILI9488_WriteData(x >> 8); - ILI9488_WriteData(x & 0x00FF); - ILI9488_WriteData(x >> 8); - ILI9488_WriteData(x & 0x00FF); - //ILI9488_WriteData(0x01); - //ILI9488_WriteData(0xDF); - ILI9488_WriteCmd(0x002B); - ILI9488_WriteData(y >> 8); - ILI9488_WriteData(y & 0x00FF); - ILI9488_WriteData(y >> 8); - ILI9488_WriteData(y & 0x00FF); - //ILI9488_WriteData(0x01); - //ILI9488_WriteData(0x3F); - } - else { - LCD_WriteReg(0x0020, y); // è¡Œ - LCD_WriteReg(0x0021, 0x13f - x); // 列 - } - #else // if 0 - LCD_IO_WriteReg(0x002A); - LCD_IO_WriteData(x >> 8); - LCD_IO_WriteData(x & 0x00FF); - LCD_IO_WriteData(x >> 8); - LCD_IO_WriteData(x & 0x00FF); - //ILI9488_WriteData(0x01); - //ILI9488_WriteData(0xDF); - LCD_IO_WriteReg(0x002B); - LCD_IO_WriteData(y >> 8); - LCD_IO_WriteData(y & 0x00FF); - LCD_IO_WriteData(y >> 8); - LCD_IO_WriteData(y & 0x00FF); - //ILI9488_WriteData(0x01); - //ILI9488_WriteData(0x3F); - #endif // if 0 - } + #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) + WRITE(LCD_BACKLIGHT_PIN, HIGH); + #endif - void LCD_WriteRAM_Prepare(void) { - #if 0 - if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x8989)) { - ClrCs - LCD->LCD_REG = R34; - SetCs - } - else { - LCD_WrtReg(0x002C); - } - #else - LCD_IO_WriteReg(0x002C); - #endif - } + TERN_(HAS_LCD_CONTRAST, refresh_contrast()); - void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { - //if (DeviceCode == 0x9488) { - if ((x > 480) || (y > 320)) return; - //} - //**if ( (x>320)||(y>240) ) return; - tft_set_cursor(x, y); /*设置光标ä½ç½®*/ + #ifdef LCD_USE_DMA_FSMC + dma_init(FSMC_DMA_DEV); + dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); + #endif - LCD_WriteRAM_Prepare(); /* 开始写入GRAM*/ - //LCD_WriteRAM(point); - LCD_IO_WriteData(point); - } + LCD_IO_Init(FSMC_CS_PIN, FSMC_RS_PIN); + + _delay_ms(5); + + LCD_IO_WriteReg(0x00D3); + DeviceCode = ILI9488_ReadRAM(); //dummy read + DeviceCode = ILI9488_ReadRAM(); + DeviceCode = ILI9488_ReadRAM(); + DeviceCode <<= 8; + DeviceCode |= ILI9488_ReadRAM(); + + if (DeviceCode == 0x9488) { + LCD_IO_WriteReg(0x00E0); + LCD_IO_WriteData(0x0000); + LCD_IO_WriteData(0x0007); + LCD_IO_WriteData(0x000f); + LCD_IO_WriteData(0x000D); + LCD_IO_WriteData(0x001B); + LCD_IO_WriteData(0x000A); + LCD_IO_WriteData(0x003c); + LCD_IO_WriteData(0x0078); + LCD_IO_WriteData(0x004A); + LCD_IO_WriteData(0x0007); + LCD_IO_WriteData(0x000E); + LCD_IO_WriteData(0x0009); + LCD_IO_WriteData(0x001B); + LCD_IO_WriteData(0x001e); + LCD_IO_WriteData(0x000f); + + LCD_IO_WriteReg(0x00E1); + LCD_IO_WriteData(0x0000); + LCD_IO_WriteData(0x0022); + LCD_IO_WriteData(0x0024); + LCD_IO_WriteData(0x0006); + LCD_IO_WriteData(0x0012); + LCD_IO_WriteData(0x0007); + LCD_IO_WriteData(0x0036); + LCD_IO_WriteData(0x0047); + LCD_IO_WriteData(0x0047); + LCD_IO_WriteData(0x0006); + LCD_IO_WriteData(0x000a); + LCD_IO_WriteData(0x0007); + LCD_IO_WriteData(0x0030); + LCD_IO_WriteData(0x0037); + LCD_IO_WriteData(0x000f); + + LCD_IO_WriteReg(0x00C0); + LCD_IO_WriteData(0x0010); + LCD_IO_WriteData(0x0010); + + LCD_IO_WriteReg(0x00C1); + LCD_IO_WriteData(0x0041); + + LCD_IO_WriteReg(0x00C5); + LCD_IO_WriteData(0x0000); + LCD_IO_WriteData(0x0022); + LCD_IO_WriteData(0x0080); + + LCD_IO_WriteReg(0x0036); + //ILI9488_WriteData(0x0068); + //if (gCfgItems.overturn_180 != 0xEE) + //{ + LCD_IO_WriteData(0x0068); + //} + //else + //{ + //ILI9488_WriteData(0x00A8); + //} - void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) { - /* Write 16-bit Index, then Write Reg */ - ClrCs - LCD_IO_WriteReg(LCD_Reg); - /* Write 16-bit Reg */ - LCD_IO_WriteData(LCD_RegValue); - SetCs - } + LCD_IO_WriteReg(0x003A); //Interface Mode Control + LCD_IO_WriteData(0x0055); - void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh) { - uint16_t s_h, s_l, e_h, e_l; - - uint16_t xEnd, yEnd; - xEnd = StartX + width; - yEnd = StartY + heigh - 1; - if (DeviceCode == 0x8989) { - /*LCD_WriteReg(0x0044, (StartX & 0xFF) | (xEnd << 8)); - LCD_WriteReg(0x0045, StartY); - LCD_WriteReg(0x0046, yEnd);*/ - LCD_WriteReg(0x0044, (StartY & 0xFF) | (yEnd << 8)); - LCD_WriteReg(0x0045, StartX); - LCD_WriteReg(0x0046, xEnd); - } - else if (DeviceCode == 0x9488) { - s_h = (StartX >> 8) & 0x00ff; - s_l = StartX & 0x00ff; - e_h = ((StartX + width - 1) >> 8) & 0x00ff; - e_l = (StartX + width - 1) & 0x00ff; - - LCD_IO_WriteReg(0x002A); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - - s_h = (StartY >> 8) & 0x00ff; - s_l = StartY & 0x00ff; - e_h = ((StartY + heigh - 1) >> 8) & 0x00ff; - e_l = (StartY + heigh - 1) & 0x00ff; - - LCD_IO_WriteReg(0x002B); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - } - else if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x1505)) { - /* LCD_WriteReg(0x0050, StartX); - LCD_WriteReg(0x0052, StartY); - LCD_WriteReg(0x0051, xEnd); - LCD_WriteReg(0x0053, yEnd);*/ - LCD_WriteReg(0x0050, StartY); //Specify the start/end positions of the window address in the horizontal direction by an address unit - LCD_WriteReg(0x0051, yEnd); //Specify the start positions of the window address in the vertical direction by an address unit - LCD_WriteReg(0x0052, 320 - xEnd); - LCD_WriteReg(0x0053, 320 - StartX - 1); //Specify the end positions of the window address in the vertical direction by an address unit + LCD_IO_WriteReg(0x00B0); //Interface Mode Control + LCD_IO_WriteData(0x0000); + LCD_IO_WriteReg(0x00B1); //Frame rate 70HZ + LCD_IO_WriteData(0x00B0); + LCD_IO_WriteData(0x0011); + LCD_IO_WriteReg(0x00B4); + LCD_IO_WriteData(0x0002); + LCD_IO_WriteReg(0x00B6); //RGB/MCU Interface Control + LCD_IO_WriteData(0x0002); + LCD_IO_WriteData(0x0042); - } - else { - s_h = (StartX >> 8) & 0xFF; - s_l = StartX & 0xFF; - e_h = ((StartX + width - 1) >> 8) & 0xFF; - e_l = (StartX + width - 1) & 0xFF; - - LCD_IO_WriteReg(0x2A); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - - s_h = (StartY >> 8) & 0xFF; - s_l = StartY & 0xFF; - e_h = ((StartY + heigh - 1) >> 8) & 0xFF; - e_l = (StartY + heigh - 1) & 0xFF; - - LCD_IO_WriteReg(0x2B); - LCD_IO_WriteData(s_h); - LCD_IO_WriteData(s_l); - LCD_IO_WriteData(e_h); - LCD_IO_WriteData(e_l); - } - } + LCD_IO_WriteReg(0x00B7); + LCD_IO_WriteData(0x00C6); - void LCD_Clear(uint16_t Color) { - uint32_t index = 0; - unsigned int count; + //WriteComm(0xBE); + //WriteData(0x00); + //WriteData(0x04); - if (DeviceCode == 0x9488) { - tft_set_cursor(0, 0); - ili9320_SetWindows(0, 0, 480, 320); - LCD_WriteRAM_Prepare(); - //index = (160*480); - for (index = 0; index < 320 * 480; index++) - LCD_IO_WriteData(Color); - //LCD_IO_WriteMultiple(Color, (480*320)); - //while(index --) LCD_IO_WriteData(Color); - } - else if (DeviceCode == 0x5761) { - LCD_IO_WriteReg(0x002a); - LCD_IO_WriteData(0); - LCD_IO_WriteData(0); - LCD_IO_WriteData(HDP >> 8); - LCD_IO_WriteData(HDP & 0x00ff); - LCD_IO_WriteReg(0x002b); - LCD_IO_WriteData(0); - LCD_IO_WriteData(0); - LCD_IO_WriteData(VDP >> 8); - LCD_IO_WriteData(VDP & 0x00ff); - LCD_IO_WriteReg(0x002c); - LCD_IO_WriteReg(0x002c); - for (count = 0; count < (HDP + 1) * (VDP + 1); count++) - LCD_IO_WriteData(Color); - } - else { - tft_set_cursor(0, 0); - LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ - for (index = 0; index < 76800; index++) - LCD_IO_WriteData(Color); - } - } + LCD_IO_WriteReg(0x00E9); + LCD_IO_WriteData(0x0000); - extern uint16_t ILI9488_ReadRAM(); + LCD_IO_WriteReg(0x00F7); + LCD_IO_WriteData(0x00A9); + LCD_IO_WriteData(0x0051); + LCD_IO_WriteData(0x002C); + LCD_IO_WriteData(0x0082); - #if DISABLED(SPI_GRAPHICAL_TFT) + LCD_IO_WriteReg(0x0011); + for (i = 0; i < 65535; i++); + LCD_IO_WriteReg(0x0029); - void init_tft() { - uint16_t i; - //************* Start Initial Sequence **********// + ili9320_SetWindows(0, 0, 480, 320); + LCD_Clear(0x0000); - LCD_IO_Init(FSMC_CS_PIN, FSMC_RS_PIN); + OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); + } +} - _delay_ms(5); +#endif // if DISABLED(SPI_GRAPHICAL_TFT) - LCD_IO_WriteReg(0x00D3); - DeviceCode = ILI9488_ReadRAM(); //dummy read - DeviceCode = ILI9488_ReadRAM(); - DeviceCode = ILI9488_ReadRAM(); - DeviceCode <<= 8; - DeviceCode |= ILI9488_ReadRAM(); - - if (DeviceCode == 0x9488) { - LCD_IO_WriteReg(0x00E0); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x000f); - LCD_IO_WriteData(0x000D); - LCD_IO_WriteData(0x001B); - LCD_IO_WriteData(0x000A); - LCD_IO_WriteData(0x003c); - LCD_IO_WriteData(0x0078); - LCD_IO_WriteData(0x004A); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x000E); - LCD_IO_WriteData(0x0009); - LCD_IO_WriteData(0x001B); - LCD_IO_WriteData(0x001e); - LCD_IO_WriteData(0x000f); - - LCD_IO_WriteReg(0x00E1); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0022); - LCD_IO_WriteData(0x0024); - LCD_IO_WriteData(0x0006); - LCD_IO_WriteData(0x0012); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x0036); - LCD_IO_WriteData(0x0047); - LCD_IO_WriteData(0x0047); - LCD_IO_WriteData(0x0006); - LCD_IO_WriteData(0x000a); - LCD_IO_WriteData(0x0007); - LCD_IO_WriteData(0x0030); - LCD_IO_WriteData(0x0037); - LCD_IO_WriteData(0x000f); - - LCD_IO_WriteReg(0x00C0); - LCD_IO_WriteData(0x0010); - LCD_IO_WriteData(0x0010); - - LCD_IO_WriteReg(0x00C1); - LCD_IO_WriteData(0x0041); - - LCD_IO_WriteReg(0x00C5); - LCD_IO_WriteData(0x0000); - LCD_IO_WriteData(0x0022); - LCD_IO_WriteData(0x0080); - - LCD_IO_WriteReg(0x0036); - //ILI9488_WriteData(0x0068); - //if (gCfgItems.overturn_180 != 0xEE) - //{ - LCD_IO_WriteData(0x0068); - //} - //else - //{ - //ILI9488_WriteData(0x00A8); - //} - - LCD_IO_WriteReg(0x003A); //Interface Mode Control - LCD_IO_WriteData(0x0055); - - LCD_IO_WriteReg(0x00B0); //Interface Mode Control - LCD_IO_WriteData(0x0000); - LCD_IO_WriteReg(0x00B1); //Frame rate 70HZ - LCD_IO_WriteData(0x00B0); - LCD_IO_WriteData(0x0011); - LCD_IO_WriteReg(0x00B4); - LCD_IO_WriteData(0x0002); - LCD_IO_WriteReg(0x00B6); //RGB/MCU Interface Control - LCD_IO_WriteData(0x0002); - LCD_IO_WriteData(0x0042); - - LCD_IO_WriteReg(0x00B7); - LCD_IO_WriteData(0x00C6); - - //WriteComm(0xBE); - //WriteData(0x00); - //WriteData(0x04); - - LCD_IO_WriteReg(0x00E9); - LCD_IO_WriteData(0x0000); - - LCD_IO_WriteReg(0x00F7); - LCD_IO_WriteData(0x00A9); - LCD_IO_WriteData(0x0051); - LCD_IO_WriteData(0x002C); - LCD_IO_WriteData(0x0082); - - LCD_IO_WriteReg(0x0011); - for (i = 0; i < 65535; i++); - LCD_IO_WriteReg(0x0029); - - ili9320_SetWindows(0, 0, 480, 320); - LCD_Clear(0x0000); - - OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); - } - } +extern uint8_t bmp_public_buf[17 * 1024]; +void tft_lvgl_init() { + //uint16_t test_id=0; + W25QXX.init(SPI_QUARTER_SPEED); + //test_id=W25QXX.W25QXX_ReadID(); - #endif // if DISABLED(SPI_GRAPHICAL_TFT) + //init tft first! + #if ENABLED(SPI_GRAPHICAL_TFT) + SPI_TFT.spi_init(SPI_FULL_SPEED); + SPI_TFT.LCD_init(); + #else + init_tft(); + #endif - extern uint8_t bmp_public_buf[17 * 1024]; - void tft_lvgl_init() { - //uint16_t test_id=0; - W25QXX.init(SPI_QUARTER_SPEED); - //test_id=W25QXX.W25QXX_ReadID(); - #if ENABLED(SDSUPPORT) - UpdatePic(); + #if ENABLED(SDSUPPORT) + UpdatePic(); + #if HAS_SPI_FLASH_FONT UpdateFont(); #endif + #endif - gCfgItems_init(); - ui_cfg_init(); - disp_language_init(); - //spi_flash_read_test(); + gCfgItems_init(); + ui_cfg_init(); + disp_language_init(); + //spi_flash_read_test(); - #if ENABLED(SPI_GRAPHICAL_TFT) - SPI_TFT.spi_init(SPI_FULL_SPEED); - SPI_TFT.LCD_init(); - #else - init_tft(); - #endif + #if ENABLED(TOUCH_BUTTONS) + touch.init(); + #endif - lv_init(); + lv_init(); - lv_disp_buf_init(&disp_buf, bmp_public_buf, NULL, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/ + lv_disp_buf_init(&disp_buf, bmp_public_buf, NULL, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/ - lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ - lv_disp_drv_init(&disp_drv); /*Basic initialization*/ - disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/ - disp_drv.buffer = &disp_buf; /*Assign the buffer to the display*/ - lv_disp_drv_register(&disp_drv); /*Finally register the driver*/ + lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ + lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/ + disp_drv.buffer = &disp_buf; /*Assign the buffer to the display*/ + lv_disp_drv_register(&disp_drv); /*Finally register the driver*/ - lv_indev_drv_t indev_drv; - lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/ - indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/ - indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ - lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ + lv_indev_drv_t indev_drv; + lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/ + indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/ + indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ + lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ - systick_attach_callback(SysTick_Callback); + systick_attach_callback(SysTick_Callback); + #if HAS_SPI_FLASH_FONT init_gb2312_font(); + #endif - tft_style_init(); - - filament_pin_setup(); + tft_style_init(); - #if ENABLED(POWER_LOSS_RECOVERY) - if (recovery.valid()) { - if (gCfgItems.from_flash_pic == 1) - flash_preview_begin = 1; - else - default_preview_flg = 1; + filament_pin_setup(); - uiCfg.print_state = REPRINTING; + #if ENABLED(POWER_LOSS_RECOVERY) + if (recovery.valid()) { + if (gCfgItems.from_flash_pic == 1) + flash_preview_begin = 1; + else + default_preview_flg = 1; - memset(public_buf_m, 0, sizeof(public_buf_m)); - strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); - card.printLongPath(public_buf_m); + uiCfg.print_state = REPRINTING; - strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id])); + memset(public_buf_m, 0, sizeof(public_buf_m)); + strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); + card.printLongPath(public_buf_m); - lv_draw_printing(); - } - else - #endif - lv_draw_ready_print(); + strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id])); - #if ENABLED(MKS_TEST) - Test_GPIO(); - #endif + lv_draw_printing(); } + else + #endif + lv_draw_ready_print(); - #if 0 - void LCD_WriteRAM(uint16_t RGB_Code) { - #if 0 - ClrCs - /* Write 16-bit GRAM Reg */ - LCD->LCD_RAM = RGB_Code; - SetCs - #else - LCD_IO_WriteData(RGB_Code); - #endif - } + #if ENABLED(MKS_TEST) + Test_GPIO(); #endif +} - void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { - #if ENABLED(SPI_GRAPHICAL_TFT) - uint16_t i, width, height; - uint16_t clr_temp; - uint8_t tbuf[480 * 2]; +void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { + #if ENABLED(SPI_GRAPHICAL_TFT) + uint16_t i, width, height; + uint16_t clr_temp; + uint8_t tbuf[480 * 2]; + + SPI_TFT.spi_init(SPI_FULL_SPEED); + + width = area->x2 - area->x1 + 1; + height = area->y2 - area->y1 + 1; + + for (int j = 0; j < height; j++) { + SPI_TFT.SetCursor(0, 0); + SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1 + j, width, 1); + SPI_TFT.LCD_WriteRAM_Prepare(); + + for (i = 0; i < width * 2;) { + clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) + | ((uint16_t)color_p->ch.green << 5) + | ((uint16_t)color_p->ch.blue)); - SPI_TFT.spi_init(SPI_FULL_SPEED); + tbuf[i] = clr_temp >> 8; + tbuf[i + 1] = clr_temp; + i += 2; + color_p++; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(tbuf, width * 2, true); + SPI_TFT_CS_H; + } + + lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ + W25QXX.init(SPI_QUARTER_SPEED); + #else + #if 1 + uint16_t i, width, height; + uint16_t clr_temp; width = area->x2 - area->x1 + 1; height = area->y2 - area->y1 + 1; - - for (int j = 0; j < height; j++) { - SPI_TFT.SetCursor(0, 0); - SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1 + j, width, 1); - SPI_TFT.LCD_WriteRAM_Prepare(); - - for (i = 0; i < width * 2;) { - clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) - | ((uint16_t)color_p->ch.green << 5) - | ((uint16_t)color_p->ch.blue)); - - tbuf[i] = clr_temp >> 8; - tbuf[i + 1] = clr_temp; - i += 2; - color_p++; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(tbuf, width * 2, true); - SPI_TFT_CS_H; + ili9320_SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height); + LCD_WriteRAM_Prepare(); + for (i = 0; i < width * height - 2; i++) { + clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) + | ((uint16_t)color_p->ch.green << 5) + | ((uint16_t)color_p->ch.blue)); + LCD_IO_WriteData(clr_temp); + color_p++; } lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ + #endif + #endif // SPI_GRAPHICAL_TFT +} - W25QXX.init(SPI_QUARTER_SPEED); - #else - #if 1 - uint16_t i, width, height; - uint16_t clr_temp; - #if 0 - int32_t x, y; - for (y = area->y1; y <= area->y2; y++) - for (x = area->x1; x <= area->x2; x++) { - //set_pixel(x, y, *color_p); /* Put a pixel to the display.*/ - clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) - | ((uint16_t)color_p->ch.green << 5) - | ((uint16_t)color_p->ch.blue)); - tft_set_point(x, y, clr_temp); - color_p++; - } - - #else - width = area->x2 - area->x1 + 1; - height = area->y2 - area->y1 + 1; - //tft_set_cursor((uint16_t)area->x1,(uint16_t)area->y1); - ili9320_SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height); - LCD_WriteRAM_Prepare(); - for (i = 0; i < width * height; i++) { - clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) - | ((uint16_t)color_p->ch.green << 5) - | ((uint16_t)color_p->ch.blue)); - LCD_IO_WriteData(clr_temp); - color_p++; - } - #endif - - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ - #endif - #endif // SPI_GRAPHICAL_TFT - } - - #define TICK_CYCLE 1 +#define TICK_CYCLE 1 - static int32_t touch_time1 = 0; +static int32_t touch_time1 = 0; - unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { - if (lastTick <= curTick) - return (curTick - lastTick) * TICK_CYCLE; - else - return (0xFFFFFFFF - lastTick + curTick) * TICK_CYCLE; - } +unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { + return TICK_CYCLE * (lastTick <= curTick ? (curTick - lastTick) : (0xFFFFFFFF - lastTick + curTick)); +} - #if ENABLED(SPI_GRAPHICAL_TFT) +#if ENABLED(SPI_GRAPHICAL_TFT) - #ifndef USE_XPT2046 - #define USE_XPT2046 1 - #define XPT2046_XY_SWAP 1 - #define XPT2046_X_INV 1 - #define XPT2046_Y_INV 0 - #endif + #ifndef USE_XPT2046 + #define USE_XPT2046 1 + #define XPT2046_XY_SWAP 1 + #define XPT2046_X_INV 1 + #define XPT2046_Y_INV 0 + #endif - #if USE_XPT2046 - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 201 - #define XPT2046_Y_MIN 164 - #define XPT2046_X_MAX 3919 - #define XPT2046_Y_MAX 3776 - #define XPT2046_AVG 4 - #define XPT2046_INV 1 - #endif + #if USE_XPT2046 + #define XPT2046_HOR_RES 480 + #define XPT2046_VER_RES 320 + #define XPT2046_X_MIN 201 + #define XPT2046_Y_MIN 164 + #define XPT2046_X_MAX 3919 + #define XPT2046_Y_MAX 3776 + #define XPT2046_AVG 4 + #define XPT2046_INV 1 + #endif - #else +#else - #ifndef USE_XPT2046 - #define USE_XPT2046 1 + #ifndef USE_XPT2046 + #define USE_XPT2046 1 + #ifndef XPT2046_XY_SWAP #define XPT2046_XY_SWAP 1 + #endif + #ifndef XPT2046_X_INV #define XPT2046_X_INV 0 + #endif + #ifndef XPT2046_Y_INV #define XPT2046_Y_INV 1 #endif + #endif - #if USE_XPT2046 + #if USE_XPT2046 + #ifndef XPT2046_HOR_RES 480 #define XPT2046_HOR_RES 480 + #endif + #ifndef XPT2046_VER_RES #define XPT2046_VER_RES 320 + #endif + #ifndef XPT2046_X_MIN #define XPT2046_X_MIN 201 + #endif + #ifndef XPT2046_Y_MIN #define XPT2046_Y_MIN 164 + #endif + #ifndef XPT2046_X_MAX #define XPT2046_X_MAX 3919 + #endif + #ifndef XPT2046_Y_MAX #define XPT2046_Y_MAX 3776 + #endif + #ifndef XPT2046_AVG #define XPT2046_AVG 4 + #endif + #ifndef XPT2046_INV #define XPT2046_INV 0 #endif + #endif +#endif + +static void xpt2046_corr(uint16_t *x, uint16_t *y) { + #if XPT2046_XY_SWAP + int16_t swap_tmp; + swap_tmp = *x; + *x = *y; + *y = swap_tmp; + #endif + if ((*x) > XPT2046_X_MIN) (*x) -= XPT2046_X_MIN; else (*x) = 0; + if ((*y) > XPT2046_Y_MIN) (*y) -= XPT2046_Y_MIN; else (*y) = 0; + (*x) = uint32_t(uint32_t(*x) * XPT2046_HOR_RES) / (XPT2046_X_MAX - XPT2046_X_MIN); + (*y) = uint32_t(uint32_t(*y) * XPT2046_VER_RES) / (XPT2046_Y_MAX - XPT2046_Y_MIN); + #if XPT2046_X_INV + (*x) = XPT2046_HOR_RES - (*x); #endif + #if XPT2046_Y_INV + (*y) = XPT2046_VER_RES - (*y); + #endif +} - static void xpt2046_corr(uint16_t *x, uint16_t *y) { - #if XPT2046_XY_SWAP - int16_t swap_tmp; - swap_tmp = *x; - *x = *y; - *y = swap_tmp; - #endif - if ((*x) > XPT2046_X_MIN) (*x) -= XPT2046_X_MIN; else (*x) = 0; - if ((*y) > XPT2046_Y_MIN) (*y) -= XPT2046_Y_MIN; else (*y) = 0; - (*x) = uint32_t(uint32_t(*x) * XPT2046_HOR_RES) / (XPT2046_X_MAX - XPT2046_X_MIN); - (*y) = uint32_t(uint32_t(*y) * XPT2046_VER_RES) / (XPT2046_Y_MAX - XPT2046_Y_MIN); - #if XPT2046_X_INV - (*x) = XPT2046_HOR_RES - (*x); - #endif - #if XPT2046_Y_INV - (*y) = XPT2046_VER_RES - (*y); - #endif - } +#define times 4 +#define CHX 0x90 +#define CHY 0xD0 - #define times 4 - #define CHX 0x90// 0x90 - #define CHY 0xD0// 0xD0 +int SPI2_ReadWrite2Bytes(void) { + volatile uint16_t ans = 0; + uint16_t temp = 0; + #if ENABLED(SPI_GRAPHICAL_TFT) + temp = SPI_TFT.spi_read_write_byte(0xFF); + ans = temp << 8; + temp = SPI_TFT.spi_read_write_byte(0xFF); + ans |= temp; + ans >>= 3; + #else + temp = W25QXX.spi_flash_read_write_byte(0xFF); + ans = temp << 8; + temp = W25QXX.spi_flash_read_write_byte(0xFF); + ans |= temp; + ans >>= 3; + #endif + return ans & 0x0FFF; +} - int SPI2_ReadWrite2Bytes(void) { - volatile uint16_t ans = 0; - uint16_t temp = 0; - #if ENABLED(SPI_GRAPHICAL_TFT) - temp = SPI_TFT.spi_read_write_byte(0xFF); - ans = temp << 8; - temp = SPI_TFT.spi_read_write_byte(0xFF); - ans |= temp; - ans >>= 3; - #else - temp = W25QXX.spi_flash_read_write_byte(0xFF); - ans = temp << 8; - temp = W25QXX.spi_flash_read_write_byte(0xFF); - ans |= temp; - ans >>= 3; - #endif - return ans & 0x0FFF; - } +uint16_t x_addata[times], y_addata[times]; +void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { + uint16_t i, j, k; - uint16_t x_addata[times], y_addata[times]; - void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { - uint16_t i, j, k; - //int result; - //#if ENABLED(TOUCH_BUTTONS) + #if ENABLED(SPI_GRAPHICAL_TFT) + SPI_TFT.spi_init(SPI_QUARTER_SPEED); + #endif + for (i = 0; i < times; i++) { #if ENABLED(SPI_GRAPHICAL_TFT) - SPI_TFT.spi_init(SPI_QUARTER_SPEED); + OUT_WRITE(TOUCH_CS_PIN, LOW); + SPI_TFT.spi_read_write_byte(CHX); + y_addata[i] = SPI2_ReadWrite2Bytes(); + WRITE(TOUCH_CS_PIN, HIGH); + + OUT_WRITE(TOUCH_CS_PIN, LOW); + SPI_TFT.spi_read_write_byte(CHY); + x_addata[i] = SPI2_ReadWrite2Bytes(); + WRITE(TOUCH_CS_PIN, HIGH); + #else // #if ENABLED(TOUCH_BUTTONS) + OUT_WRITE(TOUCH_CS_PIN, LOW); + W25QXX.spi_flash_read_write_byte(CHX); + y_addata[i] = SPI2_ReadWrite2Bytes(); + WRITE(TOUCH_CS_PIN, HIGH); + + OUT_WRITE(TOUCH_CS_PIN, LOW); + W25QXX.spi_flash_read_write_byte(CHY); + x_addata[i] = SPI2_ReadWrite2Bytes(); + WRITE(TOUCH_CS_PIN, HIGH); #endif - for (i = 0; i < times; i++) { - #if ENABLED(SPI_GRAPHICAL_TFT) - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI_TFT.spi_read_write_byte(CHX); - y_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI_TFT.spi_read_write_byte(CHY); - x_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - #else // #if ENABLED(TOUCH_BUTTONS) - OUT_WRITE(TOUCH_CS_PIN, LOW); - W25QXX.spi_flash_read_write_byte(CHX); - y_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - - OUT_WRITE(TOUCH_CS_PIN, LOW); - W25QXX.spi_flash_read_write_byte(CHY); - x_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - #endif - - } - //#endif - //result = x_addata[0]; - for (i = 0; i < times; i++) - for (j = i + 1; j < times; j++) - if (x_addata[j] > x_addata[i]) { - k = x_addata[j]; - x_addata[j] = x_addata[i]; - x_addata[i] = k; - } - if (x_addata[times / 2 - 1] - x_addata[times / 2] > 50) { - *X_Addata = *Y_Addata = 0; - return; - } + } - *X_Addata = (x_addata[times / 2 - 1] + x_addata[times / 2]) / 2; + for (i = 0; i < times; i++) + for (j = i + 1; j < times; j++) + if (x_addata[j] > x_addata[i]) { + k = x_addata[j]; + x_addata[j] = x_addata[i]; + x_addata[i] = k; + } + if (x_addata[times / 2 - 1] - x_addata[times / 2] > 50) { + *X_Addata = *Y_Addata = 0; + return; + } - //result = y_addata[0]; - for (i = 0; i < times; i++) - for (j = i + 1; j < times; j++) - if (y_addata[j] > y_addata[i]) { - k = y_addata[j]; - y_addata[j] = y_addata[i]; - y_addata[i] = k; - } + *X_Addata = (x_addata[times / 2 - 1] + x_addata[times / 2]) / 2; - if (y_addata[times / 2 - 1] - y_addata[times / 2] > 50) { - *X_Addata = *Y_Addata = 0; - return; - } + for (i = 0; i < times; i++) + for (j = i + 1; j < times; j++) + if (y_addata[j] > y_addata[i]) { + k = y_addata[j]; + y_addata[j] = y_addata[i]; + y_addata[i] = k; + } - *Y_Addata = (y_addata[times / 2 - 1] + y_addata[times / 2]) / 2; + if (y_addata[times / 2 - 1] - y_addata[times / 2] > 50) { + *X_Addata = *Y_Addata = 0; + return; } - #define ADC_VALID_OFFSET 10 + *Y_Addata = (y_addata[times / 2 - 1] + y_addata[times / 2]) / 2; +} + +#define ADC_VALID_OFFSET 10 + +uint8_t TOUCH_PressValid(uint16_t _usX, uint16_t _usY) { + if ( (_usX <= ADC_VALID_OFFSET) || (_usY <= ADC_VALID_OFFSET) + || (_usX >= 4095 - ADC_VALID_OFFSET) || (_usY >= 4095 - ADC_VALID_OFFSET) + ) return 0; + return 1; +} + +static lv_coord_t last_x = 0, last_y = 0; +bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { + uint32_t tmpTime, diffTime = 0; + + tmpTime = millis(); + diffTime = getTickDiff(tmpTime, touch_time1); + /*Save the state and save the pressed coordinate*/ + //data->state = TOUCH_PressValid(last_x, last_y) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; + //if (data->state == LV_INDEV_STATE_PR) ADS7843_Rd_Addata((u16 *)&last_x, (u16 *)&last_y); + //touchpad_get_xy(&last_x, &last_y); + /*Save the pressed coordinates and the state*/ + if (diffTime > 10) { + //use marlin touch code if enabled + #if ENABLED(TOUCH_BUTTONS) + touch.getTouchPoint(reinterpret_cast(last_x), reinterpret_cast(last_y)); + #else + XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y); + #endif + if (TOUCH_PressValid(last_x, last_y)) { - uint8_t TOUCH_PressValid(uint16_t _usX, uint16_t _usY) { - if ((_usX <= ADC_VALID_OFFSET) || (_usY <= ADC_VALID_OFFSET) - || (_usX >= 4095 - ADC_VALID_OFFSET) || (_usY >= 4095 - ADC_VALID_OFFSET) - ) return 0; + data->state = LV_INDEV_STATE_PR; - return 1; - } + /*Set the coordinates (if released use the last pressed coordinates)*/ - static lv_coord_t last_x = 0, last_y = 0; - bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { - #if 1 - uint32_t tmpTime, diffTime = 0; - - tmpTime = millis(); - diffTime = getTickDiff(tmpTime, touch_time1); - /*Save the state and save the pressed coordinate*/ - //data->state = TOUCH_PressValid(last_x, last_y) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; - //if (data->state == LV_INDEV_STATE_PR) ADS7843_Rd_Addata((u16 *)&last_x, (u16 *)&last_y); - //touchpad_get_xy(&last_x, &last_y); - /*Save the pressed coordinates and the state*/ - if (diffTime > 10) { - XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y); - if (TOUCH_PressValid(last_x, last_y)) { - - data->state = LV_INDEV_STATE_PR; - - /*Set the coordinates (if released use the last pressed coordinates)*/ - - xpt2046_corr((uint16_t *)&last_x, (uint16_t *)&last_y); - data->point.x = last_x; - data->point.y = last_y; - - } - else { - data->state = LV_INDEV_STATE_REL; - } - touch_time1 = tmpTime; - } + // SERIAL_ECHOLNPAIR("antes X: ", last_x, ", y: ", last_y); + xpt2046_corr((uint16_t *)&last_x, (uint16_t *)&last_y); + // SERIAL_ECHOLNPAIR("X: ", last_x, ", y: ", last_y); + data->point.x = last_x; + data->point.y = last_y; - return false; /*Return `false` because we are not buffering and no more data to read*/ - #endif + last_x = 0; + last_y = 0; + } + else { + data->state = LV_INDEV_STATE_REL; + } + touch_time1 = tmpTime; } -#endif // TFT_LITTLE_VGL_UI + return false; /*Return `false` because we are not buffering and no more data to read*/ +} + +#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 8fe6c8cbf829..7e29714443ac 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LITTLE_VGL_UI) +#if ENABLED(TFT_LVGL_UI) #include "../../../../MarlinCore.h" @@ -1900,4 +1900,4 @@ void disp_language_init() { } } -#endif // TFT_LITTLE_VGL_UI +#endif // TFT_LVGL_UI diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index d8933fe03914..6b06bda88719 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -541,9 +541,9 @@ #elif MB(CCROBOT_MEEB_3DP) #include "stm32f1/pins_CCROBOT_MEEB_3DP.h" // STM32F1 env:STM32F103RC_meeb #elif MB(CHITU3D_V5) - #include "stm32f1/pins_CHITU3D_V5.h" // STM32F1 env:chitu_f103 env:chitu_v5_gpio_init + #include "stm32f1/pins_CHITU3D_V5.h" // STM32F1 env:chitu_f103 env:chitu_v5_gpio_init env:chitu_f103_lvgl #elif MB(CHITU3D_V6) - #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 + #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 env:chitu_f103_lvgl #elif MB(CREALITY_V4) #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 9396eb629bc4..d99bba8369ab 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -142,6 +142,71 @@ #endif #endif +#define SPI_FLASH_SIZE 0x200000 // 2MB + +#if ENABLED(TFT_LVGL_UI) + #define HAS_SPI_FLASH_FONT 0 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 0 + #define HAS_BAK_VIEW_IN_FLASH 0 + + //SPI 2 + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 + + #define TOUCH_CS_PIN PB7 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + // #define TOUCH_INT_PIN PB6 + + #define SPI_TFT_CS_PIN TOUCH_CS_PIN + #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN + #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN + #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN + #define SPI_TFT_DC_PIN PB6 + #define SPI_TFT_RST_PIN PF11 + + #define LCD_RESET_PIN PF11 + #define LCD_BACKLIGHT_PIN PD13 + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define LCD_FULL_PIXEL_WIDTH 480 + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_FULL_PIXEL_HEIGHT 320 + #define LCD_PIXEL_OFFSET_Y 48 + + #define LCD_PIXEL_HEIGHT 320 + #define LCD_PIXEL_WIDTH 480 + + #define XPT2046_X_CALIBRATION -12316 + #define XPT2046_Y_CALIBRATION 8981 + #define XPT2046_X_OFFSET 340 + #define XPT2046_Y_OFFSET -20 + + #define USE_XPT2046 1 + #define XPT2046_XY_SWAP 0 + #define XPT2046_X_INV 1 + #define XPT2046_Y_INV 0 + + #define XPT2046_HOR_RES 480 + #define XPT2046_VER_RES 320 + #define XPT2046_X_MIN 140 + #define XPT2046_Y_MIN 200 + #define XPT2046_X_MAX 1900 + #define XPT2046_Y_MAX 1900 + #define XPT2046_AVG 4 + #define XPT2046_INV 0 +#endif + // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available // We nee to use the SPI2 #define ENABLE_SPI2 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index a82637be9302..6d668bf0c58a 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -147,6 +147,71 @@ #endif #endif +#define SPI_FLASH_SIZE 0x200000 // 2MB + +#if ENABLED(TFT_LVGL_UI) + #define HAS_SPI_FLASH_FONT 0 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 0 + #define HAS_BAK_VIEW_IN_FLASH 0 + + //SPI 2 + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 + + #define TOUCH_CS_PIN PB7 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + // #define TOUCH_INT_PIN PB6 + + #define SPI_TFT_CS_PIN TOUCH_CS_PIN + #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN + #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN + #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN + #define SPI_TFT_DC_PIN PB6 + #define SPI_TFT_RST_PIN PF11 + + #define LCD_RESET_PIN PF11 + #define LCD_BACKLIGHT_PIN PD13 + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define LCD_FULL_PIXEL_WIDTH 480 + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_FULL_PIXEL_HEIGHT 320 + #define LCD_PIXEL_OFFSET_Y 48 + + #define LCD_PIXEL_HEIGHT 320 + #define LCD_PIXEL_WIDTH 480 + + #define XPT2046_X_CALIBRATION -12316 + #define XPT2046_Y_CALIBRATION 8981 + #define XPT2046_X_OFFSET 340 + #define XPT2046_Y_OFFSET -20 + + #define USE_XPT2046 1 + #define XPT2046_XY_SWAP 0 + #define XPT2046_X_INV 1 + #define XPT2046_Y_INV 0 + + #define XPT2046_HOR_RES 480 + #define XPT2046_VER_RES 320 + #define XPT2046_X_MIN 140 + #define XPT2046_Y_MIN 200 + #define XPT2046_X_MAX 1900 + #define XPT2046_Y_MAX 1900 + #define XPT2046_AVG 4 + #define XPT2046_INV 0 +#endif + // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available // so SPI2 is required. #define ENABLE_SPI2 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 2b9010f889a4..a86a4d0719a8 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -231,7 +231,7 @@ #endif // HAS_SPI_LCD -#elif ENABLED(TFT_LITTLE_VGL_UI) +#elif ENABLED(TFT_LVGL_UI) #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 diff --git a/platformio.ini b/platformio.ini index 1f5385ca5149..f0b71d439e31 100644 --- a/platformio.ini +++ b/platformio.ini @@ -267,7 +267,7 @@ build_flags = ${common.build_flags} -std=gnu++17 -Wno-register build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} - SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip + SoftwareSerialM Adafruit_SPIFlash=https://github.com/adafruit/Adafruit_SPIFlash/archive/master.zip debug_tool = jlink @@ -346,7 +346,7 @@ lib_ignore = Adafruit NeoPixel SPI lib_deps = ${common.lib_deps} - SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip + SoftwareSerialM # # STM32F103RC @@ -385,7 +385,7 @@ lib_deps = LiquidTWI2@1.2.7 Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip - SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip + SoftwareSerialM USBComposite for STM32F1@0.91 lib_ignore = SPI debug_tool = stlink @@ -640,7 +640,7 @@ build_unflags = -std=gnu++11 extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano35.py src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} - SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip + SoftwareSerialM MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip lib_ignore = Adafruit NeoPixel, SPI @@ -691,6 +691,17 @@ platform = ${common_stm32f1.platform} extends = env:chitu_f103 build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX +# +# Chitu boards like Tronxy X5SA (STM32F103ZET6) using TFT LVGL UI +# +[env:chitu_f103_lvgl] +platform = ${common_stm32f1.platform} +extends = env:chitu_f103 +src_filter = ${common.default_src_filter} + +lib_deps = ${common.lib_deps} + SoftwareSerialM + MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip + # # Creality (STM32F103RET6) # From 70fa4c9323543dfb65d10969838899575406cae6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 1 Jul 2020 16:18:20 -0500 Subject: [PATCH 062/483] Per-Hotend Default PIDs (#18483) --- Marlin/src/gcode/config/M301.cpp | 3 ++ Marlin/src/inc/Conditionals_LCD.h | 2 + Marlin/src/inc/SanityCheck.h | 46 ++++++++++-------- Marlin/src/lcd/menu/menu_advanced.cpp | 12 ++--- Marlin/src/module/configuration_store.cpp | 59 ++++++++++++++++++++--- Marlin/src/module/temperature.h | 35 ++++---------- 6 files changed, 96 insertions(+), 61 deletions(-) diff --git a/Marlin/src/gcode/config/M301.cpp b/Marlin/src/gcode/config/M301.cpp index 54d32c865074..a68b64e0583f 100644 --- a/Marlin/src/gcode/config/M301.cpp +++ b/Marlin/src/gcode/config/M301.cpp @@ -30,6 +30,8 @@ /** * M301: Set PID parameters P I D (and optionally C, L) * + * E[extruder] Default: 0 + * * P[float] Kp term * I[float] Ki term (unscaled) * D[float] Kd term (unscaled) @@ -65,6 +67,7 @@ void GcodeSuite::M301() { #endif thermalManager.updatePID(); + SERIAL_ECHO_START(); #if ENABLED(PID_PARAMS_PER_HOTEND) SERIAL_ECHOPAIR(" e:", e); // specify extruder in serial output diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 71b5d7a89aa4..639c5765afb1 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -477,6 +477,8 @@ #define HAS_MULTI_HOTEND 1 #define HAS_HOTEND_OFFSET 1 #endif +#else + #undef PID_PARAMS_PER_HOTEND #endif // Helper macros for extruder and hotend arrays diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d99330916176..87caa23a8067 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1629,28 +1629,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif /** - * Test Heater, Temp Sensor, and Extruder Pins; Sensor Type must also be set. + * A Sensor ID has to be set for each heater */ -#if !HAS_HEATER_0 - #error "HEATER_0_PIN not defined for this board." -#elif !ANY_PIN(TEMP_0, MAX6675_SS) - #error "TEMP_0_PIN not defined for this board." -#elif ((defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && !PINS_EXIST(E0_STEP, E0_DIR)) - #error "E0_STEP_PIN or E0_DIR_PIN not defined for this board." -#elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PINS_EXIST(E0_STEP, E0_DIR) || !HAS_E0_ENABLE)) - #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." -#elif EXTRUDERS && TEMP_SENSOR_0 == 0 - #error "TEMP_SENSOR_0 is required with any extruders." -#endif - -// Pins are required for heaters -#if ENABLED(HEATER_0_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS) - #error "MAX6675_SS_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif HAS_HOTEND && !HAS_TEMP_HOTEND - #error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 - #error "HEATER_1_PIN not defined for this board." -#endif #if HAS_MULTI_HOTEND #if ENABLED(HEATER_1_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS2) @@ -1792,6 +1772,30 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT." #endif +/** + * Test Heater, Temp Sensor, and Extruder Pins + */ +#if !HAS_HEATER_0 + #error "HEATER_0_PIN not defined for this board." +#elif !ANY_PIN(TEMP_0, MAX6675_SS) + #error "TEMP_0_PIN not defined for this board." +#elif ((defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && !PINS_EXIST(E0_STEP, E0_DIR)) + #error "E0_STEP_PIN or E0_DIR_PIN not defined for this board." +#elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PINS_EXIST(E0_STEP, E0_DIR) || !HAS_E0_ENABLE)) + #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." +#elif EXTRUDERS && TEMP_SENSOR_0 == 0 + #error "TEMP_SENSOR_0 is required if there are any extruders." +#endif + +// Pins are required for heaters +#if ENABLED(HEATER_0_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS) + #error "MAX6675_SS_PIN (required for TEMP_SENSOR_0) not defined for this board." +#elif HAS_HOTEND && !HAS_TEMP_HOTEND + #error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board." +#elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 + #error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin." +#endif + /** * Temperature status LEDs */ diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b57e442b6fba..d53a4d2495f5 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -205,16 +205,12 @@ void menu_cancelobject(); // Helpers for editing PID Ki & Kd values // grab the PID value out of the temp variable; scale it; then update the PID driver void copy_and_scalePID_i(int16_t e) { - #if DISABLED(PID_PARAMS_PER_HOTEND) || HOTENDS == 1 - UNUSED(e); - #endif + TERN(PID_PARAMS_PER_HOTEND,,UNUSED(e)); PID_PARAM(Ki, e) = scalePID_i(raw_Ki); thermalManager.updatePID(); } void copy_and_scalePID_d(int16_t e) { - #if DISABLED(PID_PARAMS_PER_HOTEND) || HOTENDS == 1 - UNUSED(e); - #endif + TERN(PID_PARAMS_PER_HOTEND,,UNUSED(e)); PID_PARAM(Kd, e) = scalePID_d(raw_Kd); thermalManager.updatePID(); } @@ -239,7 +235,7 @@ void menu_cancelobject(); #if HAS_HOTEND DEFINE_PIDTEMP_FUNCS(0); - #if BOTH(HAS_MULTI_HOTEND, PID_PARAMS_PER_HOTEND) + #if ENABLED(PID_PARAMS_PER_HOTEND) REPEAT_S(1, HOTENDS, DEFINE_PIDTEMP_FUNCS) #endif #endif @@ -314,7 +310,7 @@ void menu_cancelobject(); #endif PID_EDIT_MENU_ITEMS(0); - #if BOTH(HAS_MULTI_HOTEND, PID_PARAMS_PER_HOTEND) + #if ENABLED(PID_PARAMS_PER_HOTEND) REPEAT_S(1, HOTENDS, PID_EDIT_MENU_ITEMS) #endif diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 41ce618a0432..8ff873111413 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -2587,12 +2587,59 @@ void MarlinSettings::reset() { // #if ENABLED(PIDTEMP) + #if ENABLED(PID_PARAMS_PER_HOTEND) + constexpr float defKp[] = + #ifdef DEFAULT_Kp_LIST + DEFAULT_Kp_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Kp) + #endif + , defKi[] = + #ifdef DEFAULT_Ki_LIST + DEFAULT_Ki_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Ki) + #endif + , defKd[] = + #ifdef DEFAULT_Kd_LIST + DEFAULT_Kd_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Kd) + #endif + ; + static_assert(WITHIN(COUNT(defKp), 1, HOTENDS), "DEFAULT_Kp_LIST must have between 1 and HOTENDS items."); + static_assert(WITHIN(COUNT(defKi), 1, HOTENDS), "DEFAULT_Ki_LIST must have between 1 and HOTENDS items."); + static_assert(WITHIN(COUNT(defKd), 1, HOTENDS), "DEFAULT_Kd_LIST must have between 1 and HOTENDS items."); + #if ENABLED(PID_EXTRUSION_SCALING) + constexpr float defKc[] = + #ifdef DEFAULT_Kc_LIST + DEFAULT_Kc_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Kc) + #endif + ; + static_assert(WITHIN(COUNT(defKc), 1, HOTENDS), "DEFAULT_Kc_LIST must have between 1 and HOTENDS items."); + #endif + #if ENABLED(PID_FAN_SCALING) + constexpr float defKf[] = + #ifdef DEFAULT_Kf_LIST + DEFAULT_Kf_LIST + #else + ARRAY_BY_HOTENDS1(DEFAULT_Kf) + #endif + ; + static_assert(WITHIN(COUNT(defKf), 1, HOTENDS), "DEFAULT_Kf_LIST must have between 1 and HOTENDS items."); + #endif + #define PID_DEFAULT(N,E) def##N[E] + #else + #define PID_DEFAULT(N,E) DEFAULT_##N + #endif HOTEND_LOOP() { - PID_PARAM(Kp, e) = float(DEFAULT_Kp); - PID_PARAM(Ki, e) = scalePID_i(DEFAULT_Ki); - PID_PARAM(Kd, e) = scalePID_d(DEFAULT_Kd); - TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = DEFAULT_Kc); - TERN_(PID_FAN_SCALING, PID_PARAM(Kf, e) = DEFAULT_Kf); + PID_PARAM(Kp, e) = float(PID_DEFAULT(Kp, ALIM(e, defKp))); + PID_PARAM(Ki, e) = scalePID_i(PID_DEFAULT(Ki, ALIM(e, defKi))); + PID_PARAM(Kd, e) = scalePID_d(PID_DEFAULT(Kd, ALIM(e, defKd))); + TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = float(PID_DEFAULT(Kc, ALIM(e, defKc)))); + TERN_(PID_FAN_SCALING, PID_PARAM(Kf, e) = float(PID_DEFAULT(Kf, ALIM(e, defKf)))); } #endif @@ -3140,7 +3187,7 @@ void MarlinSettings::reset() { HOTEND_LOOP() { CONFIG_ECHO_START(); SERIAL_ECHOPAIR_P( - #if BOTH(HAS_MULTI_HOTEND, PID_PARAMS_PER_HOTEND) + #if ENABLED(PID_PARAMS_PER_HOTEND) PSTR(" M301 E"), e, SP_P_STR #else diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index a6d702646dae..d0d7858c7cbe 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -37,13 +37,8 @@ #define SOFT_PWM_SCALE 0 #endif -#if HOTENDS <= 1 - #define HOTEND_INDEX 0 - #define E_NAME -#else - #define HOTEND_INDEX e - #define E_NAME e -#endif +#define HOTEND_INDEX TERN(HAS_MULTI_HOTEND, e, 0) +#define E_NAME TERN_(HAS_MULTI_HOTEND, e) // Identifiers for other heaters typedef enum : int8_t { @@ -74,30 +69,18 @@ hotend_pid_t; typedef IF<(LPQ_MAX_LEN > 255), uint16_t, uint8_t>::type lpq_ptr_t; #endif +#define PID_PARAM(F,H) _PID_##F(TERN(PID_PARAMS_PER_HOTEND, H, 0)) +#define _PID_Kp(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kp, NAN) +#define _PID_Ki(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Ki, NAN) +#define _PID_Kd(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kd, NAN) #if ENABLED(PIDTEMP) - #define _PID_Kp(H) Temperature::temp_hotend[H].pid.Kp - #define _PID_Ki(H) Temperature::temp_hotend[H].pid.Ki - #define _PID_Kd(H) Temperature::temp_hotend[H].pid.Kd - #if ENABLED(PID_EXTRUSION_SCALING) - #define _PID_Kc(H) Temperature::temp_hotend[H].pid.Kc - #else - #define _PID_Kc(H) 1 - #endif - - #if ENABLED(PID_FAN_SCALING) - #define _PID_Kf(H) Temperature::temp_hotend[H].pid.Kf - #else - #define _PID_Kf(H) 0 - #endif + #define _PID_Kc(H) TERN(PID_EXTRUSION_SCALING, Temperature::temp_hotend[H].pid.Kc, 1) + #define _PID_Kf(H) TERN(PID_FAN_SCALING, Temperature::temp_hotend[H].pid.Kf, 0) #else - #define _PID_Kp(H) NAN - #define _PID_Ki(H) NAN - #define _PID_Kd(H) NAN #define _PID_Kc(H) 1 + #define _PID_Kf(H) 0 #endif -#define PID_PARAM(F,H) _PID_##F(H) - /** * States for ADC reading in the ISR */ From c43bbcce152b4d3b4697e1e188d3bcada76a24a7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 1 Jul 2020 16:27:28 -0500 Subject: [PATCH 063/483] Enforce sensor range for temperature target (#18465) * Mitigate stepper timeout * Add CHAMBER PWM code * Structured thermistor tables * Fix reversed sensor ranges * Prevent temps outside sensor range --- Marlin/src/MarlinCore.cpp | 23 +-- Marlin/src/MarlinCore.h | 3 - Marlin/src/feature/bedlevel/ubl/ubl.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 4 +- Marlin/src/gcode/calibrate/G28.cpp | 11 +- Marlin/src/gcode/control/M17_M18_M84.cpp | 1 + Marlin/src/gcode/control/M85.cpp | 1 - Marlin/src/gcode/control/T.cpp | 3 + Marlin/src/gcode/gcode.cpp | 5 +- Marlin/src/gcode/gcode.h | 10 +- Marlin/src/module/temperature.cpp | 188 ++++++++++-------- Marlin/src/module/temperature.h | 2 +- Marlin/src/module/thermistor/thermistor_1.h | 2 +- Marlin/src/module/thermistor/thermistor_10.h | 2 +- .../src/module/thermistor/thermistor_1010.h | 2 +- .../src/module/thermistor/thermistor_1047.h | 2 +- Marlin/src/module/thermistor/thermistor_11.h | 2 +- Marlin/src/module/thermistor/thermistor_110.h | 2 +- Marlin/src/module/thermistor/thermistor_12.h | 2 +- Marlin/src/module/thermistor/thermistor_13.h | 2 +- Marlin/src/module/thermistor/thermistor_147.h | 2 +- Marlin/src/module/thermistor/thermistor_15.h | 2 +- Marlin/src/module/thermistor/thermistor_18.h | 2 +- Marlin/src/module/thermistor/thermistor_2.h | 2 +- Marlin/src/module/thermistor/thermistor_20.h | 4 +- Marlin/src/module/thermistor/thermistor_201.h | 4 +- Marlin/src/module/thermistor/thermistor_202.h | 2 +- Marlin/src/module/thermistor/thermistor_21.h | 4 +- Marlin/src/module/thermistor/thermistor_22.h | 2 +- Marlin/src/module/thermistor/thermistor_23.h | 2 +- Marlin/src/module/thermistor/thermistor_3.h | 2 +- Marlin/src/module/thermistor/thermistor_331.h | 2 +- Marlin/src/module/thermistor/thermistor_332.h | 2 +- Marlin/src/module/thermistor/thermistor_4.h | 2 +- Marlin/src/module/thermistor/thermistor_5.h | 2 +- Marlin/src/module/thermistor/thermistor_501.h | 2 +- Marlin/src/module/thermistor/thermistor_502.h | 2 +- Marlin/src/module/thermistor/thermistor_51.h | 2 +- Marlin/src/module/thermistor/thermistor_512.h | 2 +- Marlin/src/module/thermistor/thermistor_52.h | 2 +- Marlin/src/module/thermistor/thermistor_55.h | 2 +- Marlin/src/module/thermistor/thermistor_6.h | 2 +- Marlin/src/module/thermistor/thermistor_60.h | 2 +- Marlin/src/module/thermistor/thermistor_61.h | 2 +- Marlin/src/module/thermistor/thermistor_66.h | 2 +- Marlin/src/module/thermistor/thermistor_67.h | 2 +- Marlin/src/module/thermistor/thermistor_7.h | 2 +- Marlin/src/module/thermistor/thermistor_70.h | 2 +- Marlin/src/module/thermistor/thermistor_71.h | 2 +- Marlin/src/module/thermistor/thermistor_75.h | 2 +- Marlin/src/module/thermistor/thermistor_8.h | 2 +- Marlin/src/module/thermistor/thermistor_9.h | 2 +- Marlin/src/module/thermistor/thermistor_99.h | 2 +- Marlin/src/module/thermistor/thermistor_998.h | 2 +- Marlin/src/module/thermistor/thermistor_999.h | 2 +- Marlin/src/module/thermistor/thermistors.h | 119 +++++++++-- 56 files changed, 296 insertions(+), 168 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 976edfe7ce70..8a17d5c31177 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -240,10 +240,6 @@ bool wait_for_heatup = true; #endif -// Inactivity shutdown -millis_t max_inactive_time, // = 0 - stepper_inactive_time = SEC_TO_MS(DEFAULT_STEPPER_DEACTIVE_TIME); - #if PIN_EXISTS(CHDK) extern millis_t chdk_timeout; #endif @@ -469,20 +465,23 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { const millis_t ms = millis(); - if (max_inactive_time && ELAPSED(ms, gcode.previous_move_ms + max_inactive_time)) { + // Prevent steppers timing-out in the middle of M600 + #define STAY_TEST (BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) && did_pause_print) + + if (STAY_TEST || ignore_stepper_queue) + gcode.reset_stepper_timeout(ms); + + if (gcode.stepper_max_timed_out(ms)) { SERIAL_ERROR_START(); SERIAL_ECHOLNPAIR(STR_KILL_INACTIVE_TIME, parser.command_ptr); kill(); } - // Prevent steppers timing-out in the middle of M600 - #define STAY_TEST (BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) && did_pause_print) - - if (stepper_inactive_time) { + if (gcode.stepper_inactive_time) { static bool already_shutdown_steppers; // = false if (planner.has_blocks_queued()) - gcode.reset_stepper_timeout(); - else if (!STAY_TEST && !ignore_stepper_queue && ELAPSED(ms, gcode.previous_move_ms + stepper_inactive_time)) { + gcode.reset_stepper_timeout(ms); + else if (!STAY_TEST && !ignore_stepper_queue && gcode.stepper_inactive_timeout()) { if (!already_shutdown_steppers) { already_shutdown_steppers = true; // L6470 SPI will consume 99% of free time without this if (ENABLED(DISABLE_INACTIVE_X)) DISABLE_AXIS_X(); @@ -601,7 +600,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { } #endif // !SWITCHING_EXTRUDER - gcode.reset_stepper_timeout(); + gcode.reset_stepper_timeout(ms); } #endif // EXTRUDER_RUNOUT_PREVENT diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index 1ed897483572..18b679aca136 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -87,9 +87,6 @@ extern bool wait_for_heatup; void wait_for_user_response(millis_t ms=0, const bool no_sleep=false); #endif -// Inactivity shutdown timer -extern millis_t max_inactive_time, stepper_inactive_time; - #if ENABLED(PSU_CONTROL) extern bool powersupply_on; #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_HIGH); powersupply_on = true; }while(0) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 8d382e827327..e08debf1d34b 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -206,7 +206,7 @@ if (human) SERIAL_CHAR(is_current ? ']' : ' '); SERIAL_FLUSHTX(); - idle(); + idle_no_sleep(); } if (!lcd) SERIAL_EOL(); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 01871ec7e662..99f07bc19b3e 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -164,6 +164,8 @@ */ G29_TYPE GcodeSuite::G29() { + reset_stepper_timeout(); + const bool seenQ = EITHER(DEBUG_LEVELING_FEATURE, PROBE_MANUALLY) && parser.seen('Q'); // G29 Q is also available if debugging @@ -675,7 +677,7 @@ G29_TYPE GcodeSuite::G29() { #endif abl_should_enable = false; - idle(); + idle_no_sleep(); } // inner } // outer diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 982c9e9d3cab..806a8d50d678 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -203,15 +203,15 @@ */ void GcodeSuite::G28() { -#if ENABLED(LASER_MOVE_G28_OFF) - cutter.set_inline_enabled(false); // turn off laser -#endif - if (DEBUGGING(LEVELING)) { DEBUG_ECHOLNPGM(">>> G28"); log_machine_info(); } + #if ENABLED(LASER_MOVE_G28_OFF) + cutter.set_inline_enabled(false); // turn off laser + #endif + TERN_(DWIN_CREALITY_LCD, HMI_flag.home_flag = true); #if ENABLED(DUAL_X_CARRIAGE) @@ -251,6 +251,9 @@ void GcodeSuite::G28() { TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); + // Count this command as movement / activity + reset_stepper_timeout(); + #define HAS_CURRENT_HOME(N) (defined(N##_CURRENT_HOME) && N##_CURRENT_HOME != N##_CURRENT) #if HAS_CURRENT_HOME(X) || HAS_CURRENT_HOME(X2) || HAS_CURRENT_HOME(Y) || HAS_CURRENT_HOME(Y2) #define HAS_HOMING_CURRENT 1 diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp index aee7d616a139..55a219917c7d 100644 --- a/Marlin/src/gcode/control/M17_M18_M84.cpp +++ b/Marlin/src/gcode/control/M17_M18_M84.cpp @@ -50,6 +50,7 @@ void GcodeSuite::M17() { */ void GcodeSuite::M18_M84() { if (parser.seenval('S')) { + reset_stepper_timeout(); stepper_inactive_time = parser.value_millis_from_seconds(); } else { diff --git a/Marlin/src/gcode/control/M85.cpp b/Marlin/src/gcode/control/M85.cpp index 1cdf49f6096c..224defed738a 100644 --- a/Marlin/src/gcode/control/M85.cpp +++ b/Marlin/src/gcode/control/M85.cpp @@ -21,7 +21,6 @@ */ #include "../gcode.h" -#include "../../MarlinCore.h" // for max_inactive_time /** * M85: Set inactivity shutdown timer with parameter S. To disable set zero (default) diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index e6b3bb5d6817..872b3d548801 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -53,6 +53,9 @@ void GcodeSuite::T(const uint8_t tool_index) { DEBUG_POS("BEFORE", current_position); } + // Count this command as movement / activity + reset_stepper_timeout(); + #if ENABLED(PRUSA_MMU2) if (parser.string_arg) { mmu2.tool_change(parser.string_arg); // Special commands T?/Tx/Tc diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index d34e0665c6e5..0b0a29cc2039 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -59,7 +59,10 @@ GcodeSuite gcode; #include "../MarlinCore.h" // for idle() -millis_t GcodeSuite::previous_move_ms; +// Inactivity shutdown +millis_t GcodeSuite::previous_move_ms = 0, + GcodeSuite::max_inactive_time = 0, + GcodeSuite::stepper_inactive_time = SEC_TO_MS(DEFAULT_STEPPER_DEACTIVE_TIME); // Relative motion mode for each logical axis static constexpr xyze_bool_t ar_init = AXIS_RELATIVE_MODES; diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index ab17cc8d7df3..72ae1f92df85 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -334,8 +334,14 @@ class GcodeSuite { static bool select_coordinate_system(const int8_t _new); #endif - static millis_t previous_move_ms; - FORCE_INLINE static void reset_stepper_timeout() { previous_move_ms = millis(); } + static millis_t previous_move_ms, max_inactive_time, stepper_inactive_time; + FORCE_INLINE static void reset_stepper_timeout(const millis_t ms=millis()) { previous_move_ms = ms; } + FORCE_INLINE static bool stepper_max_timed_out(const millis_t ms=millis()) { + return max_inactive_time && ELAPSED(ms, previous_move_ms + max_inactive_time); + } + FORCE_INLINE static bool stepper_inactive_timeout(const millis_t ms=millis()) { + return ELAPSED(ms, previous_move_ms + stepper_inactive_time); + } static int8_t get_target_extruder_from_command(); static int8_t get_target_e_stepper_from_command(); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index b95fdbdd86c7..1ca988e5d7fb 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -110,12 +110,12 @@ #if HOTEND_USES_THERMISTOR #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - static const void* heater_ttbl_map[2] = { (void*)HEATER_0_TEMPTABLE, (void*)HEATER_1_TEMPTABLE }; + static const temp_entry_t* heater_ttbl_map[2] = { HEATER_0_TEMPTABLE, HEATER_1_TEMPTABLE }; static constexpr uint8_t heater_ttbllen_map[2] = { HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN }; #else #define NEXT_TEMPTABLE(N) ,HEATER_##N##_TEMPTABLE #define NEXT_TEMPTABLE_LEN(N) ,HEATER_##N##_TEMPTABLE_LEN - static const void* heater_ttbl_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE)); + static const temp_entry_t* heater_ttbl_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE)); static constexpr uint8_t heater_ttbllen_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE_LEN REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE_LEN)); #endif #endif @@ -900,11 +900,13 @@ void Temperature::min_temp_error(const heater_ind_t heater) { SERIAL_ECHO_START(); SERIAL_ECHOPAIR(STR_PID_DEBUG, ee, STR_PID_DEBUG_INPUT, temp_hotend[ee].celsius, STR_PID_DEBUG_OUTPUT, pid_output); #if DISABLED(PID_OPENLOOP) + { SERIAL_ECHOPAIR( STR_PID_DEBUG_PTERM, work_pid[ee].Kp, STR_PID_DEBUG_ITERM, work_pid[ee].Ki, STR_PID_DEBUG_DTERM, work_pid[ee].Kd #if ENABLED(PID_EXTRUSION_SCALING) , STR_PID_DEBUG_CTERM, work_pid[ee].Kc #endif ); + } #endif SERIAL_EOL(); } @@ -920,7 +922,7 @@ void Temperature::min_temp_error(const heater_ind_t heater) { return pid_output; } -#endif // HOTENDS +#endif // HAS_HOTEND #if ENABLED(PIDTEMPBED) @@ -1058,7 +1060,7 @@ void Temperature::manage_heater() { } // HOTEND_LOOP - #endif // HOTENDS + #endif // HAS_HOTEND #if HAS_AUTO_FAN if (ELAPSED(ms, next_auto_fan_check_ms)) { // only need to check fan state very infrequently @@ -1208,22 +1210,22 @@ void Temperature::manage_heater() { * Bisect search for the range of the 'raw' value, then interpolate * proportionally between the under and over values. */ -#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ - uint8_t l = 0, r = LEN, m; \ - for (;;) { \ - m = (l + r) >> 1; \ - if (!m) return short(pgm_read_word(&TBL[0][1])); \ - if (m == l || m == r) return short(pgm_read_word(&TBL[LEN-1][1])); \ - short v00 = pgm_read_word(&TBL[m-1][0]), \ - v10 = pgm_read_word(&TBL[m-0][0]); \ - if (raw < v00) r = m; \ - else if (raw > v10) l = m; \ - else { \ - const short v01 = short(pgm_read_word(&TBL[m-1][1])), \ - v11 = short(pgm_read_word(&TBL[m-0][1])); \ - return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ - } \ - } \ +#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ + uint8_t l = 0, r = LEN, m; \ + for (;;) { \ + m = (l + r) >> 1; \ + if (!m) return int16_t(pgm_read_word(&TBL[0].celsius)); \ + if (m == l || m == r) return int16_t(pgm_read_word(&TBL[LEN-1].celsius)); \ + int16_t v00 = pgm_read_word(&TBL[m-1].value), \ + v10 = pgm_read_word(&TBL[m-0].value); \ + if (raw < v00) r = m; \ + else if (raw > v10) l = m; \ + else { \ + const int16_t v01 = int16_t(pgm_read_word(&TBL[m-1].celsius)), \ + v11 = int16_t(pgm_read_word(&TBL[m-0].celsius)); \ + return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ + } \ + } \ }while(0) #if HAS_USER_THERMISTORS @@ -1452,13 +1454,13 @@ void Temperature::manage_heater() { #if HOTEND_USES_THERMISTOR // Thermistor with conversion table? - const short(*tt)[][2] = (short(*)[][2])(heater_ttbl_map[e]); + const temp_entry_t(*tt)[] = (temp_entry_t(*)[])(heater_ttbl_map[e]); SCAN_THERMISTOR_TABLE((*tt), heater_ttbllen_map[e]); #endif return 0; } -#endif // HOTENDS +#endif // HAS_HOTEND #if HAS_HEATED_BED // Derived from RepRap FiveD extruder::getTemperature() @@ -1790,80 +1792,91 @@ void Temperature::init() { #if HAS_HOTEND #define _TEMP_MIN_E(NR) do{ \ - temp_range[NR].mintemp = HEATER_ ##NR## _MINTEMP; \ - while (analog_to_celsius_hotend(temp_range[NR].raw_min, NR) < HEATER_ ##NR## _MINTEMP) \ + const int16_t tmin = _MAX(HEATER_ ##NR## _MINTEMP, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MINTEMP_IND].celsius)); \ + temp_range[NR].mintemp = tmin; \ + while (analog_to_celsius_hotend(temp_range[NR].raw_min, NR) < tmin) \ temp_range[NR].raw_min += TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) #define _TEMP_MAX_E(NR) do{ \ - temp_range[NR].maxtemp = HEATER_ ##NR## _MAXTEMP; \ - while (analog_to_celsius_hotend(temp_range[NR].raw_max, NR) > HEATER_ ##NR## _MAXTEMP) \ + const int16_t tmax = _MIN(HEATER_ ##NR## _MAXTEMP, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MAXTEMP_IND].celsius) - 1); \ + temp_range[NR].maxtemp = tmax; \ + while (analog_to_celsius_hotend(temp_range[NR].raw_max, NR) > tmax) \ temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) - #ifdef HEATER_0_MINTEMP + #if THERMISTOR_HEATER_0 + #ifdef HEATER_0_MINTEMP _TEMP_MIN_E(0); + #endif + #ifdef HEATER_0_MAXTEMP + _TEMP_MAX_E(0); + #endif #endif - #ifdef HEATER_0_MAXTEMP - _TEMP_MAX_E(0); - #endif - #if HAS_MULTI_HOTEND + + #if HAS_MULTI_HOTEND && THERMISTOR_HEATER_1 #ifdef HEATER_1_MINTEMP _TEMP_MIN_E(1); #endif #ifdef HEATER_1_MAXTEMP _TEMP_MAX_E(1); #endif - #if HOTENDS > 2 - #ifdef HEATER_2_MINTEMP - _TEMP_MIN_E(2); - #endif - #ifdef HEATER_2_MAXTEMP - _TEMP_MAX_E(2); - #endif - #if HOTENDS > 3 - #ifdef HEATER_3_MINTEMP - _TEMP_MIN_E(3); - #endif - #ifdef HEATER_3_MAXTEMP - _TEMP_MAX_E(3); - #endif - #if HOTENDS > 4 - #ifdef HEATER_4_MINTEMP - _TEMP_MIN_E(4); - #endif - #ifdef HEATER_4_MAXTEMP - _TEMP_MAX_E(4); - #endif - #if HOTENDS > 5 - #ifdef HEATER_5_MINTEMP - _TEMP_MIN_E(5); - #endif - #ifdef HEATER_5_MAXTEMP - _TEMP_MAX_E(5); - #endif - #if HOTENDS > 6 - #ifdef HEATER_6_MINTEMP - _TEMP_MIN_E(6); - #endif - #ifdef HEATER_6_MAXTEMP - _TEMP_MAX_E(6); - #endif - #if HOTENDS > 7 - #ifdef HEATER_7_MINTEMP - _TEMP_MIN_E(7); - #endif - #ifdef HEATER_7_MAXTEMP - _TEMP_MAX_E(7); - #endif - #endif // HOTENDS > 7 - #endif // HOTENDS > 6 - #endif // HOTENDS > 5 - #endif // HOTENDS > 4 - #endif // HOTENDS > 3 - #endif // HOTENDS > 2 - #endif // HAS_MULTI_HOTEND - - #endif // HOTENDS + #endif + + #if HOTENDS > 2 && THERMISTOR_HEATER_2 + #ifdef HEATER_2_MINTEMP + _TEMP_MIN_E(2); + #endif + #ifdef HEATER_2_MAXTEMP + _TEMP_MAX_E(2); + #endif + #endif + + #if HOTENDS > 3 && THERMISTOR_HEATER_3 + #ifdef HEATER_3_MINTEMP + _TEMP_MIN_E(3); + #endif + #ifdef HEATER_3_MAXTEMP + _TEMP_MAX_E(3); + #endif + #endif + + #if HOTENDS > 4 && THERMISTOR_HEATER_4 + #ifdef HEATER_4_MINTEMP + _TEMP_MIN_E(4); + #endif + #ifdef HEATER_4_MAXTEMP + _TEMP_MAX_E(4); + #endif + #endif + + #if HOTENDS > 5 && THERMISTOR_HEATER_5 + #ifdef HEATER_5_MINTEMP + _TEMP_MIN_E(5); + #endif + #ifdef HEATER_5_MAXTEMP + _TEMP_MAX_E(5); + #endif + #endif + + #if HOTENDS > 6 && THERMISTOR_HEATER_6 + #ifdef HEATER_6_MINTEMP + _TEMP_MIN_E(6); + #endif + #ifdef HEATER_6_MAXTEMP + _TEMP_MAX_E(6); + #endif + #endif + + #if HOTENDS > 7 && THERMISTOR_HEATER_7 + #ifdef HEATER_7_MINTEMP + _TEMP_MIN_E(7); + #endif + #ifdef HEATER_7_MAXTEMP + _TEMP_MAX_E(7); + #endif + #endif + + #endif // HAS_HOTEND #if HAS_HEATED_BED #ifdef BED_MINTEMP @@ -2319,7 +2332,7 @@ void Temperature::readings_ready() { } } - #endif // HOTENDS + #endif // HAS_HOTEND #if HAS_HEATED_BED #if TEMPDIR(BED) < 0 @@ -2573,6 +2586,10 @@ void Temperature::tick() { _SLOW_PWM(BED, soft_pwm_bed, temp_bed); #endif + #if HAS_HEATED_CHAMBER + _SLOW_PWM(CHAMBER, soft_pwm_chamber, temp_chamber); + #endif + } // slow_pwm_count == 0 #if HAS_HOTEND @@ -2584,6 +2601,10 @@ void Temperature::tick() { _PWM_OFF(BED, soft_pwm_bed); #endif + #if HAS_HEATED_CHAMBER + _PWM_OFF(CHAMBER, soft_pwm_chamber); + #endif + #if ENABLED(FAN_SOFT_PWM) if (pwm_count_tmp >= 127) { pwm_count_tmp = 0; @@ -2662,6 +2683,7 @@ void Temperature::tick() { HOTEND_LOOP() soft_pwm_hotend[e].dec(); #endif TERN_(HAS_HEATED_BED, soft_pwm_bed.dec()); + TERN_(HAS_HEATED_CHAMBER, soft_pwm_chamber.dec()); } #endif // SLOW_PWM_HEATERS diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index d0d7858c7cbe..2f8ddbf7be22 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -608,7 +608,7 @@ class Temperature { return ABS(degHotend(e) - temp) < (TEMP_HYSTERESIS); } - #endif // HOTENDS + #endif // HAS_HOTEND #if HAS_HEATED_BED diff --git a/Marlin/src/module/thermistor/thermistor_1.h b/Marlin/src/module/thermistor/thermistor_1.h index f3226da4754a..75ec433abc81 100644 --- a/Marlin/src/module/thermistor/thermistor_1.h +++ b/Marlin/src/module/thermistor/thermistor_1.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor -const short temptable_1[][2] PROGMEM = { +const temp_entry_t temptable_1[] PROGMEM = { { OV( 23), 300 }, { OV( 25), 295 }, { OV( 27), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_10.h b/Marlin/src/module/thermistor/thermistor_10.h index 9e89eab84a43..991440bce523 100644 --- a/Marlin/src/module/thermistor/thermistor_10.h +++ b/Marlin/src/module/thermistor/thermistor_10.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 3960 K, 4.7 kOhm pull-up, RS thermistor 198-961 -const short temptable_10[][2] PROGMEM = { +const temp_entry_t temptable_10[] PROGMEM = { { OV( 1), 929 }, { OV( 36), 299 }, { OV( 71), 246 }, diff --git a/Marlin/src/module/thermistor/thermistor_1010.h b/Marlin/src/module/thermistor/thermistor_1010.h index 200d9aed56f5..71e830d952fd 100644 --- a/Marlin/src/module/thermistor/thermistor_1010.h +++ b/Marlin/src/module/thermistor/thermistor_1010.h @@ -22,7 +22,7 @@ #pragma once // Pt1000 with 1k0 pullup -const short temptable_1010[][2] PROGMEM = { +const temp_entry_t temptable_1010[] PROGMEM = { PtLine( 0, 1000, 1000), PtLine( 25, 1000, 1000), PtLine( 50, 1000, 1000), diff --git a/Marlin/src/module/thermistor/thermistor_1047.h b/Marlin/src/module/thermistor/thermistor_1047.h index af41a20a10c7..4c89bd3663e3 100644 --- a/Marlin/src/module/thermistor/thermistor_1047.h +++ b/Marlin/src/module/thermistor/thermistor_1047.h @@ -22,7 +22,7 @@ #pragma once // Pt1000 with 4k7 pullup -const short temptable_1047[][2] PROGMEM = { +const temp_entry_t temptable_1047[] PROGMEM = { // only a few values are needed as the curve is very flat PtLine( 0, 1000, 4700), PtLine( 50, 1000, 4700), diff --git a/Marlin/src/module/thermistor/thermistor_11.h b/Marlin/src/module/thermistor/thermistor_11.h index 1b2da4a71a8b..339f11d56b48 100644 --- a/Marlin/src/module/thermistor/thermistor_11.h +++ b/Marlin/src/module/thermistor/thermistor_11.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, QU-BD silicone bed QWG-104F-3950 thermistor -const short temptable_11[][2] PROGMEM = { +const temp_entry_t temptable_11[] PROGMEM = { { OV( 1), 938 }, { OV( 31), 314 }, { OV( 41), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_110.h b/Marlin/src/module/thermistor/thermistor_110.h index fe8f4fbb8070..32ee08580769 100644 --- a/Marlin/src/module/thermistor/thermistor_110.h +++ b/Marlin/src/module/thermistor/thermistor_110.h @@ -22,7 +22,7 @@ #pragma once // Pt100 with 1k0 pullup -const short temptable_110[][2] PROGMEM = { +const temp_entry_t temptable_110[] PROGMEM = { // only a few values are needed as the curve is very flat PtLine( 0, 100, 1000), PtLine( 50, 100, 1000), diff --git a/Marlin/src/module/thermistor/thermistor_12.h b/Marlin/src/module/thermistor/thermistor_12.h index f9e994a959c2..3b8cda870e74 100644 --- a/Marlin/src/module/thermistor/thermistor_12.h +++ b/Marlin/src/module/thermistor/thermistor_12.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 4700 K, 4.7 kOhm pull-up, (personal calibration for Makibox hot bed) -const short temptable_12[][2] PROGMEM = { +const temp_entry_t temptable_12[] PROGMEM = { { OV( 35), 180 }, // top rating 180C { OV( 211), 140 }, { OV( 233), 135 }, diff --git a/Marlin/src/module/thermistor/thermistor_13.h b/Marlin/src/module/thermistor/thermistor_13.h index 44c5243c1fe2..9bf3e02081d8 100644 --- a/Marlin/src/module/thermistor/thermistor_13.h +++ b/Marlin/src/module/thermistor/thermistor_13.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, Hisens thermistor -const short temptable_13[][2] PROGMEM = { +const temp_entry_t temptable_13[] PROGMEM = { { OV( 20.04), 300 }, { OV( 23.19), 290 }, { OV( 26.71), 280 }, diff --git a/Marlin/src/module/thermistor/thermistor_147.h b/Marlin/src/module/thermistor/thermistor_147.h index 8fead6c42991..61a82affa74b 100644 --- a/Marlin/src/module/thermistor/thermistor_147.h +++ b/Marlin/src/module/thermistor/thermistor_147.h @@ -22,7 +22,7 @@ #pragma once // Pt100 with 4k7 pullup -const short temptable_147[][2] PROGMEM = { +const temp_entry_t temptable_147[] PROGMEM = { // only a few values are needed as the curve is very flat PtLine( 0, 100, 4700), PtLine( 50, 100, 4700), diff --git a/Marlin/src/module/thermistor/thermistor_15.h b/Marlin/src/module/thermistor/thermistor_15.h index 85602abb3a9c..04d022101080 100644 --- a/Marlin/src/module/thermistor/thermistor_15.h +++ b/Marlin/src/module/thermistor/thermistor_15.h @@ -22,7 +22,7 @@ #pragma once // 100k bed thermistor in JGAurora A5. Calibrated by Sam Pinches 21st Jan 2018 using cheap k-type thermocouple inserted into heater block, using TM-902C meter. -const short temptable_15[][2] PROGMEM = { +const temp_entry_t temptable_15[] PROGMEM = { { OV( 31), 275 }, { OV( 33), 270 }, { OV( 35), 260 }, diff --git a/Marlin/src/module/thermistor/thermistor_18.h b/Marlin/src/module/thermistor/thermistor_18.h index f6a3edec4974..0f12d6996ae4 100644 --- a/Marlin/src/module/thermistor/thermistor_18.h +++ b/Marlin/src/module/thermistor/thermistor_18.h @@ -22,7 +22,7 @@ #pragma once // ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 - version (measured/tested/approved) -const short temptable_18[][2] PROGMEM = { +const temp_entry_t temptable_18[] PROGMEM = { { OV( 1), 713 }, { OV( 17), 284 }, { OV( 20), 275 }, diff --git a/Marlin/src/module/thermistor/thermistor_2.h b/Marlin/src/module/thermistor/thermistor_2.h index f3fe470603c9..ec296ec670af 100644 --- a/Marlin/src/module/thermistor/thermistor_2.h +++ b/Marlin/src/module/thermistor/thermistor_2.h @@ -26,7 +26,7 @@ // Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 4.7kohm pullup, voltage divider math, and manufacturer provided temp/resistance // -const short temptable_2[][2] PROGMEM = { +const temp_entry_t temptable_2[] PROGMEM = { { OV( 1), 848 }, { OV( 30), 300 }, // top rating 300C { OV( 34), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_20.h b/Marlin/src/module/thermistor/thermistor_20.h index 49b212da50b0..a2d3c7a61833 100644 --- a/Marlin/src/module/thermistor/thermistor_20.h +++ b/Marlin/src/module/thermistor/thermistor_20.h @@ -21,10 +21,10 @@ */ #pragma once -#define REVERSE_TEMP_SENSOR_RANGE +#define REVERSE_TEMP_SENSOR_RANGE_20 1 // Pt100 with INA826 amp on Ultimaker v2.0 electronics -const short temptable_20[][2] PROGMEM = { +const temp_entry_t temptable_20[] PROGMEM = { { OV( 0), 0 }, { OV(227), 1 }, { OV(236), 10 }, diff --git a/Marlin/src/module/thermistor/thermistor_201.h b/Marlin/src/module/thermistor/thermistor_201.h index d92f95756175..1ddd259172de 100644 --- a/Marlin/src/module/thermistor/thermistor_201.h +++ b/Marlin/src/module/thermistor/thermistor_201.h @@ -21,10 +21,10 @@ */ #pragma once -#define REVERSE_TEMP_SENSOR_RANGE +#define REVERSE_TEMP_SENSOR_RANGE_201 1 // Pt100 with LMV324 amp on Overlord v1.1 electronics -const short temptable_201[][2] PROGMEM = { +const temp_entry_t temptable_201[] PROGMEM = { { OV( 0), 0 }, { OV( 8), 1 }, { OV( 23), 6 }, diff --git a/Marlin/src/module/thermistor/thermistor_202.h b/Marlin/src/module/thermistor/thermistor_202.h index 9da3d45f454c..c5229607ae33 100644 --- a/Marlin/src/module/thermistor/thermistor_202.h +++ b/Marlin/src/module/thermistor/thermistor_202.h @@ -3,7 +3,7 @@ // Temptable sent from dealer technologyoutlet.co.uk // -const short temptable_202[][2] PROGMEM = { +const temp_entry_t temptable_202[] PROGMEM = { { OV( 1), 864 }, { OV( 35), 300 }, { OV( 38), 295 }, diff --git a/Marlin/src/module/thermistor/thermistor_21.h b/Marlin/src/module/thermistor/thermistor_21.h index 655f56685dac..144692cd12bd 100644 --- a/Marlin/src/module/thermistor/thermistor_21.h +++ b/Marlin/src/module/thermistor/thermistor_21.h @@ -21,13 +21,13 @@ */ #pragma once -#define REVERSE_TEMP_SENSOR_RANGE +#define REVERSE_TEMP_SENSOR_RANGE_21 1 #undef OV_SCALE #define OV_SCALE(N) (float((N) * 5) / 3.3f) // Pt100 with INA826 amp with 3.3v excitation based on "Pt100 with INA826 amp on Ultimaker v2.0 electronics" -const short temptable_21[][2] PROGMEM = { +const temp_entry_t temptable_21[] PROGMEM = { { OV( 0), 0 }, { OV(227), 1 }, { OV(236), 10 }, diff --git a/Marlin/src/module/thermistor/thermistor_22.h b/Marlin/src/module/thermistor/thermistor_22.h index e9b6acbb1e34..dd4d9d9131c8 100644 --- a/Marlin/src/module/thermistor/thermistor_22.h +++ b/Marlin/src/module/thermistor/thermistor_22.h @@ -21,7 +21,7 @@ */ // 100k hotend thermistor with 4.7k pull up to 3.3v and 220R to analog input as in GTM32 Pro vB -const short temptable_22[][2] PROGMEM = { +const temp_entry_t temptable_22[] PROGMEM = { { OV( 1), 352 }, { OV( 6), 341 }, { OV( 11), 330 }, diff --git a/Marlin/src/module/thermistor/thermistor_23.h b/Marlin/src/module/thermistor/thermistor_23.h index 13918c5893cf..eb156f4358de 100644 --- a/Marlin/src/module/thermistor/thermistor_23.h +++ b/Marlin/src/module/thermistor/thermistor_23.h @@ -21,7 +21,7 @@ */ // 100k hotbed thermistor with 4.7k pull up to 3.3v and 220R to analog input as in GTM32 Pro vB -const short temptable_23[][2] PROGMEM = { +const temp_entry_t temptable_23[] PROGMEM = { { OV( 1), 938 }, { OV( 11), 423 }, { OV( 21), 351 }, diff --git a/Marlin/src/module/thermistor/thermistor_3.h b/Marlin/src/module/thermistor/thermistor_3.h index e37c2ace7b8d..1b44218d556d 100644 --- a/Marlin/src/module/thermistor/thermistor_3.h +++ b/Marlin/src/module/thermistor/thermistor_3.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 4120 K, 4.7 kOhm pull-up, mendel-parts -const short temptable_3[][2] PROGMEM = { +const temp_entry_t temptable_3[] PROGMEM = { { OV( 1), 864 }, { OV( 21), 300 }, { OV( 25), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_331.h b/Marlin/src/module/thermistor/thermistor_331.h index 434492d7e78c..b8d4959a3be0 100644 --- a/Marlin/src/module/thermistor/thermistor_331.h +++ b/Marlin/src/module/thermistor/thermistor_331.h @@ -24,7 +24,7 @@ #define OVM(V) OV((V)*(0.327/0.5)) // R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor -const short temptable_331[][2] PROGMEM = { +const temp_entry_t temptable_331[] PROGMEM = { { OVM( 23), 300 }, { OVM( 25), 295 }, { OVM( 27), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_332.h b/Marlin/src/module/thermistor/thermistor_332.h index 3112751b95e4..21c82ca12ebf 100644 --- a/Marlin/src/module/thermistor/thermistor_332.h +++ b/Marlin/src/module/thermistor/thermistor_332.h @@ -24,7 +24,7 @@ #define OVM(V) OV((V)*(0.327/0.327)) // R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor -const short temptable_332[][2] PROGMEM = { +const temp_entry_t temptable_332[] PROGMEM = { { OVM( 268), 150 }, { OVM( 293), 145 }, { OVM( 320), 141 }, diff --git a/Marlin/src/module/thermistor/thermistor_4.h b/Marlin/src/module/thermistor/thermistor_4.h index 00e0d9ed9755..3cc6da9f25af 100644 --- a/Marlin/src/module/thermistor/thermistor_4.h +++ b/Marlin/src/module/thermistor/thermistor_4.h @@ -22,7 +22,7 @@ #pragma once // R25 = 10 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, Generic 10k thermistor -const short temptable_4[][2] PROGMEM = { +const temp_entry_t temptable_4[] PROGMEM = { { OV( 1), 430 }, { OV( 54), 137 }, { OV( 107), 107 }, diff --git a/Marlin/src/module/thermistor/thermistor_5.h b/Marlin/src/module/thermistor/thermistor_5.h index 8f414de15e8f..f1a04d2ed206 100644 --- a/Marlin/src/module/thermistor/thermistor_5.h +++ b/Marlin/src/module/thermistor/thermistor_5.h @@ -26,7 +26,7 @@ // ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan) // Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 4.7kohm pullup, voltage divider math, and manufacturer provided temp/resistance -const short temptable_5[][2] PROGMEM = { +const temp_entry_t temptable_5[] PROGMEM = { { OV( 1), 713 }, { OV( 17), 300 }, // top rating 300C { OV( 20), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_501.h b/Marlin/src/module/thermistor/thermistor_501.h index 3db433644edd..a1ef6e53cbd0 100644 --- a/Marlin/src/module/thermistor/thermistor_501.h +++ b/Marlin/src/module/thermistor/thermistor_501.h @@ -22,7 +22,7 @@ #pragma once // 100k Zonestar thermistor. Adjusted By Hally -const short temptable_501[][2] PROGMEM = { +const temp_entry_t temptable_501[] PROGMEM = { { OV( 1), 713 }, { OV( 14), 300 }, // Top rating 300C { OV( 16), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_502.h b/Marlin/src/module/thermistor/thermistor_502.h index 1a4019ed5c28..b414e562e6f5 100644 --- a/Marlin/src/module/thermistor/thermistor_502.h +++ b/Marlin/src/module/thermistor/thermistor_502.h @@ -23,7 +23,7 @@ // Unknown thermistor for the Zonestar P802M hot bed. Adjusted By Nerseth // These were the shipped settings from Zonestar in original firmware: P802M_8_Repetier_V1.6_Zonestar.zip -const short temptable_502[][2] PROGMEM = { +const temp_entry_t temptable_502[] PROGMEM = { { OV( 56.0 / 4), 300 }, { OV( 187.0 / 4), 250 }, { OV( 615.0 / 4), 190 }, diff --git a/Marlin/src/module/thermistor/thermistor_51.h b/Marlin/src/module/thermistor/thermistor_51.h index f314777a5285..092bcb640814 100644 --- a/Marlin/src/module/thermistor/thermistor_51.h +++ b/Marlin/src/module/thermistor/thermistor_51.h @@ -26,7 +26,7 @@ // Verified by linagee. // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance // Advantage: Twice the resolution and better linearity from 150C to 200C -const short temptable_51[][2] PROGMEM = { +const temp_entry_t temptable_51[] PROGMEM = { { OV( 1), 350 }, { OV( 190), 250 }, // top rating 250C { OV( 203), 245 }, diff --git a/Marlin/src/module/thermistor/thermistor_512.h b/Marlin/src/module/thermistor/thermistor_512.h index 5528e56b9763..ab59c585163a 100644 --- a/Marlin/src/module/thermistor/thermistor_512.h +++ b/Marlin/src/module/thermistor/thermistor_512.h @@ -22,7 +22,7 @@ // 100k thermistor supplied with RPW-Ultra hotend, 4.7k pullup -const short temptable_512[][2] PROGMEM = { +const temp_entry_t temptable_512[] PROGMEM = { { OV(26), 300 }, { OV(28), 295 }, { OV(30), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_52.h b/Marlin/src/module/thermistor/thermistor_52.h index 9a54ef4b6f66..031b094d8909 100644 --- a/Marlin/src/module/thermistor/thermistor_52.h +++ b/Marlin/src/module/thermistor/thermistor_52.h @@ -26,7 +26,7 @@ // Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance // Advantage: More resolution and better linearity from 150C to 200C -const short temptable_52[][2] PROGMEM = { +const temp_entry_t temptable_52[] PROGMEM = { { OV( 1), 500 }, { OV( 125), 300 }, // top rating 300C { OV( 142), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_55.h b/Marlin/src/module/thermistor/thermistor_55.h index ead481e8655a..e137f174c773 100644 --- a/Marlin/src/module/thermistor/thermistor_55.h +++ b/Marlin/src/module/thermistor/thermistor_55.h @@ -26,7 +26,7 @@ // Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance // Advantage: More resolution and better linearity from 150C to 200C -const short temptable_55[][2] PROGMEM = { +const temp_entry_t temptable_55[] PROGMEM = { { OV( 1), 500 }, { OV( 76), 300 }, { OV( 87), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_6.h b/Marlin/src/module/thermistor/thermistor_6.h index f84c64413c1f..35aeeabd77e5 100644 --- a/Marlin/src/module/thermistor/thermistor_6.h +++ b/Marlin/src/module/thermistor/thermistor_6.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 4092 K, 8.2 kOhm pull-up, 100k Epcos (?) thermistor -const short temptable_6[][2] PROGMEM = { +const temp_entry_t temptable_6[] PROGMEM = { { OV( 1), 350 }, { OV( 28), 250 }, // top rating 250C { OV( 31), 245 }, diff --git a/Marlin/src/module/thermistor/thermistor_60.h b/Marlin/src/module/thermistor/thermistor_60.h index 167e0edcf88b..3f43740b5e75 100644 --- a/Marlin/src/module/thermistor/thermistor_60.h +++ b/Marlin/src/module/thermistor/thermistor_60.h @@ -31,7 +31,7 @@ // beta: 3950 // min adc: 1 at 0.0048828125 V // max adc: 1023 at 4.9951171875 V -const short temptable_60[][2] PROGMEM = { +const temp_entry_t temptable_60[] PROGMEM = { { OV( 51), 272 }, { OV( 61), 258 }, { OV( 71), 247 }, diff --git a/Marlin/src/module/thermistor/thermistor_61.h b/Marlin/src/module/thermistor/thermistor_61.h index 5f8171a1d4b6..837ee3781a85 100644 --- a/Marlin/src/module/thermistor/thermistor_61.h +++ b/Marlin/src/module/thermistor/thermistor_61.h @@ -30,7 +30,7 @@ // Resistance Tolerance + / -1% // B Value 3950K at 25/50 deg. C // B Value Tolerance + / - 1% -const short temptable_61[][2] PROGMEM = { +const temp_entry_t temptable_61[] PROGMEM = { { OV( 2.00), 420 }, // Guestimate to ensure we dont lose a reading and drop temps to -50 when over { OV( 12.07), 350 }, { OV( 12.79), 345 }, diff --git a/Marlin/src/module/thermistor/thermistor_66.h b/Marlin/src/module/thermistor/thermistor_66.h index 97f082348657..0ab45d64d158 100644 --- a/Marlin/src/module/thermistor/thermistor_66.h +++ b/Marlin/src/module/thermistor/thermistor_66.h @@ -22,7 +22,7 @@ #pragma once // R25 = 2.5 MOhm, beta25 = 4500 K, 4.7 kOhm pull-up, DyzeDesign 500 °C Thermistor -const short temptable_66[][2] PROGMEM = { +const temp_entry_t temptable_66[] PROGMEM = { { OV( 17.5), 850 }, { OV( 17.9), 500 }, { OV( 21.7), 480 }, diff --git a/Marlin/src/module/thermistor/thermistor_67.h b/Marlin/src/module/thermistor/thermistor_67.h index 5af203c8abd2..11fdca856835 100644 --- a/Marlin/src/module/thermistor/thermistor_67.h +++ b/Marlin/src/module/thermistor/thermistor_67.h @@ -22,7 +22,7 @@ #pragma once // R25 = 500 KOhm, beta25 = 3800 K, 4.7 kOhm pull-up, SliceEngineering 450 °C Thermistor -const short temptable_67[][2] PROGMEM = { +const temp_entry_t temptable_67[] PROGMEM = { { OV( 22 ), 500 }, { OV( 23 ), 490 }, { OV( 25 ), 480 }, diff --git a/Marlin/src/module/thermistor/thermistor_7.h b/Marlin/src/module/thermistor/thermistor_7.h index e791d0c33304..1e6ab1d34ae3 100644 --- a/Marlin/src/module/thermistor/thermistor_7.h +++ b/Marlin/src/module/thermistor/thermistor_7.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 3974 K, 4.7 kOhm pull-up, Honeywell 135-104LAG-J01 -const short temptable_7[][2] PROGMEM = { +const temp_entry_t temptable_7[] PROGMEM = { { OV( 1), 941 }, { OV( 19), 362 }, { OV( 37), 299 }, // top rating 300C diff --git a/Marlin/src/module/thermistor/thermistor_70.h b/Marlin/src/module/thermistor/thermistor_70.h index b49804106970..d81424f9b611 100644 --- a/Marlin/src/module/thermistor/thermistor_70.h +++ b/Marlin/src/module/thermistor/thermistor_70.h @@ -26,7 +26,7 @@ // ANENG AN8009 DMM with a K-type probe used for measurements. // R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, bqh2 stock thermistor -const short temptable_70[][2] PROGMEM = { +const temp_entry_t temptable_70[] PROGMEM = { { OV( 18), 270 }, { OV( 27), 248 }, { OV( 34), 234 }, diff --git a/Marlin/src/module/thermistor/thermistor_71.h b/Marlin/src/module/thermistor/thermistor_71.h index c3a9193b79bb..c7bab2a0bcac 100644 --- a/Marlin/src/module/thermistor/thermistor_71.h +++ b/Marlin/src/module/thermistor/thermistor_71.h @@ -27,7 +27,7 @@ // Beta = 3974 // R1 = 0 Ohm // R2 = 4700 Ohm -const short temptable_71[][2] PROGMEM = { +const temp_entry_t temptable_71[] PROGMEM = { { OV( 35), 300 }, { OV( 51), 269 }, { OV( 59), 258 }, diff --git a/Marlin/src/module/thermistor/thermistor_75.h b/Marlin/src/module/thermistor/thermistor_75.h index 3a3cdc636409..1df64cc420ea 100644 --- a/Marlin/src/module/thermistor/thermistor_75.h +++ b/Marlin/src/module/thermistor/thermistor_75.h @@ -34,7 +34,7 @@ //#define HIGH_TEMP_RANGE_75 -const short temptable_75[][2] PROGMEM = { // Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor +const temp_entry_t temptable_75[] PROGMEM = { // Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor { OV(111.06), 200 }, // v=0.542 r=571.747 res=0.501 degC/count #ifdef HIGH_TEMP_RANGE_75 diff --git a/Marlin/src/module/thermistor/thermistor_8.h b/Marlin/src/module/thermistor/thermistor_8.h index f6e407a730da..ec97df613387 100644 --- a/Marlin/src/module/thermistor/thermistor_8.h +++ b/Marlin/src/module/thermistor/thermistor_8.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 3950 K, 10 kOhm pull-up, NTCS0603E3104FHT -const short temptable_8[][2] PROGMEM = { +const temp_entry_t temptable_8[] PROGMEM = { { OV( 1), 704 }, { OV( 54), 216 }, { OV( 107), 175 }, diff --git a/Marlin/src/module/thermistor/thermistor_9.h b/Marlin/src/module/thermistor/thermistor_9.h index 5023fbe1d01a..e194df57c1ff 100644 --- a/Marlin/src/module/thermistor/thermistor_9.h +++ b/Marlin/src/module/thermistor/thermistor_9.h @@ -22,7 +22,7 @@ #pragma once // R25 = 100 kOhm, beta25 = 3960 K, 4.7 kOhm pull-up, GE Sensing AL03006-58.2K-97-G1 -const short temptable_9[][2] PROGMEM = { +const temp_entry_t temptable_9[] PROGMEM = { { OV( 1), 936 }, { OV( 36), 300 }, { OV( 71), 246 }, diff --git a/Marlin/src/module/thermistor/thermistor_99.h b/Marlin/src/module/thermistor/thermistor_99.h index 045a42b73804..b6d6bbac9d02 100644 --- a/Marlin/src/module/thermistor/thermistor_99.h +++ b/Marlin/src/module/thermistor/thermistor_99.h @@ -24,7 +24,7 @@ // 100k bed thermistor with a 10K pull-up resistor - made by $ buildroot/share/scripts/createTemperatureLookupMarlin.py --rp=10000 -const short temptable_99[][2] PROGMEM = { +const temp_entry_t temptable_99[] PROGMEM = { { OV( 5.81), 350 }, // v=0.028 r= 57.081 res=13.433 degC/count { OV( 6.54), 340 }, // v=0.032 r= 64.248 res=11.711 degC/count { OV( 7.38), 330 }, // v=0.036 r= 72.588 res=10.161 degC/count diff --git a/Marlin/src/module/thermistor/thermistor_998.h b/Marlin/src/module/thermistor/thermistor_998.h index 6f631d4b9abe..2802121c5040 100644 --- a/Marlin/src/module/thermistor/thermistor_998.h +++ b/Marlin/src/module/thermistor/thermistor_998.h @@ -27,7 +27,7 @@ #define DUMMY_THERMISTOR_998_VALUE 25 #endif -const short temptable_998[][2] PROGMEM = { +const temp_entry_t temptable_998[] PROGMEM = { { OV( 1), DUMMY_THERMISTOR_998_VALUE }, { OV(1023), DUMMY_THERMISTOR_998_VALUE } }; diff --git a/Marlin/src/module/thermistor/thermistor_999.h b/Marlin/src/module/thermistor/thermistor_999.h index d750d5597c38..cf6ebb3ae1d5 100644 --- a/Marlin/src/module/thermistor/thermistor_999.h +++ b/Marlin/src/module/thermistor/thermistor_999.h @@ -27,7 +27,7 @@ #define DUMMY_THERMISTOR_999_VALUE 25 #endif -const short temptable_999[][2] PROGMEM = { +const temp_entry_t temptable_999[] PROGMEM = { { OV( 1), DUMMY_THERMISTOR_999_VALUE }, { OV(1023), DUMMY_THERMISTOR_999_VALUE } }; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 04b091b2a093..afb3148dfd9e 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -42,6 +42,8 @@ #define ANY_THERMISTOR_IS(n) (THERMISTOR_HEATER_0 == n || THERMISTOR_HEATER_1 == n || THERMISTOR_HEATER_2 == n || THERMISTOR_HEATER_3 == n || THERMISTOR_HEATER_4 == n || THERMISTOR_HEATER_5 == n || THERMISTOR_HEATER_6 == n || THERMISTOR_HEATER_7 == n || THERMISTORBED == n || THERMISTORCHAMBER == n || THERMISTORPROBE == n) +typedef struct { int16_t value, celsius; } temp_entry_t; + // Pt1000 and Pt100 handling // // Rt=R0*(1+a*T+b*T*T) [for T>0] @@ -185,12 +187,13 @@ #include "thermistor_999.h" #endif #if ANY_THERMISTOR_IS(1000) // Custom - const short temptable_1000[][2] PROGMEM = { { 0, 0 } }; + const temp_entry_t temptable_1000[] PROGMEM = { { 0, 0 } }; #endif #define _TT_NAME(_N) temptable_ ## _N #define TT_NAME(_N) _TT_NAME(_N) + #if THERMISTOR_HEATER_0 #define HEATER_0_TEMPTABLE TT_NAME(THERMISTOR_HEATER_0) #define HEATER_0_TEMPTABLE_LEN COUNT(HEATER_0_TEMPTABLE) @@ -288,9 +291,12 @@ #else #define CHAMBER_TEMPTABLE_LEN 0 #endif + #ifdef THERMISTORPROBE #define PROBE_TEMPTABLE TT_NAME(THERMISTORPROBE) #define PROBE_TEMPTABLE_LEN COUNT(PROBE_TEMPTABLE) +#elif defined(HEATER_PROBE_USES_THERMISTOR) + #error "No probe thermistor table specified" #else #define PROBE_TEMPTABLE_LEN 0 #endif @@ -300,7 +306,7 @@ static_assert( HEATER_0_TEMPTABLE_LEN < 256 && HEATER_1_TEMPTABLE_LEN < 256 && HEATER_2_TEMPTABLE_LEN < 256 && HEATER_3_TEMPTABLE_LEN < 256 && HEATER_4_TEMPTABLE_LEN < 256 && HEATER_5_TEMPTABLE_LEN < 256 - && HEATER_6_TEMPTABLE_LEN < 258 && HEATER_7_TEMPTABLE_LEN < 258 + && HEATER_6_TEMPTABLE_LEN < 256 && HEATER_7_TEMPTABLE_LEN < 256 && BED_TEMPTABLE_LEN < 256 && CHAMBER_TEMPTABLE_LEN < 256 && PROBE_TEMPTABLE_LEN < 256, "Temperature conversion tables over 255 entries need special consideration." @@ -309,8 +315,85 @@ static_assert( // Set the high and low raw values for the heaters // For thermistors the highest temperature results in the lowest ADC value // For thermocouples the highest temperature results in the highest ADC value + +#define _TT_REV(N) REVERSE_TEMP_SENSOR_RANGE_##N +#define TT_REV(N) _TT_REV(N) + +#ifdef HEATER_0_TEMPTABLE + #if TT_REV(THERMISTOR_HEATER_0) + #define HEATER_0_SENSOR_MINTEMP_IND 0 + #define HEATER_0_SENSOR_MAXTEMP_IND HEATER_0_TEMPTABLE_LEN - 1 + #else + #define HEATER_0_SENSOR_MINTEMP_IND HEATER_0_TEMPTABLE_LEN - 1 + #define HEATER_0_SENSOR_MAXTEMP_IND 0 + #endif +#endif +#ifdef HEATER_1_TEMPTABLE + #if TT_REV(THERMISTOR_HEATER_1) + #define HEATER_1_SENSOR_MINTEMP_IND 0 + #define HEATER_1_SENSOR_MAXTEMP_IND HEATER_1_TEMPTABLE_LEN - 1 + #else + #define HEATER_1_SENSOR_MINTEMP_IND HEATER_1_TEMPTABLE_LEN - 1 + #define HEATER_1_SENSOR_MAXTEMP_IND 0 + #endif +#endif +#ifdef HEATER_2_TEMPTABLE + #if TT_REV(THERMISTOR_HEATER_2) + #define HEATER_2_SENSOR_MINTEMP_IND 0 + #define HEATER_2_SENSOR_MAXTEMP_IND HEATER_2_TEMPTABLE_LEN - 1 + #else + #define HEATER_2_SENSOR_MINTEMP_IND HEATER_2_TEMPTABLE_LEN - 1 + #define HEATER_2_SENSOR_MAXTEMP_IND 0 + #endif +#endif +#ifdef HEATER_3_TEMPTABLE + #if TT_REV(THERMISTOR_HEATER_3) + #define HEATER_3_SENSOR_MINTEMP_IND 0 + #define HEATER_3_SENSOR_MAXTEMP_IND HEATER_3_TEMPTABLE_LEN - 1 + #else + #define HEATER_3_SENSOR_MINTEMP_IND HEATER_3_TEMPTABLE_LEN - 1 + #define HEATER_3_SENSOR_MAXTEMP_IND 0 + #endif +#endif +#ifdef HEATER_4_TEMPTABLE + #if TT_REV(THERMISTOR_HEATER_4) + #define HEATER_4_SENSOR_MINTEMP_IND 0 + #define HEATER_4_SENSOR_MAXTEMP_IND HEATER_4_TEMPTABLE_LEN - 1 + #else + #define HEATER_4_SENSOR_MINTEMP_IND HEATER_4_TEMPTABLE_LEN - 1 + #define HEATER_4_SENSOR_MAXTEMP_IND 0 + #endif +#endif +#ifdef HEATER_5_TEMPTABLE + #if TT_REV(THERMISTOR_HEATER_5) + #define HEATER_5_SENSOR_MINTEMP_IND 0 + #define HEATER_5_SENSOR_MAXTEMP_IND HEATER_5_TEMPTABLE_LEN - 1 + #else + #define HEATER_5_SENSOR_MINTEMP_IND HEATER_5_TEMPTABLE_LEN - 1 + #define HEATER_5_SENSOR_MAXTEMP_IND 0 + #endif +#endif +#ifdef HEATER_6_TEMPTABLE + #if TT_REV(THERMISTOR_HEATER_6) + #define HEATER_6_SENSOR_MINTEMP_IND 0 + #define HEATER_6_SENSOR_MAXTEMP_IND HEATER_6_TEMPTABLE_LEN - 1 + #else + #define HEATER_6_SENSOR_MINTEMP_IND HEATER_6_TEMPTABLE_LEN - 1 + #define HEATER_6_SENSOR_MAXTEMP_IND 0 + #endif +#endif +#ifdef HEATER_7_TEMPTABLE + #if TT_REV(THERMISTOR_HEATER_7) + #define HEATER_7_SENSOR_MINTEMP_IND 0 + #define HEATER_7_SENSOR_MAXTEMP_IND HEATER_7_TEMPTABLE_LEN - 1 + #else + #define HEATER_7_SENSOR_MINTEMP_IND HEATER_7_TEMPTABLE_LEN - 1 + #define HEATER_7_SENSOR_MAXTEMP_IND 0 + #endif +#endif + #ifndef HEATER_0_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_0_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_0) || !defined(HEATER_0_USES_THERMISTOR) #define HEATER_0_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_0_RAW_LO_TEMP 0 #else @@ -319,7 +402,7 @@ static_assert( #endif #endif #ifndef HEATER_1_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_1_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_1) || !defined(HEATER_1_USES_THERMISTOR) #define HEATER_1_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_1_RAW_LO_TEMP 0 #else @@ -328,7 +411,7 @@ static_assert( #endif #endif #ifndef HEATER_2_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_2_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_2) || !defined(HEATER_2_USES_THERMISTOR) #define HEATER_2_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_2_RAW_LO_TEMP 0 #else @@ -337,7 +420,7 @@ static_assert( #endif #endif #ifndef HEATER_3_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_3_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_3) || !defined(HEATER_3_USES_THERMISTOR) #define HEATER_3_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_3_RAW_LO_TEMP 0 #else @@ -346,7 +429,7 @@ static_assert( #endif #endif #ifndef HEATER_4_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_4_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_4) || !defined(HEATER_4_USES_THERMISTOR) #define HEATER_4_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_4_RAW_LO_TEMP 0 #else @@ -355,7 +438,7 @@ static_assert( #endif #endif #ifndef HEATER_5_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_5_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_5) || !defined(HEATER_5_USES_THERMISTOR) #define HEATER_5_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_5_RAW_LO_TEMP 0 #else @@ -364,7 +447,7 @@ static_assert( #endif #endif #ifndef HEATER_6_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_6_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_6) || !defined(HEATER_6_USES_THERMISTOR) #define HEATER_6_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_6_RAW_LO_TEMP 0 #else @@ -373,7 +456,7 @@ static_assert( #endif #endif #ifndef HEATER_7_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_7_USES_THERMISTOR) + #if TT_REV(THERMISTOR_HEATER_7) || !defined(HEATER_7_USES_THERMISTOR) #define HEATER_7_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_7_RAW_LO_TEMP 0 #else @@ -382,7 +465,7 @@ static_assert( #endif #endif #ifndef HEATER_BED_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_BED_USES_THERMISTOR) + #if TT_REV(THERMISTORBED) || !defined(HEATER_BED_USES_THERMISTOR) #define HEATER_BED_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_BED_RAW_LO_TEMP 0 #else @@ -391,7 +474,7 @@ static_assert( #endif #endif #ifndef HEATER_CHAMBER_RAW_HI_TEMP - #if defined(REVERSE_TEMP_SENSOR_RANGE) || !defined(HEATER_CHAMBER_USES_THERMISTOR) + #if TT_REV(THERMISTORCHAMBER) || !defined(HEATER_CHAMBER_USES_THERMISTOR) #define HEATER_CHAMBER_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE #define HEATER_CHAMBER_RAW_LO_TEMP 0 #else @@ -399,5 +482,15 @@ static_assert( #define HEATER_CHAMBER_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif +#ifndef HEATER_PROBE_RAW_HI_TEMP + #if TT_REV(THERMISTORPROBE) || !defined(HEATER_PROBE_USES_THERMISTOR) + #define HEATER_PROBE_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define HEATER_PROBE_RAW_LO_TEMP 0 + #else + #define HEATER_PROBE_RAW_HI_TEMP 0 + #define HEATER_PROBE_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif -#undef REVERSE_TEMP_SENSOR_RANGE +#undef _TT_REV +#undef TT_REV From 652c75ceb906c7e7993f1bca59934460bad23f1b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 2 Jul 2020 00:08:43 +0000 Subject: [PATCH 064/483] [cron] Bump distribution date (2020-07-02) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f3fea10e0aac..f8d83c393437 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-01" + #define STRING_DISTRIBUTION_DATE "2020-07-02" #endif /** From e25da63721832cca3ee1cdfea3869d9cce4302cc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 1 Jul 2020 22:28:37 -0500 Subject: [PATCH 065/483] Tweak stepper shutdown test --- Marlin/src/MarlinCore.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8a17d5c31177..5c4f5a4413d6 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -466,10 +466,12 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { const millis_t ms = millis(); // Prevent steppers timing-out in the middle of M600 - #define STAY_TEST (BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) && did_pause_print) + // unless PAUSE_PARK_NO_STEPPER_TIMEOUT is disabled + const bool parked_or_ignoring = ignore_stepper_queue || + (BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) && did_pause_print); - if (STAY_TEST || ignore_stepper_queue) - gcode.reset_stepper_timeout(ms); + // Reset both the M18/M84 activity timeout and the M85 max 'kill' timeout + if (parked_or_ignoring) gcode.reset_stepper_timeout(ms); if (gcode.stepper_max_timed_out(ms)) { SERIAL_ERROR_START(); @@ -477,17 +479,25 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { kill(); } + // M18 / M94 : Handle steppers inactive time timeout if (gcode.stepper_inactive_time) { + static bool already_shutdown_steppers; // = false + + // Any moves in the planner? Resets both the M18/M84 + // activity timeout and the M85 max 'kill' timeout if (planner.has_blocks_queued()) gcode.reset_stepper_timeout(ms); - else if (!STAY_TEST && !ignore_stepper_queue && gcode.stepper_inactive_timeout()) { + else if (!parked_or_ignoring && gcode.stepper_inactive_timeout()) { if (!already_shutdown_steppers) { already_shutdown_steppers = true; // L6470 SPI will consume 99% of free time without this + + // Individual axes will be disabled if configured if (ENABLED(DISABLE_INACTIVE_X)) DISABLE_AXIS_X(); if (ENABLED(DISABLE_INACTIVE_Y)) DISABLE_AXIS_Y(); if (ENABLED(DISABLE_INACTIVE_Z)) DISABLE_AXIS_Z(); if (ENABLED(DISABLE_INACTIVE_E)) disable_e_steppers(); + #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) if (ubl.lcd_map_control) { ubl.lcd_map_control = false; From 7b6629c08c66987bf0e071cffd72a7d05a6649f4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 1 Jul 2020 23:07:21 -0500 Subject: [PATCH 066/483] =?UTF-8?q?Extend=20thermistor=201047=20to=20500?= =?UTF-8?q?=C2=B0C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/thermistor/thermistor_1047.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/thermistor/thermistor_1047.h b/Marlin/src/module/thermistor/thermistor_1047.h index 4c89bd3663e3..6a82d04be8fe 100644 --- a/Marlin/src/module/thermistor/thermistor_1047.h +++ b/Marlin/src/module/thermistor/thermistor_1047.h @@ -30,5 +30,9 @@ const temp_entry_t temptable_1047[] PROGMEM = { PtLine(150, 1000, 4700), PtLine(200, 1000, 4700), PtLine(250, 1000, 4700), - PtLine(300, 1000, 4700) + PtLine(300, 1000, 4700), + PtLine(350, 1000, 4700), + PtLine(400, 1000, 4700), + PtLine(450, 1000, 4700), + PtLine(500, 1000, 4700) }; From 299d1fea24a03a251bf2a1ca129c668fc297fa29 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 3 Jul 2020 00:08:52 +0000 Subject: [PATCH 067/483] [cron] Bump distribution date (2020-07-03) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f8d83c393437..2f1edf2e7cbd 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-02" + #define STRING_DISTRIBUTION_DATE "2020-07-03" #endif /** From e401b0c8ee57c63bb129415aa6cccadcddc4aecc Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Thu, 2 Jul 2020 20:32:06 -0400 Subject: [PATCH 068/483] Keep filament runout pin for Creality Melzi (#18504) --- Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index 0428c17e21a7..95466b327d7d 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -61,7 +61,6 @@ #undef LCD_PINS_D5 #undef LCD_PINS_D6 #undef LCD_PINS_D7 -#undef FIL_RUNOUT_PIN // Uses Beeper/LED Pin Pulled to GND #define LCD_SDSS 31 // Smart Controller SD card reader (rather than the Melzi) #define LCD_PINS_RS 28 // ST9720 CS @@ -71,6 +70,13 @@ #if ENABLED(BLTOUCH) #define SERVO0_PIN 27 #undef BEEPER_PIN +#elif ENABLED(FILAMENT_RUNOUT_SENSOR) + #ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 27 + #endif + #if FIL_RUNOUT_PIN == BEEPER_PIN + #undef BEEPER_PIN + #endif #endif #if ENABLED(MINIPANEL) From 097347b5756dbbe54a4463d07e0c8cf3db792123 Mon Sep 17 00:00:00 2001 From: George Fu Date: Fri, 3 Jul 2020 09:33:52 +0800 Subject: [PATCH 069/483] Add FYSETC 2.42 inch OLED support (#18485) --- Marlin/Configuration.h | 5 ++ Marlin/src/inc/Conditionals_LCD.h | 21 +++++ Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 2 +- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 12 +++ Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 105 +++++++++++++--------- 6 files changed, 102 insertions(+), 45 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ac32add6b9cc..68039e7cab67 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2091,6 +2091,11 @@ // //#define OVERLORD_OLED +// +// FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER with WS2812 RGB +// Where to find : https://www.aliexpress.com/item/4000345255731.html +//#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller + //============================================================================= //========================== Extensible UI Displays =========================== //============================================================================= diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 639c5765afb1..b1b2cf9b8250 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -120,6 +120,27 @@ #define IS_RRD_SC #define IS_U8GLIB_SSD1306 +#elif ENABLED(FYSETC_242_OLED_12864) + + #define IS_RRD_SC + #define U8GLIB_SH1106 + + #define LED_CONTROL_MENU + #define NEOPIXEL_LED + #undef NEOPIXEL_TYPE + #define NEOPIXEL_TYPE NEO_RGB + #if NEOPIXEL_PIXELS < 3 + #undef NEOPIXELS_PIXELS + #define NEOPIXEL_PIXELS 3 + #endif + #ifndef NEOPIXEL_BRIGHTNESS + #define NEOPIXEL_BRIGHTNESS 127 + #endif + + #if ENABLED(PSU_CONTROL) + #define LED_BACKLIGHT_TIMEOUT 10000 + #endif + #elif ANY(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) #define FYSETC_MINI_12864 diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index a318b198a830..41cad412a432 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -208,7 +208,7 @@ #endif #endif -#if ENABLED(FYSETC_MINI_12864_2_1) +#if ENABLED(FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864) #define LED_CONTROL_MENU #define LED_USER_PRESET_STARTUP #define LED_COLOR_PRESETS diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index e0b704e71219..d90cc1184fa9 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -246,7 +246,7 @@ void MarlinUI::init_lcd() { OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away #endif - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) SET_OUTPUT(LCD_PINS_DC); #ifndef LCD_RESET_PIN #define LCD_RESET_PIN LCD_PINS_RS diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index e96d4d7b071b..d1a60e7705e4 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -123,6 +123,18 @@ #define U8G_CLASS U8GLIB_SH1106_128X64 // 8 stripes #endif +#elif ENABLED(FYSETC_242_OLED_12864) + + // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER + + #define FORCE_SOFT_SPI // SW-SPI + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes + #else + #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes + #endif + #elif ENABLED(U8GLIB_SH1106) // Generic SH1106 OLED I2C LCD diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index 19238bc5f867..d3d3f0043fd7 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -211,58 +211,77 @@ // // LCDs and Controllers // -#define BEEPER_PIN 37 #define SD_DETECT_PIN 49 -#if ENABLED(FYSETC_MINI_12864) - // - // See https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 - // - #define DOGLCD_A0 16 - #define DOGLCD_CS 17 - - #if ENABLED(FYSETC_GENERIC_12864_1_1) - #define LCD_BACKLIGHT_PIN 27 - #endif - - #define KILL_PIN 41 - #define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - // Seems to work best if left open. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 25 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 27 +#if ENABLED(FYSETC_242_OLED_12864) + #define BTN_EN1 37 + #define BTN_EN2 29 + #define BTN_ENC 35 + #define BEEPER_PIN 31 + + #define LCD_PINS_DC 25 + #define LCD_PINS_RS 33 + #define DOGLCD_CS 16 + #define DOGLCD_MOSI 23 + #define DOGLCD_SCK 17 + #define DOGLCD_A0 LCD_PINS_DC + + #define KILL_PIN -1 // NC + #define NEOPIXEL_PIN 27 + +#else + #define BEEPER_PIN 37 + + #if ENABLED(FYSETC_MINI_12864) + // + // See https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 + // + #define DOGLCD_A0 16 + #define DOGLCD_CS 17 + + #if ENABLED(FYSETC_GENERIC_12864_1_1) + #define LCD_BACKLIGHT_PIN 27 #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 29 + + #define KILL_PIN 41 + #define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. + // Seems to work best if left open. + + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN 25 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN 27 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN 29 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN 25 #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN 25 - #endif -#elif HAS_GRAPHICAL_LCD + #elif HAS_GRAPHICAL_LCD - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS 25 - #define DOGLCD_A0 27 - #endif + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_CS 25 + #define DOGLCD_A0 27 + #endif -#endif + #endif -#if ENABLED(NEWPANEL) - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 + #if ENABLED(NEWPANEL) + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + #endif #endif #ifndef RGB_LED_R_PIN From 2c15a787c7f235a64255beb7fb6264a7a35e3d36 Mon Sep 17 00:00:00 2001 From: cbteeple Date: Fri, 3 Jul 2020 10:24:41 -0400 Subject: [PATCH 070/483] Option to set manual Babystepping distance in mm (#18503) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 5 +++-- Marlin/src/lcd/menu/menu.cpp | 2 +- Marlin/src/lcd/menu/menu.h | 11 +++++++++++ Marlin/src/lcd/menu/menu_tune.cpp | 5 +++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8932c683a8cb..e1036e6fbf3e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1553,8 +1553,9 @@ //#define BABYSTEP_WITHOUT_HOMING //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way - #define BABYSTEP_MULTIPLICATOR_Z 1 // Babysteps are very small. Increase for faster motion. - #define BABYSTEP_MULTIPLICATOR_XY 1 + //#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps + #define BABYSTEP_MULTIPLICATOR_Z 1 // (steps or mm) Steps or millimeter distance for each Z babystep + #define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 58a759655c5d..05491bfeea92 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -343,7 +343,7 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { ui.defer_status_screen(); const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; if (ui.encoderPosition) { - const int16_t babystep_increment = int16_t(ui.encoderPosition) * (BABYSTEP_MULTIPLICATOR_Z); + const int16_t babystep_increment = int16_t(ui.encoderPosition) * (BABYSTEP_SIZE_Z); ui.encoderPosition = 0; const float diff = planner.steps_to_mm[Z_AXIS] * babystep_increment, diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 29b3272bf643..6e916898b999 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -587,6 +587,17 @@ void _lcd_draw_homing(); #else void lcd_babystep_z(); #endif + + #if ENABLED(BABYSTEP_MILLIMETER_UNITS) + #define BABYSTEP_SIZE_X int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[X_AXIS]) + #define BABYSTEP_SIZE_Y int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[Y_AXIS]) + #define BABYSTEP_SIZE_Z int32_t((BABYSTEP_MULTIPLICATOR_Z) * planner.settings.axis_steps_per_mm[Z_AXIS]) + #else + #define BABYSTEP_SIZE_X BABYSTEP_MULTIPLICATOR_XY + #define BABYSTEP_SIZE_Y BABYSTEP_MULTIPLICATOR_XY + #define BABYSTEP_SIZE_Z BABYSTEP_MULTIPLICATOR_Z + #endif + #endif #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index b3913352596a..1b386206d327 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -55,9 +55,10 @@ if (ui.encoderPosition) { const int16_t steps = int16_t(ui.encoderPosition) * ( #if ENABLED(BABYSTEP_XY) - axis != Z_AXIS ? BABYSTEP_MULTIPLICATOR_XY : + axis == X_AXIS ? BABYSTEP_SIZE_X : + axis == Y_AXIS ? BABYSTEP_SIZE_Y : #endif - BABYSTEP_MULTIPLICATOR_Z + BABYSTEP_SIZE_Z ); ui.encoderPosition = 0; ui.refresh(LCDVIEW_REDRAW_NOW); From f6a2b6409192c4e349321f42a5c0ebfd4e278b82 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 3 Jul 2020 09:53:22 -0500 Subject: [PATCH 071/483] Clean up LCD Manual Move / UBL Mesh Edit (#18373) --- Marlin/src/MarlinCore.cpp | 7 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 6 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 5 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 25 ++- Marlin/src/feature/touch/xpt2046.cpp | 1 - Marlin/src/gcode/control/M17_M18_M84.cpp | 7 +- Marlin/src/lcd/menu/menu.cpp | 2 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 43 ++--- Marlin/src/lcd/menu/menu_ubl.cpp | 191 ++++++++++--------- Marlin/src/lcd/ultralcd.cpp | 112 +++++++---- Marlin/src/lcd/ultralcd.h | 54 ++++-- Marlin/src/module/motion.cpp | 8 +- Marlin/src/module/planner.cpp | 6 +- 14 files changed, 263 insertions(+), 206 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 5c4f5a4413d6..06e0d228e0f7 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -498,12 +498,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { if (ENABLED(DISABLE_INACTIVE_Z)) DISABLE_AXIS_Z(); if (ENABLED(DISABLE_INACTIVE_E)) disable_e_steppers(); - #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) - if (ubl.lcd_map_control) { - ubl.lcd_map_control = false; - ui.defer_status_screen(false); - } - #endif + TERN_(AUTO_BED_LEVELING_UBL, ubl.steppers_were_disabled()); } } else diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index e08debf1d34b..a93f5218d3dd 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -84,11 +84,7 @@ _GRIDPOS(Y, 12), _GRIDPOS(Y, 13), _GRIDPOS(Y, 14), _GRIDPOS(Y, 15) ); - #if HAS_LCD_MENU - bool unified_bed_leveling::lcd_map_control = false; - #endif - - volatile int unified_bed_leveling::encoder_diff; + volatile int16_t unified_bed_leveling::encoder_diff; unified_bed_leveling::unified_bed_leveling() { reset(); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 9e227f02d9f7..3455416a6265 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -111,9 +111,12 @@ class unified_bed_leveling { #if HAS_LCD_MENU static bool lcd_map_control; + static void steppers_were_disabled(); + #else + static inline void steppers_were_disabled() {} #endif - static volatile int encoder_diff; // Volatile because it's changed at interrupt time. + static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time unified_bed_leveling(); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index a3d45169bc51..da3477078a93 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -54,7 +54,18 @@ #define UBL_G29_P31 #if HAS_LCD_MENU - void _lcd_ubl_output_map_lcd(); + + bool unified_bed_leveling::lcd_map_control = false; + + void unified_bed_leveling::steppers_were_disabled() { + if (lcd_map_control) { + lcd_map_control = false; + ui.defer_status_screen(false); + } + } + + void ubl_map_screen(); + #endif #define SIZE_OF_LITTLE_RAISE 1 @@ -789,11 +800,11 @@ bool click_and_hold(const clickFunc_t func=nullptr) { if (ui.button_pressed()) { - ui.quick_feedback(false); // Preserve button state for click-and-hold + ui.quick_feedback(false); // Preserve button state for click-and-hold const millis_t nxt = millis() + 1500UL; - while (ui.button_pressed()) { // Loop while the encoder is pressed. Uses hardware flag! - idle(); // idle, of course - if (ELAPSED(millis(), nxt)) { // After 1.5 seconds + while (ui.button_pressed()) { // Loop while the encoder is pressed. Uses hardware flag! + idle(); // idle, of course + if (ELAPSED(millis(), nxt)) { // After 1.5 seconds ui.quick_feedback(); if (func) (*func)(); ui.wait_for_release(); @@ -995,9 +1006,9 @@ lcd_mesh_edit_setup(new_z); do { + idle(); new_z = lcd_mesh_edit(); TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited - idle(); SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } while (!ui.button_pressed()); @@ -1022,7 +1033,7 @@ SERIAL_ECHOLNPGM("Done Editing Mesh"); if (lcd_map_control) - ui.goto_screen(_lcd_ubl_output_map_lcd); + ui.goto_screen(ubl_map_screen); else ui.return_to_status(); } diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index 9c84e4d95ca9..879d88bab3bb 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -81,7 +81,6 @@ #endif XPT2046 touch; -extern int8_t encoderDiff; void XPT2046::init() { SET_INPUT(TOUCH_MISO_PIN); diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp index 55a219917c7d..842f301d92f9 100644 --- a/Marlin/src/gcode/control/M17_M18_M84.cpp +++ b/Marlin/src/gcode/control/M17_M18_M84.cpp @@ -64,11 +64,6 @@ void GcodeSuite::M18_M84() { else planner.finish_and_disable(); - #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) - if (ubl.lcd_map_control) { - ubl.lcd_map_control = false; - ui.defer_status_screen(false); - } - #endif + TERN_(AUTO_BED_LEVELING_UBL, ubl.steppers_were_disabled()); } } diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 05491bfeea92..7c384f161847 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -230,7 +230,7 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co screen = TERN(BABYSTEP_ZPROBE_OFFSET, lcd_babystep_zoffset, lcd_babystep_z); else { #if ENABLED(MOVE_Z_WHEN_IDLE) - move_menu_scale = MOVE_Z_IDLE_MULTIPLICATOR; + ui.manual_move.menu_scale = MOVE_Z_IDLE_MULTIPLICATOR; screen = lcd_move_z; #endif } diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index 381606bd1452..7c25ca0afc2b 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -46,7 +46,7 @@ void _man_probe_pt(const xy_pos_t &xy) { do_blocking_move_to_xy_z(xy, Z_CLEARANCE_BETWEEN_PROBES); ui.wait_for_move = false; ui.synchronize(); - move_menu_scale = _MAX(PROBE_MANUALLY_STEP, MIN_STEPS_PER_SEGMENT / float(DEFAULT_XYZ_STEPS_PER_UNIT)); + ui.manual_move.menu_scale = _MAX(PROBE_MANUALLY_STEP, MIN_STEPS_PER_SEGMENT / float(DEFAULT_XYZ_STEPS_PER_UNIT)); ui.goto_screen(lcd_move_z); } } diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 58594dd0137b..ff99358a8bc7 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -50,28 +50,13 @@ float manual_move_e_origin = 0; #endif -// -// Tell ui.update() to start a move to current_position" after a short delay. -// -inline void manual_move_to_current(AxisEnum axis - #if MULTI_MANUAL - , const int8_t eindex=-1 - #endif -) { - #if MULTI_MANUAL - if (axis == E_AXIS) ui.manual_move_e_index = eindex >= 0 ? eindex : active_extruder; - #endif - ui.manual_move_start_time = millis() + (move_menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves - ui.manual_move_axis = (int8_t)axis; -} - // // "Motion" > "Move Axis" submenu // static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { if (ui.use_click()) return ui.goto_previous_screen_no_defer(); - if (ui.encoderPosition && !ui.processing_manual_move) { + if (ui.encoderPosition && !ui.manual_move.processing) { // Start with no limits to movement float min = current_position[axis] - 1000, @@ -105,13 +90,13 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { #endif // Get the new position - const float diff = float(int32_t(ui.encoderPosition)) * move_menu_scale; + const float diff = float(int32_t(ui.encoderPosition)) * ui.manual_move.menu_scale; #if IS_KINEMATIC - ui.manual_move_offset += diff; + ui.manual_move.offset += diff; if (int32_t(ui.encoderPosition) < 0) - NOLESS(ui.manual_move_offset, min - current_position[axis]); + NOLESS(ui.manual_move.offset, min - current_position[axis]); else - NOMORE(ui.manual_move_offset, max - current_position[axis]); + NOMORE(ui.manual_move.offset, max - current_position[axis]); #else current_position[axis] += diff; if (int32_t(ui.encoderPosition) < 0) @@ -120,16 +105,16 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { NOMORE(current_position[axis], max); #endif - manual_move_to_current(axis); + ui.manual_move.soon(axis); ui.refresh(LCDVIEW_REDRAW_NOW); } ui.encoderPosition = 0; if (ui.should_draw()) { const float pos = NATIVE_TO_LOGICAL( - ui.processing_manual_move ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move_offset), + ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), axis ); - MenuEditItemBase::draw_edit_screen(name, move_menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr43sign(pos)); + MenuEditItemBase::draw_edit_screen(name, ui.manual_move.menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr43sign(pos)); } } void lcd_move_x() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_X), X_AXIS); } @@ -141,10 +126,10 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } static void lcd_move_e(TERN_(MULTI_MANUAL, const int8_t eindex=-1)) { if (ui.use_click()) return ui.goto_previous_screen_no_defer(); if (ui.encoderPosition) { - if (!ui.processing_manual_move) { - const float diff = float(int32_t(ui.encoderPosition)) * move_menu_scale; - TERN(IS_KINEMATIC, ui.manual_move_offset, current_position.e) += diff; - manual_move_to_current(E_AXIS + if (!ui.manual_move.processing) { + const float diff = float(int32_t(ui.encoderPosition)) * ui.manual_move.menu_scale; + TERN(IS_KINEMATIC, ui.manual_move.offset, current_position.e) += diff; + ui.manual_move.soon(E_AXIS #if MULTI_MANUAL , eindex #endif @@ -160,7 +145,7 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } MenuEditItemBase::draw_edit_screen( GET_TEXT(TERN(MULTI_MANUAL, MSG_MOVE_EN, MSG_MOVE_E)), ftostr41sign(current_position.e - + TERN0(IS_KINEMATIC, ui.manual_move_offset) + + TERN0(IS_KINEMATIC, ui.manual_move.offset) - TERN0(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin) ) ); @@ -181,7 +166,7 @@ screenFunc_t _manual_move_func_ptr; void _goto_manual_move(const float scale) { ui.defer_status_screen(); - move_menu_scale = scale; + ui.manual_move.menu_scale = scale; ui.goto_screen(_manual_move_func_ptr); } diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 58cf13a11c52..3722b53cb9be 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -49,46 +49,36 @@ static int8_t x_plot = 0, y_plot = 0; // May be negative during move static int16_t custom_bed_temp = 50; #endif -float mesh_edit_value, mesh_edit_accumulator; // We round mesh_edit_value to 2.5 decimal places. So we keep a - // separate value that doesn't lose precision. -static int16_t ubl_encoderPosition = 0; +float mesh_edit_accumulator; // Rounded to 2.5 decimal places on use + +inline float rounded_mesh_value() { + const int32_t rounded = int32_t(mesh_edit_accumulator * 1000); + return float(rounded - (rounded % 5L)) / 1000; +} static void _lcd_mesh_fine_tune(PGM_P const msg) { ui.defer_status_screen(); if (ubl.encoder_diff) { - ubl_encoderPosition = (ubl.encoder_diff > 0) ? 1 : -1; + mesh_edit_accumulator += ubl.encoder_diff > 0 ? 0.005f : -0.005f; ubl.encoder_diff = 0; - - mesh_edit_accumulator += float(ubl_encoderPosition) * 0.005f * 0.5f; - mesh_edit_value = mesh_edit_accumulator; - ui.encoderPosition = 0; ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - - const int32_t rounded = (int32_t)(mesh_edit_value * 1000); - mesh_edit_value = float(rounded - (rounded % 5L)) / 1000; } if (ui.should_draw()) { - MenuEditItemBase::draw_edit_screen(msg, ftostr43sign(mesh_edit_value)); - TERN_(MESH_EDIT_GFX_OVERLAY, _lcd_zoffset_overlay_gfx(mesh_edit_value)); + const float rounded_f = rounded_mesh_value(); + MenuEditItemBase::draw_edit_screen(msg, ftostr43sign(rounded_f)); + TERN_(MESH_EDIT_GFX_OVERLAY, _lcd_zoffset_overlay_gfx(rounded_f)); } } -void lcd_limbo() { - ui.currentScreen = []{}; - ui.defer_status_screen(); -} - -float lcd_mesh_edit() { - lcd_limbo(); - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDITOR)); - return mesh_edit_value; -} +// +// Called external to the menu system to acquire the result of an edit. +// +float lcd_mesh_edit() { return rounded_mesh_value(); } void lcd_mesh_edit_setup(const float &initial) { - mesh_edit_value = mesh_edit_accumulator = initial; - lcd_limbo(); + mesh_edit_accumulator = initial; + ui.goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); } void _lcd_z_offset_edit() { @@ -97,11 +87,11 @@ void _lcd_z_offset_edit() { float lcd_z_offset_edit() { ui.goto_screen(_lcd_z_offset_edit); - return mesh_edit_value; + return rounded_mesh_value(); } void lcd_z_offset_edit_setup(const float &initial) { - mesh_edit_value = mesh_edit_accumulator = initial; + mesh_edit_accumulator = initial; ui.goto_screen(_lcd_z_offset_edit); } @@ -390,24 +380,10 @@ void _lcd_ubl_storage_mesh() { END_MENU(); } -/** - * UBL LCD "radar" map homing - */ -void _lcd_ubl_output_map_lcd(); - -void _lcd_ubl_map_homing() { - ui.defer_status_screen(); - _lcd_draw_homing(); - if (all_axes_homed()) { - ubl.lcd_map_control = true; // Return to the map screen - ui.goto_screen(_lcd_ubl_output_map_lcd); - } -} - /** * UBL LCD "radar" map point editing */ -void _lcd_ubl_map_lcd_edit_cmd() { +void _lcd_ubl_map_edit_cmd() { char ubl_lcd_gcode[50], str[10], str2[10]; dtostrf(ubl.mesh_index_to_xpos(x_plot), 0, 2, str); dtostrf(ubl.mesh_index_to_ypos(y_plot), 0, 2, str2); @@ -419,85 +395,122 @@ void _lcd_ubl_map_lcd_edit_cmd() { * UBL LCD Map Movement */ void ubl_map_move_to_xy() { - const feedRate_t fr_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); - - destination = current_position; // sync destination at the start #if ENABLED(DELTA) - if (current_position.z > delta_clip_start_height) { + if (current_position.z > delta_clip_start_height) { // Make sure the delta has fully free motion + destination = current_position; destination.z = delta_clip_start_height; - prepare_internal_move_to_destination(fr_mm_s); + prepare_internal_fast_move_to_destination(homing_feedrate(Z_AXIS)); // Set current_position from destination } #endif - destination.set(ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot)); - prepare_internal_move_to_destination(fr_mm_s); + // Set the nozzle position to the mesh point + current_position.set(ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot)); + + // Use the built-in manual move handler + ui.manual_move.soon(ALL_AXES); +} + +inline int32_t grid_index(const uint8_t x, const uint8_t y) { + return (GRID_MAX_POINTS_X) * y + x; } /** * UBL LCD "radar" map */ -void _lcd_ubl_output_map_lcd() { +void ubl_map_screen() { + // static millis_t next_move = 0; + // const millis_t ms = millis(); - static int16_t step_scaler = 0; + uint8_t x, y; - if (ui.use_click()) return _lcd_ubl_map_lcd_edit_cmd(); + if (ui.first_page) { - if (ui.encoderPosition) { - step_scaler += int32_t(ui.encoderPosition); - x_plot += step_scaler / (ENCODER_STEPS_PER_MENU_ITEM); - ui.encoderPosition = 0; - ui.refresh(LCDVIEW_REDRAW_NOW); - } + // On click send "G29 P4 ..." to edit the Z value + if (ui.use_click()) { + _lcd_ubl_map_edit_cmd(); + return; + } - #define KEEP_LOOPING ENABLED(IS_KINEMATIC) // Loop until a valid point is found + ui.defer_status_screen(); + + #if IS_KINEMATIC + // Index of the mesh point upon entry + const uint32_t old_pos_index = grid_index(x_plot, y_plot); + // Direction from new (unconstrained) encoder value + const int8_t step_dir = int32_t(ui.encoderPosition) < old_pos_index ? -1 : 1; + #endif - do { - // Encoder to the right (++) - if (x_plot >= GRID_MAX_POINTS_X) { x_plot = 0; y_plot++; } - if (y_plot >= GRID_MAX_POINTS_Y) y_plot = 0; + do { + // Now, keep the encoder position within range + if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = GRID_MAX_POINTS - 1; + if (int32_t(ui.encoderPosition) > GRID_MAX_POINTS - 1) ui.encoderPosition = 0; - // Encoder to the left (--) - if (x_plot < 0) { x_plot = GRID_MAX_POINTS_X - 1; y_plot--; } - if (y_plot < 0) y_plot = GRID_MAX_POINTS_Y - 1; + // Draw the grid point based on the encoder + x = ui.encoderPosition % (GRID_MAX_POINTS_X); + y = ui.encoderPosition / (GRID_MAX_POINTS_X); + // Validate if needed + #if IS_KINEMATIC + const xy_pos_t xy = { ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) }; + if (position_is_reachable(xy)) break; // Found a valid point + ui.encoderPosition += step_dir; // Test the next point + #endif + } while(ENABLED(IS_KINEMATIC)); + + // Determine number of points to edit #if IS_KINEMATIC - const xy_pos_t xy = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }; - if (position_is_reachable(xy)) break; // Found a valid point - x_plot += (step_scaler < 0) ? -1 : 1; + n_edit_pts = 9; // TODO: Delta accessible edit points + #else + const bool xc = WITHIN(x, 1, GRID_MAX_POINTS_X - 2), + yc = WITHIN(y, 1, GRID_MAX_POINTS_Y - 2); + n_edit_pts = yc ? (xc ? 9 : 6) : (xc ? 6 : 4); // Corners #endif - } while(KEEP_LOOPING); + // Refresh is also set by encoder movement + //if (int32_t(ui.encoderPosition) != grid_index(x, y)) + // ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); + } - // Determine number of points to edit - #if IS_KINEMATIC - n_edit_pts = 9; //TODO: Delta accessible edit points - #else - const bool xc = WITHIN(x_plot, 1, GRID_MAX_POINTS_X - 2), - yc = WITHIN(y_plot, 1, GRID_MAX_POINTS_Y - 2); - n_edit_pts = yc ? (xc ? 9 : 6) : (xc ? 6 : 4); // Corners - #endif + // Draw the grid point based on the encoder + x = ui.encoderPosition % (GRID_MAX_POINTS_X); + y = ui.encoderPosition / (GRID_MAX_POINTS_X); - // Cleanup - if (ABS(step_scaler) >= ENCODER_STEPS_PER_MENU_ITEM) step_scaler = 0; + if (ui.should_draw()) ui.ubl_plot(x, y); - if (ui.should_draw()) { - ui.ubl_plot(x_plot, y_plot); - if (!planner.movesplanned()) - ubl_map_move_to_xy(); // Move to new location + // Add a move if needed to match the grid point + if (x != x_plot || y != y_plot) { + x_plot = x; y_plot = y; // The move is always posted, so update the grid point now + ubl_map_move_to_xy(); // Sets up a "manual move" + ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); // Clean up a half drawn box + } +} + +/** + * UBL LCD "radar" map homing + */ +void _ubl_map_screen_homing() { + ui.defer_status_screen(); + _lcd_draw_homing(); + if (all_axes_homed()) { + ubl.lcd_map_control = true; // Return to the map screen after editing Z + ui.goto_screen(ubl_map_screen, grid_index(x_plot, y_plot)); // Pre-set the encoder value + ui.manual_move.menu_scale = 0; // Immediate move + ubl_map_move_to_xy(); // Move to current mesh point + ui.manual_move.menu_scale = 1; // Delayed moves } } /** * UBL Homing before LCD map */ -void _lcd_ubl_output_map_lcd_cmd() { +void _ubl_goto_map_screen() { + if (planner.movesplanned()) return; // The ACTION_ITEM will do nothing if (!all_axes_known()) { set_all_unhomed(); queue.inject_P(G28_STR); } - if (planner.movesplanned()) return; - ui.goto_screen(_lcd_ubl_map_homing); + ui.goto_screen(_ubl_map_screen_homing); // Go to the "Homing" screen } /** @@ -591,7 +604,7 @@ void _lcd_ubl_level_bed() { #if ENABLED(G26_MESH_VALIDATION) SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); #endif - ACTION_ITEM(MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd); + ACTION_ITEM(MSG_UBL_MESH_EDIT, _ubl_goto_map_screen); SUBMENU(MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh); SUBMENU(MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map); SUBMENU(MSG_UBL_TOOLS, _menu_ubl_tools); diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 74924e1dd131..d2033018a627 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -211,7 +211,6 @@ millis_t MarlinUI::next_button_update_ms; // = 0 #endif bool MarlinUI::lcd_clicked; - float move_menu_scale; bool MarlinUI::use_click() { const bool click = lcd_clicked; @@ -388,7 +387,7 @@ bool MarlinUI::get_blink() { void lcd_move_z(); void _reprapworld_keypad_move(const AxisEnum axis, const int16_t dir) { - move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; + ui.manual_move.menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; ui.encoderPosition = dir; switch (axis) { case X_AXIS: lcd_move_x(); break; @@ -637,51 +636,65 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { #if HAS_LCD_MENU - int8_t MarlinUI::manual_move_axis = (int8_t)NO_AXIS; - millis_t MarlinUI::manual_move_start_time = 0; + ManualMove MarlinUI::manual_move{}; - #if IS_KINEMATIC - bool MarlinUI::processing_manual_move = false; - float MarlinUI::manual_move_offset = 0; - #endif - - #if MULTI_MANUAL - int8_t MarlinUI::manual_move_e_index = 0; - #endif + millis_t ManualMove::start_time = 0; + float ManualMove::menu_scale = 1; + TERN_(IS_KINEMATIC, float ManualMove::offset = 0); + TERN_(IS_KINEMATIC, bool ManualMove::processing = false); + TERN_(MULTI_MANUAL, int8_t ManualMove::e_index = 0); + uint8_t ManualMove::axis = (uint8_t)NO_AXIS; /** - * If the most recent manual move hasn't been fed to the planner yet, - * and the planner can accept one, send a move immediately. + * If a manual move has been posted and its time has arrived, and if the planner + * has a space for it, then add a linear move to current_position the planner. + * + * If any manual move needs to be interrupted, make sure to force a manual move + * by setting manual_move.start_time to millis() after updating current_position. + * + * To post a manual move: + * - Update current_position to the new place you want to go. + * - Set manual_move.axis to an axis like X_AXIS. Use ALL_AXES for diagonal moves. + * - Set manual_move.start_time to a point in the future (in ms) when the move should be done. + * + * For kinematic machines: + * - Set manual_move.offset to modify one axis and post the move. + * This is used to achieve more rapid stepping on kinematic machines. + * + * Currently used by the _lcd_move_xyz function in menu_motion.cpp + * and the ubl_map_move_to_xy funtion in menu_ubl.cpp. */ - void MarlinUI::manage_manual_move() { + void ManualMove::task() { - if (processing_manual_move) return; + if (processing) return; // Prevent re-entry from idle() calls - if (manual_move_axis != (int8_t)NO_AXIS && ELAPSED(millis(), manual_move_start_time) && !planner.is_full()) { + // Add a manual move to the queue? + if (axis != (uint8_t)NO_AXIS && ELAPSED(millis(), start_time) && !planner.is_full()) { + + const feedRate_t fr_mm_s = (uint8_t(axis) <= E_AXIS) ? manual_feedrate_mm_s[axis] : XY_PROBE_FEEDRATE_MM_S; - const feedRate_t fr_mm_s = manual_feedrate_mm_s[manual_move_axis]; #if IS_KINEMATIC #if EXTRUDERS > 1 const int8_t old_extruder = active_extruder; - if (manual_move_axis == E_AXIS) active_extruder = manual_move_e_index; + if (axis == E_AXIS) active_extruder = e_index; #endif - // Set movement on a single axis + // Apply a linear offset to a single axis destination = current_position; - destination[manual_move_axis] += manual_move_offset; + if (axis <= XYZE) destination[axis] += offset; // Reset for the next move - manual_move_offset = 0; - manual_move_axis = (int8_t)NO_AXIS; + offset = 0; + axis = (uint8_t)NO_AXIS; // DELTA and SCARA machines use segmented moves, which could fill the planner during the call to // move_to_destination. This will cause idle() to be called, which can then call this function while the - // previous invocation is being blocked. Modifications to manual_move_offset shouldn't be made while - // processing_manual_move is true or the planner will get out of sync. - processing_manual_move = true; + // previous invocation is being blocked. Modifications to offset shouldn't be made while + // processing is true or the planner will get out of sync. + processing = true; prepare_internal_move_to_destination(fr_mm_s); // will set current_position from destination - processing_manual_move = false; + processing = false; #if EXTRUDERS > 1 active_extruder = old_extruder; @@ -689,15 +702,47 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { #else - planner.buffer_line(current_position, fr_mm_s, manual_move_axis == E_AXIS ? manual_move_e_index : active_extruder); - manual_move_axis = (int8_t)NO_AXIS; + // For Cartesian / Core motion simply move to the current_position + planner.buffer_line(current_position, fr_mm_s, axis == E_AXIS ? e_index : active_extruder); + + //SERIAL_ECHOLNPAIR("Add planner.move with Axis ", int(axis), " at FR ", fr_mm_s); + + axis = (uint8_t)NO_AXIS; #endif } } + // + // Tell ui.update() to start a move to current_position after a short delay. + // + void ManualMove::soon(AxisEnum move_axis + #if MULTI_MANUAL + , const int8_t eindex/*=-1*/ + #endif + ) { + #if MULTI_MANUAL + if (move_axis == E_AXIS) e_index = eindex >= 0 ? eindex : active_extruder; + #endif + start_time = millis() + (menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves + axis = (uint8_t)move_axis; + //SERIAL_ECHOLNPAIR("Post Move with Axis ", int(axis), " soon."); + } + #endif // HAS_LCD_MENU +#if ENABLED(AUTO_BED_LEVELING_UBL) + + void MarlinUI::external_encoder() { + if (external_control && encoderDiff) { + ubl.encoder_diff += encoderDiff; // Encoder for UBL G29 mesh editing + encoderDiff = 0; // Hide encoder events from the screen handler + refresh(LCDVIEW_REDRAW_NOW); // ...but keep the refresh. + } + } + +#endif + /** * Update the LCD, read encoder buttons, etc. * - Read button states @@ -753,7 +798,7 @@ void MarlinUI::update() { #if HAS_LCD_MENU // Handle any queued Move Axis motion - manage_manual_move(); + manual_move.task(); // Update button states for button_pressed(), etc. // If the state changes the next update may be delayed 300-500ms. @@ -776,7 +821,7 @@ void MarlinUI::update() { if (ELAPSED(ms, next_button_update_ms)) { encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * (ENCODER_PULSES_PER_STEP) * encoderDirection; if (touch_buttons & EN_A) encoderDiff *= -1; - TERN_(AUTO_BED_LEVELING_UBL, if (external_control) ubl.encoder_diff = encoderDiff); + TERN_(AUTO_BED_LEVELING_UBL, external_encoder()); next_button_update_ms = ms + repeat_delay; // Assume the repeat delay if (!wait_for_unclick) { next_button_update_ms += 250; // Longer delay on first press @@ -1196,10 +1241,7 @@ void MarlinUI::update() { case encrot2: ENCODER_SPIN(encrot1, encrot3); break; case encrot3: ENCODER_SPIN(encrot2, encrot0); break; } - if (external_control) { - TERN_(AUTO_BED_LEVELING_UBL, ubl.encoder_diff = encoderDiff); // Make encoder rotation available to UBL G29 mesh editing. - encoderDiff = 0; // Hide the encoder event from the current screen handler. - } + TERN_(AUTO_BED_LEVELING_UBL, external_encoder()); lastEncoderBits = enc; } diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 7641643409e5..6ebd43a37dd3 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -99,9 +99,6 @@ typedef void (*screenFunc_t)(); typedef void (*menuAction_t)(); - // Manual Movement - extern float move_menu_scale; - #if ENABLED(ADVANCED_PAUSE_FEATURE) void lcd_pause_show_message(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, @@ -264,6 +261,35 @@ } preheat_t; #endif +#if HAS_LCD_MENU + + // Manual Movement class + class ManualMove { + public: + static millis_t start_time; + static float menu_scale; + TERN_(IS_KINEMATIC, static float offset); + #if IS_KINEMATIC + static bool processing; + #else + static bool constexpr processing = false; + #endif + #if MULTI_MANUAL + static int8_t e_index; + #else + static int8_t constexpr e_index = 0; + #endif + static uint8_t axis; + static void task(); + static void soon(AxisEnum axis + #if MULTI_MANUAL + , const int8_t eindex=-1 + #endif + ); + }; + +#endif + //////////////////////////////////////////// //////////// MarlinUI Singleton //////////// //////////////////////////////////////////// @@ -494,29 +520,14 @@ class MarlinUI { static void enable_encoder_multiplier(const bool onoff); #endif - static int8_t manual_move_axis; - static millis_t manual_move_start_time; - - #if IS_KINEMATIC - static float manual_move_offset; - static bool processing_manual_move; - #else - static constexpr bool processing_manual_move = false; - #endif - - #if E_MANUAL > 1 - static int8_t manual_move_e_index; - #else - static constexpr int8_t manual_move_e_index = 0; - #endif + // Manual Movement + static ManualMove manual_move; // Select Screen (modal NO/YES style dialog) static bool selection; static void set_selection(const bool sel) { selection = sel; } static bool update_selection(); - static void manage_manual_move(); - static bool lcd_clicked; static bool use_click(); @@ -609,6 +620,9 @@ class MarlinUI { static bool external_control; FORCE_INLINE static void capture() { external_control = true; } FORCE_INLINE static void release() { external_control = false; } + #if ENABLED(AUTO_BED_LEVELING_UBL) + static void external_encoder(); + #endif #else static constexpr bool external_control = false; #endif diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 7fba6f8ea3c4..1994280a2c31 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1316,16 +1316,18 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t current_position[axis] = distance; line_to_current_position(real_fr_mm_s); #else + // Get the ABC or XYZ positions in mm abce_pos_t target = planner.get_axis_positions_mm(); - target[axis] = 0; - planner.set_machine_position_mm(target); - target[axis] = distance; + + target[axis] = 0; // Set the single homing axis to 0 + planner.set_machine_position_mm(target); // Update the machine position #if HAS_DIST_MM_ARG const xyze_float_t cart_dist_mm{0}; #endif // Set delta/cartesian axes directly + target[axis] = distance; // The move will be towards the endstop planner.buffer_segment(target #if HAS_DIST_MM_ARG , cart_dist_mm diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 1beb63c1a4ee..8352c2b3a6a1 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1654,7 +1654,7 @@ void Planner::synchronize() { * extruder - target extruder * millimeters - the length of the movement, if known * - * Returns true if movement was properly queued, false otherwise + * Returns true if movement was properly queued, false otherwise (if cleaning) */ bool Planner::_buffer_steps(const xyze_long_t &target #if HAS_POSITION_FLOAT @@ -2637,6 +2637,8 @@ void Planner::buffer_sync_block() { * fr_mm_s - (target) speed of the move * extruder - target extruder * millimeters - the length of the movement, if known + * + * Return 'false' if no segment was queued due to cleaning, cold extrusion, full queue, etc. */ bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e #if HAS_DIST_MM_ARG @@ -2706,7 +2708,7 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con SERIAL_ECHOLNPGM(")"); //*/ - // Queue the movement + // Queue the movement. Return 'false' if the move was not queued. if (!_buffer_steps(target #if HAS_POSITION_FLOAT , target_float From 8c205c5ff69e1c09856bb874fe81ac736c42b631 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 3 Jul 2020 08:31:25 -0700 Subject: [PATCH 072/483] FYSETC OLED followup (#18519) --- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index d90cc1184fa9..e26b990a2474 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -246,7 +246,7 @@ void MarlinUI::init_lcd() { OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away #endif - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) SET_OUTPUT(LCD_PINS_DC); #ifndef LCD_RESET_PIN #define LCD_RESET_PIN LCD_PINS_RS From 90380d566404af9cca38d41d0ca433c3d4f5f954 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Fri, 3 Jul 2020 08:39:03 -0700 Subject: [PATCH 073/483] Ensure Git applies Unix line-endings in tests (#18495) --- buildroot/tests/.gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 buildroot/tests/.gitattributes diff --git a/buildroot/tests/.gitattributes b/buildroot/tests/.gitattributes new file mode 100644 index 000000000000..6313b56c5784 --- /dev/null +++ b/buildroot/tests/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf From 7448b65567f15d340b76e5435e1f1f1bc144573c Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Fri, 3 Jul 2020 18:49:16 +0200 Subject: [PATCH 074/483] Fix axis name in serial output (#18522) --- Marlin/src/core/types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 6bcd4bd489ea..cd533ad269b1 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -501,4 +501,4 @@ struct XYZEval { #undef FI const xyze_char_t axis_codes { 'X', 'Y', 'Z', 'E' }; -#define XYZ_CHAR(A) ('X' + char(A)) +#define XYZ_CHAR(A) ((char)('X' + A)) From 382c566a7771badce5161c5418ff1a329a6e340f Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 3 Jul 2020 09:51:44 -0700 Subject: [PATCH 075/483] Fix env:mks_robin_nano35 (#18516) --- platformio.ini | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/platformio.ini b/platformio.ini index f0b71d439e31..2d390026b5d0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -552,6 +552,16 @@ extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 +# +# MKS Robin Nano (STM32F103VET6) - MKS UI (LVGL) +# +[env:mks_robin_nano35] +platform = ${common_stm32f1.platform} +extends = env:mks_robin_nano +extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +lib_deps = ${common_stm32f1.lib_deps} + MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip + # # MKS Robin (STM32F103ZET6) # @@ -627,23 +637,6 @@ build_flags = ${common_stm32f1.build_flags} lib_ignore = ${common_stm32f1.lib_ignore} LiquidCrystal, LiquidTWI2, TMCStepper, U8glib-HAL, SoftwareSerialM -# -# MKS Robin Nano (STM32F103VET6) - MKS UI (LVGL) -# -[env:mks_robin_nano35] -platform = ststm32 -board = genericSTM32F103VE -platform_packages = tool-stm32duino -build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py - ${common.build_flags} -std=gnu++14 -DHAVE_SW_SERIAL -DSS_TIMER=4 -build_unflags = -std=gnu++11 -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano35.py -src_filter = ${common.default_src_filter} + -lib_deps = ${common.lib_deps} - SoftwareSerialM - MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip -lib_ignore = Adafruit NeoPixel, SPI - # # Malyan M200 v2 (STM32F070RB) # @@ -699,8 +692,8 @@ platform = ${common_stm32f1.platform} extends = env:chitu_f103 src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} - SoftwareSerialM - MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip + SoftwareSerialM + MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip # # Creality (STM32F103RET6) From bb89e33e24bccf52fdcbd963e5edc07693ee0bb6 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 4 Jul 2020 09:18:09 +1200 Subject: [PATCH 076/483] FIx Sanguino/1284p board_upload.maximum_size (#18502) --- platformio.ini | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 2d390026b5d0..a54221c7c2ef 100644 --- a/platformio.ini +++ b/platformio.ini @@ -147,6 +147,7 @@ board = sanguino_atmega644p platform = atmelavr extends = common_avr8 board = sanguino_atmega1284p +board_upload.maximum_size = 126976 # # Melzi and clones (ATmega1284p) @@ -157,13 +158,16 @@ extends = common_avr8 board = sanguino_atmega1284p lib_ignore = TMCStepper upload_speed = 57600 +board_upload.maximum_size = 126976 # # Melzi and clones (Optiboot bootloader) # [env:melzi_optiboot] platform = atmelavr -extends = env:melzi +extends = common_avr8 +board = sanguino_atmega1284p +lib_ignore = TMCStepper upload_speed = 115200 # @@ -171,8 +175,7 @@ upload_speed = 115200 # [env:melzi_optimized] platform = atmelavr -extends = env:melzi -upload_speed = 115200 +extends = env:melzi_optiboot build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues build_unflags = -g -ggdb From 91dc74ff16d5edb0d8ab5c809614acad25426553 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 4 Jul 2020 09:33:09 +1200 Subject: [PATCH 077/483] M150 I to set Neopixel by index (#18490) --- Marlin/src/feature/leds/neopixel.cpp | 26 +++++++++++++++++--------- Marlin/src/feature/leds/neopixel.h | 4 ++++ Marlin/src/gcode/feature/leds/M150.cpp | 9 ++++++++- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 3c2c0b44fc77..3d11c5b64efc 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -35,6 +35,7 @@ #endif Marlin_NeoPixel neo; +int8_t Marlin_NeoPixel::neoindex; Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800) #if MULTIPLE_NEOPIXEL_TYPES @@ -52,14 +53,20 @@ Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIX #endif void Marlin_NeoPixel::set_color(const uint32_t color) { - for (uint16_t i = 0; i < pixels(); ++i) { - #ifdef NEOPIXEL_BKGD_LED_INDEX - if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) { - set_color_background(); - continue; - } - #endif - set_pixel_color(i, color); + if (get_neo_index() < 0) { + set_pixel_color(get_neo_index(), color); + set_neo_index(-1); + } + else { + for (uint16_t i = 0; i < pixels(); ++i) { + #ifdef NEOPIXEL_BKGD_LED_INDEX + if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) { + set_color_background(); + continue; + } + #endif + set_pixel_color(i, color); + } } show(); } @@ -71,7 +78,8 @@ void Marlin_NeoPixel::set_color_startup(const uint32_t color) { } void Marlin_NeoPixel::init() { - set_brightness(NEOPIXEL_BRIGHTNESS); // 0 - 255 range + set_neo_index(-1); // -1 .. NEOPIXEL_PIXELS-1 range + set_brightness(NEOPIXEL_BRIGHTNESS); // 0 .. 255 range begin(); show(); // initialize to all off diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 1b1b74fdfebd..631e4fa00447 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -65,6 +65,7 @@ class Marlin_NeoPixel { , adaneo2 #endif ; + static int8_t neoindex; public: static void init(); @@ -72,6 +73,9 @@ class Marlin_NeoPixel { static void set_color(const uint32_t c); + FORCE_INLINE static void set_neo_index(const int8_t neoIndex) { neoindex = neoIndex; } + FORCE_INLINE static int8_t get_neo_index() { return neoindex; } + #ifdef NEOPIXEL_BKGD_LED_INDEX static void set_color_background(); #endif diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index 656b7e5f9035..a2497961ace1 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -34,6 +34,9 @@ * Always sets all 3 or 4 components. If a component is left out, set to 0. * If brightness is left out, no value changed * + * With NEOPIXEL_LED: + * I Set the Neopixel index to affect. Default: All + * * Examples: * * M150 R255 ; Turn LED red @@ -43,8 +46,12 @@ * M150 W ; Turn LED white using a white LED * M150 P127 ; Set LED 50% brightness * M150 P ; Set LED full brightness - */ + * M150 I1 R ; Set NEOPIXEL index 1 to red + */ void GcodeSuite::M150() { + #if ENABLED(NEOPIXEL_LED) + neo.set_neo_index(parser.intval('I', -1)); + #endif leds.set_color(MakeLEDColor( parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('U') ? (parser.has_value() ? parser.value_byte() : 255) : 0, From 3641972d0d4adc6198ca7489109d9b5cf92001e7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 4 Jul 2020 00:08:37 +0000 Subject: [PATCH 078/483] [cron] Bump distribution date (2020-07-04) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 2f1edf2e7cbd..c843368f9d17 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-03" + #define STRING_DISTRIBUTION_DATE "2020-07-04" #endif /** From 7ca0a7df190b46a58ba20920c175df7722ffbf7f Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Sun, 5 Jul 2020 03:11:01 +0700 Subject: [PATCH 079/483] PID Accelerated Edit (#18532) --- Marlin/src/lcd/menu/menu_advanced.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index d53a4d2495f5..b7f522f169a7 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -275,9 +275,9 @@ void menu_cancelobject(); #define __PID_BASE_MENU_ITEMS(N) \ raw_Ki = unscalePID_i(TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Ki, PID_PARAM(Ki, N))); \ raw_Kd = unscalePID_d(TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kd, PID_PARAM(Kd, N))); \ - EDIT_ITEM_N(float52sign, N, MSG_PID_P_E, &TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kp, PID_PARAM(Kp, N)), 1, 9990); \ - EDIT_ITEM_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \ - EDIT_ITEM_N(float52sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); }) + EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kp, PID_PARAM(Kp, N)), 1, 9990); \ + EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \ + EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); }) #if ENABLED(PID_EXTRUSION_SCALING) #define _PID_BASE_MENU_ITEMS(N) \ From aa40deb90192fe6c1cb77bf1e7cd697faaa4774c Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 5 Jul 2020 00:09:15 +0000 Subject: [PATCH 080/483] [cron] Bump distribution date (2020-07-05) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c843368f9d17..322392ddecaa 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-04" + #define STRING_DISTRIBUTION_DATE "2020-07-05" #endif /** From 6eb19cef115eeb2bb6930dee0a773c1c3fade2c6 Mon Sep 17 00:00:00 2001 From: notabucketofspam <43456540+notabucketofspam@users.noreply.github.com> Date: Sat, 4 Jul 2020 20:18:11 -0400 Subject: [PATCH 081/483] Fix "'ubl' not declared" error (#18541) --- Marlin/src/gcode/control/M17_M18_M84.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp index 842f301d92f9..b8dcb9802e4c 100644 --- a/Marlin/src/gcode/control/M17_M18_M84.cpp +++ b/Marlin/src/gcode/control/M17_M18_M84.cpp @@ -25,7 +25,7 @@ #include "../../lcd/ultralcd.h" #include "../../module/stepper.h" -#if BOTH(AUTO_BED_LEVELING_UBL, ULTRA_LCD) +#if ENABLED(AUTO_BED_LEVELING_UBL) #include "../../feature/bedlevel/bedlevel.h" #endif From 6df927d3b24c539edd3b7dc6e8717333678c6ff3 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 5 Jul 2020 13:04:31 +1200 Subject: [PATCH 082/483] Fix thermistors exist-for-reading tests (#18533) Co-authored-by: Scott Lahteine --- Marlin/src/module/temperature.cpp | 103 ++++++++++++------------------ 1 file changed, 41 insertions(+), 62 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1ca988e5d7fb..74af973f1947 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1804,76 +1804,55 @@ void Temperature::init() { temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) - #if THERMISTOR_HEATER_0 - #ifdef HEATER_0_MINTEMP + #define _MINMAX_TEST(N,M) (HOTENDS > N && THERMISTOR_HEATER_##N && THERMISTOR_HEATER_##N != 998 && THERMISTOR_HEATER_##N != 999 && defined(HEATER_##N##_##M##TEMP)) + + #if _MINMAX_TEST(0, MIN) _TEMP_MIN_E(0); - #endif - #ifdef HEATER_0_MAXTEMP - _TEMP_MAX_E(0); - #endif #endif - - #if HAS_MULTI_HOTEND && THERMISTOR_HEATER_1 - #ifdef HEATER_1_MINTEMP - _TEMP_MIN_E(1); - #endif - #ifdef HEATER_1_MAXTEMP - _TEMP_MAX_E(1); - #endif + #if _MINMAX_TEST(0, MAX) + _TEMP_MAX_E(0); #endif - - #if HOTENDS > 2 && THERMISTOR_HEATER_2 - #ifdef HEATER_2_MINTEMP - _TEMP_MIN_E(2); - #endif - #ifdef HEATER_2_MAXTEMP - _TEMP_MAX_E(2); - #endif + #if _MINMAX_TEST(1, MIN) + _TEMP_MIN_E(1); #endif - - #if HOTENDS > 3 && THERMISTOR_HEATER_3 - #ifdef HEATER_3_MINTEMP - _TEMP_MIN_E(3); - #endif - #ifdef HEATER_3_MAXTEMP - _TEMP_MAX_E(3); - #endif + #if _MINMAX_TEST(1, MAX) + _TEMP_MAX_E(1); #endif - - #if HOTENDS > 4 && THERMISTOR_HEATER_4 - #ifdef HEATER_4_MINTEMP - _TEMP_MIN_E(4); - #endif - #ifdef HEATER_4_MAXTEMP - _TEMP_MAX_E(4); - #endif + #if _MINMAX_TEST(2, MIN) + _TEMP_MIN_E(2); #endif - - #if HOTENDS > 5 && THERMISTOR_HEATER_5 - #ifdef HEATER_5_MINTEMP - _TEMP_MIN_E(5); - #endif - #ifdef HEATER_5_MAXTEMP - _TEMP_MAX_E(5); - #endif + #if _MINMAX_TEST(2, MAX) + _TEMP_MAX_E(2); #endif - - #if HOTENDS > 6 && THERMISTOR_HEATER_6 - #ifdef HEATER_6_MINTEMP - _TEMP_MIN_E(6); - #endif - #ifdef HEATER_6_MAXTEMP - _TEMP_MAX_E(6); - #endif + #if _MINMAX_TEST(3, MIN) + _TEMP_MIN_E(3); #endif - - #if HOTENDS > 7 && THERMISTOR_HEATER_7 - #ifdef HEATER_7_MINTEMP - _TEMP_MIN_E(7); - #endif - #ifdef HEATER_7_MAXTEMP - _TEMP_MAX_E(7); - #endif + #if _MINMAX_TEST(3, MAX) + _TEMP_MAX_E(3); + #endif + #if _MINMAX_TEST(4, MIN) + _TEMP_MIN_E(4); + #endif + #if _MINMAX_TEST(4, MAX) + _TEMP_MAX_E(4); + #endif + #if _MINMAX_TEST(5, MIN) + _TEMP_MIN_E(5); + #endif + #if _MINMAX_TEST(5, MAX) + _TEMP_MAX_E(5); + #endif + #if _MINMAX_TEST(6, MIN) + _TEMP_MIN_E(6); + #endif + #if _MINMAX_TEST(6, MAX) + _TEMP_MAX_E(6); + #endif + #if _MINMAX_TEST(7, MIN) + _TEMP_MIN_E(7); + #endif + #if _MINMAX_TEST(7, MAX) + _TEMP_MAX_E(7); #endif #endif // HAS_HOTEND From ea520e670a1c5fba9d6c587c944a787dbc09165e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 5 Jul 2020 00:59:51 -0500 Subject: [PATCH 083/483] Fix "Probing mesh point" message Closes #17770 Co-Authored-By: Jan-Gerard van der Toorn --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 99f07bc19b3e..ac991095a2bf 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -643,7 +643,7 @@ G29_TYPE GcodeSuite::G29() { // Avoid probing outside the round or hexagonal area if (TERN0(IS_KINEMATIC, !probe.can_reach(probePos))) continue; - if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", int(pt_index), "/", int(GRID_MAX_POINTS), "."); + if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", int(pt_index), "/", abl_points, "."); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(GRID_MAX_POINTS))); measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); From 67db7c02948a4b1b3b69391881157b843cf5e91f Mon Sep 17 00:00:00 2001 From: Oliver Jean Eifler Date: Sun, 5 Jul 2020 22:32:04 +0200 Subject: [PATCH 084/483] Probing points followup (#18552) --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index ac991095a2bf..dcb465f1d1e1 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -226,7 +226,7 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(AUTO_BED_LEVELING_LINEAR) ABL_VAR int abl_points; - #elif ENABLED(PROBE_MANUALLY) // Bilinear + #else int constexpr abl_points = GRID_MAX_POINTS; #endif @@ -644,7 +644,7 @@ G29_TYPE GcodeSuite::G29() { if (TERN0(IS_KINEMATIC, !probe.can_reach(probePos))) continue; if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", int(pt_index), "/", abl_points, "."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(GRID_MAX_POINTS))); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); From 81cc803ade20f61c9645ff5454486306609e65a0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 5 Jul 2020 15:41:29 -0500 Subject: [PATCH 085/483] Update actions on bugfix branch --- .github/workflows/close-stale.yml | 22 ---------------------- .github/workflows/lock-closed.yml | 18 ------------------ .github/workflows/test-builds.yml | 3 ++- 3 files changed, 2 insertions(+), 41 deletions(-) delete mode 100644 .github/workflows/close-stale.yml delete mode 100644 .github/workflows/lock-closed.yml diff --git a/.github/workflows/close-stale.yml b/.github/workflows/close-stale.yml deleted file mode 100644 index 65604afa9186..000000000000 --- a/.github/workflows/close-stale.yml +++ /dev/null @@ -1,22 +0,0 @@ -# -# close-stale.yml -# Close open issues after a period of inactivity -# - -name: "Close stale issues" - -on: - schedule: - - cron: "0 1 * * *" - -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v3 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label / comment or this will be closed in 5 days.' - days-before-stale: 30 - days-before-close: 5 - stale-issue-label: 'stale-closing-soon' diff --git a/.github/workflows/lock-closed.yml b/.github/workflows/lock-closed.yml deleted file mode 100644 index e3303e8c6e2b..000000000000 --- a/.github/workflows/lock-closed.yml +++ /dev/null @@ -1,18 +0,0 @@ -# -# lock-closed.yml -# Lock closed issues after a period of inactivity -# - -name: "Lock closed issue" - -on: - issues: - types: [closed] - -jobs: - lock: - runs-on: ubuntu-latest - steps: - - uses: OSDKDev/lock-issues@v1.1 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 017df44b201c..75c617835625 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -17,6 +17,8 @@ on: jobs: test_builds: + name: Run All Tests + if: github.repository == 'MarlinFirmware/Marlin' runs-on: ubuntu-latest @@ -103,7 +105,6 @@ jobs: - name: Run ${{ matrix.test-platform }} Tests run: | # Inline tests script - [[ "$GITHUB_REPOSITORY" == "MarlinFirmware/Marlin" ]] || exit 0 chmod +x buildroot/bin/* chmod +x buildroot/tests/* export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} From 2266a4c68a63273e40975d66d0165e3c35a085ea Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 5 Jul 2020 13:46:00 -0700 Subject: [PATCH 086/483] Add CI for pushed commits (#18549) --- .github/workflows/test-builds.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 75c617835625..dee8431e8d9f 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -14,6 +14,14 @@ on: - data/** - docs/** - '**/*.md' + push: + branches: + - bugfix-2.0.x + paths-ignore: + - config/** + - data/** + - docs/** + - '**/*.md' jobs: test_builds: From db0436cc617a73e248ea151c29086147a7695bb0 Mon Sep 17 00:00:00 2001 From: ManuelMcLure Date: Sun, 5 Jul 2020 13:47:02 -0700 Subject: [PATCH 087/483] Fix Neopixel set_color (#18544) --- Marlin/src/feature/leds/neopixel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 3d11c5b64efc..d2aa2e9fd9e6 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -53,7 +53,7 @@ Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIX #endif void Marlin_NeoPixel::set_color(const uint32_t color) { - if (get_neo_index() < 0) { + if (get_neo_index() >= 0) { set_pixel_color(get_neo_index(), color); set_neo_index(-1); } From 52a08956353088148c892e00a1f032108fa3f85e Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 5 Jul 2020 13:50:05 -0700 Subject: [PATCH 088/483] Fix stall sensitivity adjustment for FTDI screens (#18554) --- .../screens/stepper_bump_sensitivity_screen.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp index b22d1415b389..75f283feff86 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp @@ -43,12 +43,12 @@ void StepperBumpSensitivityScreen::onRedraw(draw_mode_t what) { bool StepperBumpSensitivityScreen::onTouchHeld(uint8_t tag) { const float increment = getIncrement(); switch (tag) { - case 2: UI_DECREMENT(TMCBumpSensitivity, X ); break; - case 3: UI_INCREMENT(TMCBumpSensitivity, X2 ); break; - case 4: UI_DECREMENT(TMCBumpSensitivity, Y ); break; - case 5: UI_INCREMENT(TMCBumpSensitivity, Y2 ); break; - case 6: UI_DECREMENT(TMCBumpSensitivity, Z ); break; - case 7: UI_INCREMENT(TMCBumpSensitivity, Z2 ); break; + case 2: UI_DECREMENT(TMCBumpSensitivity, X); break; + case 3: UI_INCREMENT(TMCBumpSensitivity, X); break; + case 4: UI_DECREMENT(TMCBumpSensitivity, Y); break; + case 5: UI_INCREMENT(TMCBumpSensitivity, Y); break; + case 6: UI_DECREMENT(TMCBumpSensitivity, Z); break; + case 7: UI_INCREMENT(TMCBumpSensitivity, Z); break; default: return false; } From f9b6c504dfd122d302789214aed00d118c38862b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 2 Jul 2020 20:12:48 -0500 Subject: [PATCH 089/483] Minor pins cleanup --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h | 5 ----- Marlin/src/pins/ramps/pins_RIGIDBOARD.h | 3 --- 2 files changed, 8 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h index 1ff94e93d2e8..3ec16ef48c09 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h @@ -144,31 +144,26 @@ #if AXIS_DRIVER_TYPE_X(TMC2130) #define X_CS_PIN P4_28 #undef X_ENABLE_PIN - #define X_ENABLE_PIN -1 #endif #if AXIS_DRIVER_TYPE_Y(TMC2130) #define Y_CS_PIN P2_00 #undef Y_ENABLE_PIN - #define Y_ENABLE_PIN -1 #endif #if AXIS_DRIVER_TYPE_Z(TMC2130) #define Z_CS_PIN P0_19 #undef Z_ENABLE_PIN - #define Z_ENABLE_PIN -1 #endif #if AXIS_DRIVER_TYPE_E0(TMC2130) #define E0_CS_PIN P2_12 #undef E0_ENABLE_PIN - #define E0_ENABLE_PIN -1 #endif #if AXIS_DRIVER_TYPE_E1(TMC2130) #define E1_CS_PIN P0_10 #undef E1_ENABLE_PIN - #define E1_ENABLE_PIN -1 #endif #else // !SOFTWARE_DRIVER_ENABLE diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h index 8e8428175484..f319172bbbbb 100644 --- a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h +++ b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h @@ -97,7 +97,6 @@ // Misc. Functions // #undef PS_ON_PIN -#define PS_ON_PIN -1 // // LCD / Controller @@ -120,9 +119,7 @@ // Disable encoder #undef BTN_EN1 - #define BTN_EN1 -1 #undef BTN_EN2 - #define BTN_EN2 -1 #undef SD_DETECT_PIN #define SD_DETECT_PIN 22 From 0fad9535d19001a08487d17f0e1d95d18e34b0ab Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 4 Jul 2020 16:24:31 -0500 Subject: [PATCH 090/483] Add comment to M412 --- Marlin/src/gcode/feature/runout/M412.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Marlin/src/gcode/feature/runout/M412.cpp b/Marlin/src/gcode/feature/runout/M412.cpp index f9833623c249..79e08edf9a15 100644 --- a/Marlin/src/gcode/feature/runout/M412.cpp +++ b/Marlin/src/gcode/feature/runout/M412.cpp @@ -29,6 +29,12 @@ /** * M412: Enable / Disable filament runout detection + * + * Parameters + * R : Reset the runout sensor + * S : Reset and enable/disable the runout sensor + * H : Enable/disable host handling of filament runout + * D : Extra distance to continue after runout is triggered */ void GcodeSuite::M412() { if (parser.seen("RS" From dc6d8357a681cc99e04c5980c0ac66009c173e85 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 27 Jun 2020 23:27:28 -0500 Subject: [PATCH 091/483] Reduce string duplication --- Marlin/src/MarlinCore.cpp | 1 + Marlin/src/MarlinCore.h | 1 + Marlin/src/gcode/bedlevel/G35.cpp | 14 ++++++-------- Marlin/src/gcode/config/M217.cpp | 6 +++--- Marlin/src/gcode/queue.cpp | 4 ++-- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/module/configuration_store.cpp | 12 ++++++------ Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/temperature.cpp | 4 ++-- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 06e0d228e0f7..13d624523949 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -216,6 +216,7 @@ PGMSTR(M24_STR, "M24"); PGMSTR(SP_P_STR, " P"); PGMSTR(SP_T_STR, " T"); PGMSTR(X_STR, "X"); PGMSTR(Y_STR, "Y"); PGMSTR(Z_STR, "Z"); PGMSTR(E_STR, "E"); PGMSTR(X_LBL, "X:"); PGMSTR(Y_LBL, "Y:"); PGMSTR(Z_LBL, "Z:"); PGMSTR(E_LBL, "E:"); +PGMSTR(SP_A_STR, " A"); PGMSTR(SP_B_STR, " B"); PGMSTR(SP_C_STR, " C"); PGMSTR(SP_X_STR, " X"); PGMSTR(SP_Y_STR, " Y"); PGMSTR(SP_Z_STR, " Z"); PGMSTR(SP_E_STR, " E"); PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMSTR(SP_E_LBL, " E:"); diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index 18b679aca136..254f1567aba2 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -120,5 +120,6 @@ void protected_pin_err(); #endif extern const char NUL_STR[], M112_KILL_STR[], G28_STR[], M21_STR[], M23_STR[], M24_STR[], + SP_A_STR[], SP_B_STR[], SP_C_STR[], SP_P_STR[], SP_T_STR[], SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[], X_LBL[], Y_LBL[], Z_LBL[], E_LBL[], SP_X_LBL[], SP_Y_LBL[], SP_Z_LBL[], SP_E_LBL[]; diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index f4153f372c5b..0f7c9b971223 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -127,18 +127,16 @@ void GcodeSuite::G35() { const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true); if (isnan(z_probed_height)) { - SERIAL_ECHOLNPAIR("G35 failed at point ", int(i), " (", tramming_point_name[i], ")" - " X", screws_tilt_adjust_pos[i].x, - " Y", screws_tilt_adjust_pos[i].y); + SERIAL_ECHOPAIR("G35 failed at point ", int(i), " (", tramming_point_name[i], ")"); + SERIAL_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y); err_break = true; break; } - if (DEBUGGING(LEVELING)) - DEBUG_ECHOLNPAIR("Probing point ", int(i), " (", tramming_point_name[i], ")" - " X", screws_tilt_adjust_pos[i].x, - " Y", screws_tilt_adjust_pos[i].y, - " Z", z_probed_height); + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOPAIR("Probing point ", int(i), " (", tramming_point_name[i], ")"); + SERIAL_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y, SP_Z_STR, z_probed_height); + } z_measured[i] = z_probed_height; } diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index a3a9d7b0aaa5..a87f23e3b9f9 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -39,9 +39,9 @@ void M217_report(const bool eeprom=false) { #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) serialprintPGM(eeprom ? PSTR(" M217") : PSTR("Toolchange:")); - SERIAL_ECHOPAIR(" S", LINEAR_UNIT(toolchange_settings.swap_length), - " B", LINEAR_UNIT(toolchange_settings.extra_resume)); - SERIAL_ECHOPAIR_P(SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime), + SERIAL_ECHOPAIR(" S", LINEAR_UNIT(toolchange_settings.swap_length)); + SERIAL_ECHOPAIR_P(SP_B_STR, LINEAR_UNIT(toolchange_settings.extra_resume), + SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime), SP_P_STR, LINEAR_UNIT(toolchange_settings.prime_speed)); SERIAL_ECHOPAIR(" R", LINEAR_UNIT(toolchange_settings.retract_speed), " U", LINEAR_UNIT(toolchange_settings.unretract_speed), diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index d87166d979df..330f0513efdf 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -289,8 +289,8 @@ void GCodeQueue::ok_to_send() { while (NUMERIC_SIGNED(*p)) SERIAL_ECHO(*p++); } - SERIAL_ECHOPAIR_P(SP_P_STR, int(planner.moves_free())); - SERIAL_ECHOPAIR(" B", int(BUFSIZE - length)); + SERIAL_ECHOPAIR_P(SP_P_STR, int(planner.moves_free()), + SP_B_STR, int(BUFSIZE - length)); #endif SERIAL_EOL(); } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index cb95205514a8..6521c95c6206 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -336,7 +336,7 @@ namespace Language_en { PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Settings Stored"); PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Media Update"); PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reset Printer"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info Screen"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepare"); PROGMEM Language_Str MSG_TUNE = _UxGT("Tune"); diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 8ff873111413..0915c0451a10 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -3163,16 +3163,16 @@ void MarlinSettings::reset() { CONFIG_ECHO_HEADING("Material heatup parameters:"); LOOP_L_N(i, PREHEAT_COUNT) { CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR( - " M145 S", (int)i + SERIAL_ECHOLNPAIR_P( + PSTR(" M145 S"), (int)i #if HAS_HOTEND - , " H", TEMP_UNIT(ui.material_preset[i].hotend_temp) + , PSTR(" H"), TEMP_UNIT(ui.material_preset[i].hotend_temp) #endif #if HAS_HEATED_BED - , " B", TEMP_UNIT(ui.material_preset[i].bed_temp) + , SP_B_STR, TEMP_UNIT(ui.material_preset[i].bed_temp) #endif #if HAS_FAN - , " F", ui.material_preset[i].fan_speed + , PSTR(" F"), ui.material_preset[i].fan_speed #endif ); } @@ -3198,7 +3198,7 @@ void MarlinSettings::reset() { , PSTR(" D"), unscalePID_d(PID_PARAM(Kd, e)) ); #if ENABLED(PID_EXTRUSION_SCALING) - SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, e)); + SERIAL_ECHOPAIR_P(SP_C_STR, PID_PARAM(Kc, e)); if (e == 0) SERIAL_ECHOPAIR(" L", thermalManager.lpq_len); #endif #if ENABLED(PID_FAN_SCALING) diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 84293936ea6b..1f80b7fe722a 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -122,7 +122,7 @@ void recalc_delta_settings() { #define DELTA_DEBUG(VAR) do { \ SERIAL_ECHOLNPAIR_P(PSTR("Cartesian X"), VAR.x, SP_Y_STR, VAR.y, SP_Z_STR, VAR.z); \ - SERIAL_ECHOLNPAIR("Delta A", delta.a, " B", delta.b, " C", delta.c); \ + SERIAL_ECHOLNPAIR_P(PSTR("Delta A"), delta.a, SP_B_STR, delta.b, SP_C_STR, delta.c); \ }while(0) void inverse_kinematics(const xyz_pos_t &raw) { diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 74af973f1947..6746595ffea7 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1281,8 +1281,8 @@ void Temperature::manage_heater() { SERIAL_ECHOPAIR_F(" R", t.series_res, 1); SERIAL_ECHOPAIR_F_P(SP_T_STR, t.res_25, 1); - SERIAL_ECHOPAIR_F(" B", t.beta, 1); - SERIAL_ECHOPAIR_F(" C", t.sh_c_coeff, 9); + SERIAL_ECHOPAIR_F_P(SP_B_STR, t.beta, 1); + SERIAL_ECHOPAIR_F_P(SP_C_STR, t.sh_c_coeff, 9); SERIAL_ECHOPGM(" ; "); serialprintPGM( TERN_(HEATER_0_USER_THERMISTOR, t_index == CTI_HOTEND_0 ? PSTR("HOTEND 0") :) From c8f7aceb20fb861b486b17710001c6cdbc05c3db Mon Sep 17 00:00:00 2001 From: GhostlyCrowd Date: Sun, 5 Jul 2020 17:05:47 -0400 Subject: [PATCH 092/483] STM32: No compile-time check for PWM_PIN (#18539) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/STM32/fastio.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h index c17901fa99dd..030b369ede32 100644 --- a/Marlin/src/HAL/STM32/fastio.h +++ b/Marlin/src/HAL/STM32/fastio.h @@ -81,6 +81,7 @@ void FastIO_init(); // Must be called before using fast io macros #define IS_OUTPUT(IO) #define PWM_PIN(P) digitalPinHasPWM(P) +#define NO_COMPILE_TIME_PWM // digitalRead/Write wrappers #define extDigitalRead(IO) digitalRead(IO) From c02451b602d6ee24d09f4f41269c85c0972a2279 Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Mon, 6 Jul 2020 05:42:19 +0700 Subject: [PATCH 093/483] Filament Runout Inverting => State (#18537) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 2 +- Marlin/src/feature/mmu2/mmu2.cpp | 2 +- Marlin/src/feature/runout.h | 2 +- Marlin/src/gcode/feature/pause/M600.cpp | 2 +- Marlin/src/inc/SanityCheck.h | 11 +++++++++++ .../screens/endstop_state_screen.cpp | 4 ++-- Marlin/src/module/endstops.cpp | 4 ++-- 7 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 68039e7cab67..ffa31a8d7227 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1167,7 +1167,7 @@ //#define FILAMENT_RUNOUT_SENSOR #if ENABLED(FILAMENT_RUNOUT_SENSOR) #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. - #define FIL_RUNOUT_INVERTING false // Set to true to invert the logic of the sensor. + #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index 2ddfd72647f6..e082d847da22 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -161,7 +161,7 @@ uint8_t MMU2::get_current_tool() { } #if EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) - #define FILAMENT_PRESENT() (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_INVERTING) + #define FILAMENT_PRESENT() (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE) #endif void MMU2::mmu_loop() { diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index ad96d495c296..d27629d9a7d9 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -148,7 +148,7 @@ class FilamentSensorBase { // Return a bitmask of runout flag states (1 bits always indicates runout) static inline uint8_t poll_runout_states() { - return poll_runout_pins() ^ uint8_t(TERN(FIL_RUNOUT_INVERTING, 0, _BV(NUM_RUNOUT_SENSORS) - 1)); + return poll_runout_pins() ^ uint8_t(TERN(FIL_RUNOUT_STATE, 0, _BV(NUM_RUNOUT_SENSORS) - 1)); } }; diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 815fb8078dfe..844dfba3d0a4 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -84,7 +84,7 @@ void GcodeSuite::M600() { // In this case, for duplicating modes set DXC_ext to the extruder that ran out. #if HAS_FILAMENT_SENSOR && NUM_RUNOUT_SENSORS > 1 if (dxc_is_duplicating()) - DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING) ? 1 : 0; + DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_STATE) ? 1 : 0; #else DXC_ext = active_extruder; #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 87caa23a8067..ba624d061c4f 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -513,6 +513,17 @@ #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." #endif +#ifdef FIL_RUNOUT_INVERTING + #if FIL_RUNOUT_INVERTING + #warning "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update Configuration.h." + #else + #warning "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW. Please update Configuration.h." + #endif + #ifndef FIL_RUNOUT_STATE + #define FIL_RUNOUT_STATE ((FIL_RUNOUT_INVERTING) ? HIGH : LOW) + #endif +#endif + /** * Probe temp compensation requirements */ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp index a20e11b31dbb..fff0337f3173 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -92,12 +92,12 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { PIN_DISABLED(5, 3, PSTR(STR_Z_MIN), Z_MIN) #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT) - PIN_ENABLED (1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT, FIL_RUNOUT_INVERTING) + PIN_ENABLED (1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT, FIL_RUNOUT_STATE) #else PIN_DISABLED(1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT) #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) && EXTRUDERS > 1 - PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT_INVERTING) + PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT_STATE) #else PIN_DISABLED(3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2) #endif diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 47d63df64b70..9cf283ccba4c 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -459,7 +459,7 @@ void _O2 Endstops::report_states() { #endif #if HAS_FILAMENT_SENSOR #if NUM_RUNOUT_SENSORS == 1 - print_es_state(READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_INVERTING, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); + print_es_state(READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); #else #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; break; LOOP_S_LE_N(i, 1, NUM_RUNOUT_SENSORS) { @@ -470,7 +470,7 @@ void _O2 Endstops::report_states() { } SERIAL_ECHOPGM(STR_FILAMENT_RUNOUT_SENSOR); if (i > 1) SERIAL_CHAR(' ', '0' + i); - print_es_state(extDigitalRead(pin) != FIL_RUNOUT_INVERTING); + print_es_state(extDigitalRead(pin) != FIL_RUNOUT_STATE); } #undef _CASE_RUNOUT #endif From a6b8b12a6a001a25dc73e8ab08f71e357ea58e48 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 5 Jul 2020 18:00:37 -0500 Subject: [PATCH 094/483] Simplify home_z_safely, respect HOME_AFTER_DEACTIVATE --- Marlin/src/core/language.h | 1 - Marlin/src/gcode/calibrate/G28.cpp | 9 ++------- Marlin/src/lcd/language/language_an.h | 1 - Marlin/src/lcd/language/language_ca.h | 1 - Marlin/src/lcd/language/language_cz.h | 1 - Marlin/src/lcd/language/language_da.h | 1 - Marlin/src/lcd/language/language_de.h | 1 - Marlin/src/lcd/language/language_en.h | 1 - Marlin/src/lcd/language/language_es.h | 1 - Marlin/src/lcd/language/language_eu.h | 1 - Marlin/src/lcd/language/language_fr.h | 1 - Marlin/src/lcd/language/language_gl.h | 1 - Marlin/src/lcd/language/language_hu.h | 1 - Marlin/src/lcd/language/language_it.h | 1 - Marlin/src/lcd/language/language_jp_kana.h | 1 - Marlin/src/lcd/language/language_nl.h | 1 - Marlin/src/lcd/language/language_pl.h | 1 - Marlin/src/lcd/language/language_pt_br.h | 1 - Marlin/src/lcd/language/language_ro.h | 1 - Marlin/src/lcd/language/language_ru.h | 3 +-- Marlin/src/lcd/language/language_sk.h | 1 - Marlin/src/lcd/language/language_tr.h | 1 - Marlin/src/lcd/language/language_uk.h | 5 ++--- Marlin/src/lcd/language/language_vi.h | 1 - Marlin/src/lcd/language/language_zh_CN.h | 1 - Marlin/src/lcd/language/language_zh_TW.h | 1 - 26 files changed, 5 insertions(+), 35 deletions(-) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index ce4bfa18dfbc..77e0b792c12c 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -205,7 +205,6 @@ #define STR_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" #define STR_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented" #define STR_ERR_HOTEND_TOO_COLD "Hotend too cold" -#define STR_ERR_Z_HOMING_SER "Home XY first" #define STR_ERR_EEPROM_WRITE "Error writing to EEPROM!" #define STR_FILAMENT_CHANGE_HEAT_LCD "Press button to heat nozzle" diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 806a8d50d678..b97caa96e3e8 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -115,13 +115,8 @@ #if ENABLED(Z_SAFE_HOMING) inline void home_z_safely() { - - // Disallow Z homing if X or Y are unknown - if (!TEST(axis_known_position, X_AXIS) || !TEST(axis_known_position, Y_AXIS)) { - LCD_MESSAGEPGM(MSG_ERR_Z_HOMING); - SERIAL_ECHO_MSG(STR_ERR_Z_HOMING_SER); - return; - } + // Disallow Z homing if X or Y homing is needed + if (axis_unhomed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("home_z_safely >>>"); diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index fb2a2277b754..89c36f754ffb 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -165,7 +165,6 @@ namespace Language_an { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Error de temperatura"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Error: Temp Max"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Error: Temp Min"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY first"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA ATURADA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Per favor reinic."); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index 70966ca4cdf0..93a0af243ec1 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -156,7 +156,6 @@ namespace Language_ca { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MAXIMA"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY primer"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESSORA PARADA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reinicieu"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 3e852249886f..a46b4affda8e 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -413,7 +413,6 @@ namespace Language_cz { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("NÃZ. TEPL. PODL."); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP KOMORA"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP KOMORA"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Domů XY první"); PROGMEM Language_Str MSG_HALTED = _UxGT("TISK. ZASTAVENA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("ProveÄte reset"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index 0ecb583e8008..d8c63447d82d 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -141,7 +141,6 @@ namespace Language_da { PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Fejl: Min temp"); PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Fejl: Maks Plade temp"); PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Fejl: Min Plade temp"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY først"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER STOPPET"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reset Venligst"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // Kun et bogstav diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index b472eaf8571d..f2cb0cf3f3e2 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -404,7 +404,6 @@ namespace Language_de { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err:Gehäuse max Temp"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err:Gehäuse min Temp"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Vorher XY homen"); PROGMEM Language_Str MSG_HALTED = _UxGT("DRUCKER GESTOPPT"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Bitte neustarten"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("t"); // One character only diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 6521c95c6206..788bc230bfb8 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -455,7 +455,6 @@ namespace Language_en { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: MINTEMP BED"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP CHAMBER"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP CHAMBER"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY First"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Please Reset"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index c95fd09f1013..e1d7562d000d 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -424,7 +424,6 @@ namespace Language_es { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err:TEMP. MIN CAMA"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err:TEMP. MÃX CÃMARA"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err:TEMP. MIN CÃMARA"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Origen XY Primero"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA DETENIDA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Por favor, reinicie"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index ed065559b624..428d282d38d3 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -243,7 +243,6 @@ namespace Language_eu { PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Tenp Minimoa"); PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: Ohe Tenp Max"); PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: Ohe Tenp Min"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Etxera XY lehenengo"); PROGMEM Language_Str MSG_HALTED = _UxGT("INPRIMA. GELDIRIK"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Berrabia. Mesedez"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index f303bf93dcb9..bb6c9269e2ca 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -399,7 +399,6 @@ namespace Language_fr { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Err THERMIQUE"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err TEMP. MAX"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err TEMP. MIN"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Origine XY Premier"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPR. STOPPÉE"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Redémarrer SVP"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index e819d9075f78..097efeb35ad1 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -446,7 +446,6 @@ namespace Language_gl { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Erro:TEMP MÃN CAMA"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Erro:TEMP MÃX CÃMARA"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Erro:TEMP MÃN CÃMARA"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Orixe XY Primeiro"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA DETIDA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Debe reiniciar!"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index da647de1bcbf..3d2101b824f7 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -448,7 +448,6 @@ namespace Language_hu { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Hiba: MIN ÃGY HÖFOK"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Hiba: MAX KAMRA HÖFOK"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Hiba: MIN KAMRA HÖFOK"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("XY Kezdöpont"); PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEFAGYOTT"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Indítsd újra!"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // Csak egy karakter diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 0f06d862c164..76e76355fda4 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -453,7 +453,6 @@ namespace Language_it { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: TEMP MIN PIATTO"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: TEMP MAX CAMERA"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: TEMP MIN CAMERA"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY prima"); PROGMEM Language_Str MSG_HALTED = _UxGT("STAMPANTE FERMATA"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Riavviare prego"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("g"); // Un solo carattere diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index f6d4ede51fdd..084d8b4831ee 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -183,7 +183,6 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("エラー:サイテイオンミマン"); // "Err: MINTEMP" PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("エラー:ベッド サイコウオンãƒãƒ§ã‚¦ã‚«"); // "Err: MAXTEMP BED" PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("エラー:ベッド サイテイオンミマン"); // "Err: MINTEMP BED" - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("サキニ XY ヲフッキサセテクダサイ"); // "Home XY first" PROGMEM Language_Str MSG_HALTED = _UxGT("プリンターãƒãƒ†ã‚¤ã‚·ã‚·ãƒžã‚·ã‚¿"); // "PRINTER HALTED" PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("リセットシテクダサイ"); // "Please reset" PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index 9bc88cffb89d..9911f73eadf0 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -163,7 +163,6 @@ namespace Language_nl { PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Min. temp"); PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Err: Max.tmp bed"); PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: Min.tmp bed"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY Eerst"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER GESTOPT"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reset A.U.B."); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only. Keep English standard diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 4fb2df6eec64..b1da41bc6169 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -394,7 +394,6 @@ namespace Language_pl { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("BÅ‚Ä…d: MINTEMP STÓÅ"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("BÅ‚Ä…d: MAXTEMP KOMORA"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("BÅ‚Ä…d: MINTEMP KOMORA"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Najpierw Home XY"); PROGMEM Language_Str MSG_HALTED = _UxGT("Drukarka zatrzym."); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("ProszÄ™ zresetować"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index f3faf2aac360..bf4b8343035f 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -360,7 +360,6 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Erro:Temp Mesa Mín"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Erro:Temp Câmara Máx"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Erro:Temp Câmara Min"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY Primeiro"); PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESSORA PAROU"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Favor resetar"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 643589f1bddd..da9a159a3f87 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -451,7 +451,6 @@ namespace Language_ro { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Err: MINTEMP BED"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Err: MAXTEMP CHAMBER"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Err: MINTEMP CHAMBER"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Home XY First"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Please Reset"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 229e8199375a..77e309fdaedd 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -413,7 +413,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Готово"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Ðазад"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Продолжить"); - + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Пауза печати"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Продолжить печать"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("ОÑтановить печать"); @@ -536,7 +536,6 @@ namespace Language_ru { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Ошибка: Т Ñтола мин."); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Ошибка:Т камеры макÑ"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Ошибка:Т камеры мин."); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Паркуй XY Ñначала"); PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИÐТЕР ОСТÐÐОВЛЕÐ"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Сделайте ÑброÑ"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index a505b2e0ea8b..0a251f1548a5 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -439,7 +439,6 @@ namespace Language_sk { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Chyba: MINTEMP PODL."); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Chyba: MAXTEMP KOMO."); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Chyba: MINTEMP KOMO."); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Najskôr os XY domov"); PROGMEM Language_Str MSG_HALTED = _UxGT("TLAÄŒIAREŇ ZASTAVENÃ"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("ReÅ¡tartuje ju"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index aa68ece99210..8776eee8f40a 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -423,7 +423,6 @@ namespace Language_tr { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Hata: MIN.SIC. TABLA"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("Hata: MAX.SIC ODA"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("Hata: MIN.SIC ODA"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Önce XY Sıfırla"); PROGMEM Language_Str MSG_HALTED = _UxGT("YAZICI DURDURULDU"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Lütfen Resetleyin"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("G"); // One character only diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 2572d1b0ae11..2751a640bbf7 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -148,7 +148,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("Друге Ñопло X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("Друге Ñопло Y"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("Друге Ñопло Z"); - + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("ВиконуєтьÑÑ G29"); PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("ІнÑтрументи UBL"); PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ UBL"); @@ -533,7 +533,6 @@ namespace Language_uk { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE _UxGT(" СТОЛУ"); PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("ПЕРЕГРІВ КÐМЕРИ"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("МІÐІМÐЛЬÐРТ") LCD_STR_DEGREE _UxGT(" КÐМЕРИ"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Першим дім по XY"); PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИÐТЕР ЗУПИÐЕÐО"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Перезавантажте"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only @@ -651,7 +650,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Помилка паркуваннÑ"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Помилка зондуваннÑ"); PROGMEM Language_Str MSG_M600_TOO_COLD = _UxGT("M600: низька Т") LCD_STR_DEGREE; - + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ОБЕРІТЬ ПРУТОК"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ MMU"); PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Понови прошивку MMU!"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 8538c81831b5..4450e9852023 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -335,7 +335,6 @@ namespace Language_vi { PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Äiều sai: nhiệt Ä‘á»™ tối thiểu"); // Err: MINTEMP PROGMEM Language_Str MSG_ERR_MAXTEMP_BED = _UxGT("Äiều sai: nhiệt Ä‘á»™ bàn tối Ä‘a"); // Err: MAXTEMP BED PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("Äiều sai: nhiệt Ä‘á»™ bàn tối thiểu"); // Err: MINTEMP BED - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("Vá» nhà XY TrÆ°Æ¡Íc"); // Home XY First PROGMEM Language_Str MSG_HALTED = _UxGT("MÃY IN Äà DỪNG LAÌ£I"); // PRINTER HALTED PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Xin bặt lại"); // Please reset PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index fc9ae67818da..34452275400f 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -444,7 +444,6 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("错误:最低热床温度"); //"Err: MINTEMP BED" PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("错误:最高机箱温度"); PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("错误:最低机箱温度"); - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("å½’ä½ XY å…ˆ"); // "Home XY First" PROGMEM Language_Str MSG_HALTED = _UxGT("打å°åœæœº"); //"PRINTER HALTED" PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("请é‡ç½®"); //"Please reset" PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("天"); //"d" // One character only diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 1019fcb03ac8..793890e3001b 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -391,7 +391,6 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_ERR_MINTEMP_BED = _UxGT("錯誤:最低熱床溫度"); //"Err: MINTEMP BED" PROGMEM Language_Str MSG_ERR_MAXTEMP_CHAMBER = _UxGT("錯誤:最高機箱溫度"); //"Err: MAXTEMP CHAMBER" PROGMEM Language_Str MSG_ERR_MINTEMP_CHAMBER = _UxGT("錯誤:最低機箱溫度"); //"Err: MINTEMP CHAMBER" - PROGMEM Language_Str MSG_ERR_Z_HOMING = _UxGT("æ­¸ä½ XY å…ˆ"); //"Home XY First" PROGMEM Language_Str MSG_HALTED = _UxGT("å°è¡¨æ©Ÿåœæ©Ÿ"); //"PRINTER HALTED" PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("è«‹é‡ç½®"); //"Please reset" PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("天"); //"d" // One character only From 62c00aac2c7c28c395c7eb9aae15cc56fc9a9eea Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 6 Jul 2020 00:08:44 +0000 Subject: [PATCH 095/483] [cron] Bump distribution date (2020-07-06) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 322392ddecaa..fba59c7c99e3 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-05" + #define STRING_DISTRIBUTION_DATE "2020-07-06" #endif /** From e48489482c78c9f16786405794ea3a1c4476271c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 5 Jul 2020 23:14:12 -0500 Subject: [PATCH 096/483] Filament state followup --- Marlin/src/feature/runout.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index d27629d9a7d9..3cba6f828e6a 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -148,7 +148,11 @@ class FilamentSensorBase { // Return a bitmask of runout flag states (1 bits always indicates runout) static inline uint8_t poll_runout_states() { - return poll_runout_pins() ^ uint8_t(TERN(FIL_RUNOUT_STATE, 0, _BV(NUM_RUNOUT_SENSORS) - 1)); + return poll_runout_pins() + #if FIL_RUNOUT_STATE == LOW + ^ uint8_t(_BV(NUM_RUNOUT_SENSORS) - 1) + #endif + ; } }; From 9f5b8c9bbc9fcabfcbab8a0a2e4de2b7be361da3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 6 Jul 2020 00:11:21 -0500 Subject: [PATCH 097/483] Get SAMD51 CXX flags from script --- platformio.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index a54221c7c2ef..2c0df405a2fc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -266,7 +266,8 @@ build_flags = ${common_DUE_archim.build_flags} -funwind-tables -mpoke-function [env:SAMD51_grandcentral_m4] platform = atmelsam board = adafruit_grandcentral_m4 -build_flags = ${common.build_flags} -std=gnu++17 -Wno-register +build_flags = ${common.build_flags} -std=gnu++17 +extra_scripts = ${common.extra_scripts} build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} From 764fc81761a539827518adee094f700889f84918 Mon Sep 17 00:00:00 2001 From: Luc Hoang Long Date: Mon, 6 Jul 2020 13:17:40 +0700 Subject: [PATCH 098/483] Use Material Preset 1 for PID autotune (#18446) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/temp/M303.cpp | 14 +++----------- Marlin/src/lcd/menu/menu_advanced.cpp | 13 +++---------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 7e049436bb49..31d16faff411 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -60,16 +60,8 @@ void GcodeSuite::M303() { } #endif - #if ENABLED(PIDTEMPBED) - #define SI H_BED - #else - #define SI H_E0 - #endif - #if ENABLED(PIDTEMP) - #define EI HOTENDS - 1 - #else - #define EI H_BED - #endif + #define SI TERN(PIDTEMPBED, H_BED, H_E0) + #define EI TERN(PIDTEMP, HOTENDS - 1, H_BED) const heater_ind_t e = (heater_ind_t)parser.intval('E'); if (!WITHIN(e, SI, EI)) { SERIAL_ECHOLNPGM(STR_PID_BAD_EXTRUDER_NUM); @@ -79,7 +71,7 @@ void GcodeSuite::M303() { const int c = parser.intval('C', 5); const bool u = parser.boolval('U'); - const int16_t temp = parser.celsiusval('S', e < 0 ? 70 : 150); + const int16_t temp = parser.celsiusval('S', e < 0 ? PREHEAT_1_TEMP_BED : PREHEAT_1_TEMP_HOTEND); #if DISABLED(BUSY_WHILE_HEATING) KEEPALIVE_STATE(NOT_BUSY); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b7f522f169a7..cee5e6e33f09 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -169,17 +169,10 @@ void menu_cancelobject(); #if ENABLED(PID_AUTOTUNE_MENU) #if ENABLED(PIDTEMP) - #ifdef PREHEAT_1_TEMP_HOTEND - #define PID_TUNE_TEMP PREHEAT_1_TEMP_HOTEND - #else - #define PID_TUNE_TEMP 200 - #endif - int16_t autotune_temp[HOTENDS] = ARRAY_BY_HOTENDS1(PID_TUNE_TEMP); - #undef PID_TUNE_TEMP + int16_t autotune_temp[HOTENDS] = ARRAY_BY_HOTENDS1(PREHEAT_1_TEMP_HOTEND); #endif - #if ENABLED(PIDTEMPBED) - int16_t autotune_temp_bed = 70; + int16_t autotune_temp_bed = PREHEAT_1_TEMP_BED; #endif #include "../../gcode/queue.h" @@ -324,7 +317,7 @@ void menu_cancelobject(); #ifndef BED_OVERSHOOT #define BED_OVERSHOOT 5 #endif - EDIT_ITEM_FAST_N(int3, -1, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, 70, BED_MAXTEMP - BED_OVERSHOOT, []{ _lcd_autotune(-1); }); + EDIT_ITEM_FAST_N(int3, -1, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAXTEMP - BED_OVERSHOOT, []{ _lcd_autotune(-1); }); #endif #endif From af8be58d9287c7c49d68bb5319ca2dd262042351 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 5 Jul 2020 23:18:49 -0700 Subject: [PATCH 099/483] Fix broken POWER_LOSS_RECOVERY prompt (#18557) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/LPC1768/main.cpp | 4 ++-- Marlin/src/HAL/STM32F1/HAL.cpp | 4 ++-- Marlin/src/HAL/STM32F1/onboard_sd.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 6 +----- Marlin/src/sd/cardreader.cpp | 2 +- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index 335792ec45df..bce3fc3092aa 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -122,7 +122,7 @@ void HAL_init() { delay(1000); // Give OS time to notice USB_Connect(TRUE); - #if !BOTH(SHARED_SD_CARD, INIT_SDCARD_ON_BOOT) && DISABLED(NO_SD_HOST_DRIVE) + #if DISABLED(NO_SD_HOST_DRIVE) MSC_SD_Init(0); // Enable USB SD card access #endif @@ -140,7 +140,7 @@ void HAL_init() { // HAL idle task void HAL_idletask() { - #if ENABLED(SHARED_SD_CARD) + #if HAS_SHARED_MEDIA // If Marlin is using the SD card we need to lock it to prevent access from // a PC via USB. // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 202d3bd5be4e..3a000e76b301 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -258,7 +258,7 @@ void HAL_init() { // HAL idle task void HAL_idletask() { #ifdef USE_USB_COMPOSITE - #if ENABLED(SHARED_SD_CARD) + #if HAS_SHARED_MEDIA // If Marlin is using the SD card we need to lock it to prevent access from // a PC via USB. // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but @@ -266,7 +266,7 @@ void HAL_idletask() { // the disk if Marlin has it mounted. Unfortunately there is currently no way // to unmount the disk from the LCD menu. // if (IS_SD_PRINTING() || IS_SD_FILE_OPEN()) - /* copy from lpc1768 framework, should be fixed later for process SHARED_SD_CARD*/ + /* copy from lpc1768 framework, should be fixed later for process HAS_SHARED_MEDIA*/ #endif // process USB mass storage device class loop MarlinMSC.loop(); diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.cpp b/Marlin/src/HAL/STM32F1/onboard_sd.cpp index f1fbdc08d82f..099e2a06869f 100644 --- a/Marlin/src/HAL/STM32F1/onboard_sd.cpp +++ b/Marlin/src/HAL/STM32F1/onboard_sd.cpp @@ -20,7 +20,7 @@ #include "SPI.h" #include "fastio.h" -#if ENABLED(SHARED_SD_CARD) +#if HAS_SHARED_MEDIA #ifndef ON_BOARD_SPI_DEVICE #define ON_BOARD_SPI_DEVICE SPI_DEVICE #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 8eaa02b5e54b..04af5e40c94f 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -353,11 +353,7 @@ // mount/unmount the card and refresh it. So we disable card detect. // #undef SD_DETECT_PIN - #define SHARED_SD_CARD - #endif - - #if DISABLED(SHARED_SD_CARD) - #define INIT_SDCARD_ON_BOOT + #define HAS_SHARED_MEDIA 1 #endif #if PIN_EXISTS(SD_DETECT) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 53ba537311af..beac76531c8d 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -389,7 +389,7 @@ void CardReader::mount() { #endif void CardReader::manage_media() { - static uint8_t prev_stat = TERN(INIT_SDCARD_ON_BOOT, 2, 0); + static uint8_t prev_stat = 2; // First call, no prior state uint8_t stat = uint8_t(IS_SD_INSERTED()); if (stat == prev_stat) return; From 6f14d2d37fbd4c294401243dd2575df1fee9c2bc Mon Sep 17 00:00:00 2001 From: "J.C. Nelson" <32139633+xC0000005@users.noreply.github.com> Date: Mon, 6 Jul 2020 15:08:52 -0700 Subject: [PATCH 100/483] Add Lerdge S,X,K (#18302) --- .github/workflows/test-builds.yml | 1 + Marlin/src/core/boards.h | 11 +- Marlin/src/module/temperature.cpp | 10 +- Marlin/src/pins/pins.h | 4 +- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 95 ++-- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 208 +++++++++ Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 81 ++-- Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp | 12 +- .../usb_flashdrive/lib-uhs2/confdescparser.h | 14 +- .../sd/usb_flashdrive/lib-uhs2/masstorage.cpp | 8 +- .../sd/usb_flashdrive/lib-uhs2/masstorage.h | 4 +- .../sd/usb_flashdrive/lib-uhs2/message.cpp | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h | 8 +- .../UHS_BULK_STORAGE/UHS_BULK_STORAGE.h | 2 +- .../UHS_BULK_STORAGE_INLINE.h | 2 +- .../lib-uhs3/UHS_host/UHS_host_INLINE.h | 30 +- .../lib-uhs3/UHS_host/UHS_usb_ch9.h | 8 +- .../lib-uhs3/UHS_host/UHS_usbhost.h | 4 +- buildroot/share/PlatformIO/boards/LERDGE.json | 64 +++ .../share/PlatformIO/ldscripts/lerdge.ld | 186 ++++++++ .../copy_marlin_variant_to_framework.py | 47 ++ buildroot/share/PlatformIO/scripts/lerdge.py | 46 ++ .../PlatformIO/scripts/stm32_bootloader.py | 30 ++ .../variants/LERDGE/PeripheralPins.c | 418 ++++++++++++++++++ .../PlatformIO/variants/LERDGE/PinNamesVar.h | 50 +++ .../PlatformIO/variants/LERDGE/variant.cpp | 297 +++++++++++++ .../PlatformIO/variants/LERDGE/variant.h | 238 ++++++++++ buildroot/tests/LERDGEX-tests | 18 + platformio.ini | 40 ++ 29 files changed, 1778 insertions(+), 160 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_LERDGE_S.h create mode 100644 buildroot/share/PlatformIO/boards/LERDGE.json create mode 100644 buildroot/share/PlatformIO/ldscripts/lerdge.ld create mode 100644 buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py create mode 100644 buildroot/share/PlatformIO/scripts/lerdge.py create mode 100644 buildroot/share/PlatformIO/scripts/stm32_bootloader.py create mode 100644 buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/LERDGE/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/LERDGE/variant.h create mode 100644 buildroot/tests/LERDGEX-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index dee8431e8d9f..e47cfa83950f 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -76,6 +76,7 @@ jobs: - rumba32 - mks_robin_pro - STM32F103RET6_creality + - LERDGEX # Put lengthy tests last diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index b3d5f91bde15..e2c3c888f73f 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -337,11 +337,12 @@ #define BOARD_BTT_BTT002_V1_0 4211 // BigTreeTech BTT002 v1.0 (STM32F407VG) #define BOARD_BTT_GTR_V1_0 4212 // BigTreeTech GTR v1.0 (STM32F407IGT) #define BOARD_LERDGE_K 4213 // Lerdge K (STM32F407ZG) -#define BOARD_LERDGE_X 4214 // Lerdge X (STM32F407VE) -#define BOARD_VAKE403D 4215 // VAkE 403D (STM32F446VET6) -#define BOARD_FYSETC_S6 4216 // FYSETC S6 board -#define BOARD_FLYF407ZG 4217 // FLYF407ZG board (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_LERDGE_S 4214 // Lerdge S (STM32F407VE) +#define BOARD_LERDGE_X 4215 // Lerdge X (STM32F407VE) +#define BOARD_VAKE403D 4216 // VAkE 403D (STM32F446VET6) +#define BOARD_FYSETC_S6 4217 // FYSETC S6 board +#define BOARD_FLYF407ZG 4218 // FLYF407ZG board (STM32F407ZG) +#define BOARD_MKS_ROBIN2 4219 // MKS_ROBIN2 (STM32F407ZE) // // ARM Cortex M7 diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 6746595ffea7..1afe5c4e4ecf 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1598,12 +1598,20 @@ void Temperature::init() { #if MB(RUMBA) // Disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector #define _AD(N) ANY(HEATER_##N##_USES_AD595, HEATER_##N##_USES_AD8495) - #if _AD(0) || _AD(1) || _AD(2) || _AD(BED) || _AD(CHAMBER) + #if _AD(0) || _AD(1) || _AD(2) || _AD(BED) || _AD(CHAMBER) MCUCR = _BV(JTD); MCUCR = _BV(JTD); #endif #endif + // Thermistor activation by MCU pin + #if PIN_EXISTS(TEMP_0_TR_ENABLE_PIN) + OUT_WRITE(TEMP_0_TR_ENABLE_PIN, ENABLED(HEATER_0_USES_MAX6675)); + #endif + #if PIN_EXISTS(TEMP_1_TR_ENABLE_PIN) + OUT_WRITE(TEMP_1_TR_ENABLE_PIN, ENABLED(HEATER_1_USES_MAX6675)); + #endif + #if BOTH(PIDTEMP, PID_EXTRUSION_SCALING) last_e_position = 0; #endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 6b06bda88719..f81f8f42f23a 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -586,8 +586,10 @@ #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 #elif MB(LERDGE_K) #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:STM32F4 +#elif MB(LERDGE_S) + #include "stm32f4/pins_LERDGE_S.h" // STM32F4 env:LERDGE_S #elif MB(LERDGE_X) - #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:STM32F4 + #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGE_X #elif MB(VAKE403D) #include "stm32f4/pins_VAKE403D.h" // STM32F4 env:STM32F4 #elif MB(FYSETC_S6) diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 35ad324b58a2..2146c4a5287e 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -29,13 +29,10 @@ #define I2C_EEPROM -// Ignore temp readings during develpment. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - // // Servos // -//#define SERVO0_PIN PD12 +//#define SERVO0_PIN PB11 // // Limit Switches @@ -48,14 +45,14 @@ // Z Probe (when not Z_MIN_PIN) // //#ifndef Z_MIN_PROBE_PIN -// #define Z_MIN_PROBE_PIN PB15 +// #define Z_MIN_PROBE_PIN PG6 //#endif // // Filament runout // -#define FIL_RUNOUT_PIN PE6 -#define FIL_RUNOUT2_PIN PE7 +#define FIL_RUNOUT_PIN PE5 +#define FIL_RUNOUT2_PIN PE6 // // Steppers @@ -64,35 +61,35 @@ #define X_DIR_PIN PB10 #define X_ENABLE_PIN PG0 //#ifndef X_CS_PIN -// #define X_CS_PIN PE0 +// #define X_CS_PIN PE0 //#endif #define Y_STEP_PIN PF14 #define Y_DIR_PIN PF15 #define Y_ENABLE_PIN PF13 //#ifndef Y_CS_PIN -// #define Y_CS_PIN PE1 +// #define Y_CS_PIN PE1 //#endif #define Z_STEP_PIN PF11 #define Z_DIR_PIN PF12 #define Z_ENABLE_PIN PC5 //#ifndef Z_CS_PIN -// #define Z_CS_PIN PE2 +// #define Z_CS_PIN PE2 //#endif #define E0_STEP_PIN PC14 #define E0_DIR_PIN PC13 #define E0_ENABLE_PIN PC15 //#ifndef E0_CS_PIN -// #define E0_CS_PIN PE3 +// #define E0_CS_PIN PE3 //#endif #define E1_STEP_PIN PF1 #define E1_DIR_PIN PF0 #define E1_ENABLE_PIN PF2 //#ifndef E1_CS_PIN -// #define E1_CS_PIN PE4 +// #define E1_CS_PIN PE4 //#endif // @@ -102,6 +99,12 @@ #define TEMP_1_PIN PC2 // Analog Input #define TEMP_BED_PIN PC0 // Analog Input +// Lergde-K can choose thermocouple/thermistor mode in software. +// For use with thermistors, these pins must be OUT/LOW. +// This is done automatically. +#define TEMP_0_TR_ENABLE_PIN PF10 +#define TEMP_1_TR_ENABLE_PIN PF9 + // // Heaters / Fans // @@ -110,10 +113,10 @@ #define HEATER_BED_PIN PA2 #ifndef FAN_PIN - #define FAN_PIN PC15 + #define FAN_PIN PF7 #endif #define FAN1_PIN PF6 -#define FAN2_PIN PF7 +#define FAN2_PIN PF8 #ifndef E0_AUTO_FAN_PIN #define E0_AUTO_FAN_PIN PF6 @@ -125,12 +128,15 @@ //#define CASE_LIGHT_PIN_CI -1 //#define CASE_LIGHT_PIN_DO -1 //#define NEOPIXEL_PIN -1 - -// -// Prusa i3 MK2 Multi-Material Multiplexer Support -// -//#define E_MUX0_PIN -1 -//#define E_MUX1_PIN -1 +#ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PB7 +#endif +#ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB8 +#endif +#ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB9 +#endif // // SD support @@ -141,45 +147,34 @@ // Misc. Functions // #define SDSS PC11 -#define LED_PIN PC7 // Alive +#define LED_PIN PA15 // Alive #define PS_ON_PIN -1 #define KILL_PIN -1 -#define POWER_LOSS_PIN -1 // Power-loss / nAC_FAULT +#define POWER_LOSS_PIN PA4 // Power-loss / nAC_FAULT #define SCK_PIN PC12 #define MISO_PIN PC8 #define MOSI_PIN PD2 #define SS_PIN PC11 +#define SD_DETECT_PIN PA8 +#define BEEPER_PIN PC7 + // // LCD / Controller // -// TODO: Replace these with the correct FSMC pins, once known -#define SD_DETECT_PIN -1 -#define BEEPER_PIN PD12 -#define LCD_PINS_RS -1 -#define LCD_PINS_ENABLE -1 -#define LCD_PINS_D4 -1 -#define LCD_PINS_D5 -1 -#define LCD_PINS_D6 -1 -#define LCD_PINS_D7 -1 - -#define BTN_EN1 PE3 -#define BTN_EN2 PE4 -#define BTN_ENC PE2 - -// -// ST7920 Delays -// -#if HAS_GRAPHICAL_LCD - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) - #endif -#endif +#define TFT_RESET_PIN PD6 +#define TFT_BACKLIGHT_PIN PD3 + +#define TFT_CS_PIN PD7 +#define TFT_RS_PIN PD11 + +#define TOUCH_CS_PIN PG15 +#define TOUCH_SCK_PIN PB3 +#define TOUCH_MOSI_PIN PB5 +#define TOUCH_MISO_PIN PB4 + +#define BTN_EN1 PG10 +#define BTN_EN2 PG11 +#define BTN_ENC PG9 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h new file mode 100644 index 000000000000..258cd697fe7c --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -0,0 +1,208 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if !defined(STM32F4) && !defined(STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "LERDGE S supports up to 2 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "Lerdge S" +#define DEFAULT_MACHINE_NAME "LERDGE" + +#define STEP_TIMER 4 +#define TEMP_TIMER 2 + +//#define I2C_EEPROM + +// +// Servos +// +#define SERVO0_PIN PD12 //confirmed +//#define SERVO1_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN PG9 //confirmed +#define Y_MIN_PIN PG10 //confirmed +#define Z_MIN_PIN PG11 //confirmed + +#define X_MAX_PIN PG12 //confirmed +#define Y_MAX_PIN PG13 //confirmed +#define Z_MAX_PIN PG14 //confirmed + +// +// Filament runout +// +#define FIL_RUNOUT_PIN PC5 //confirmed + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PG8 //confirmed +#endif + +// +// Steppers +// +#define X_STEP_PIN PF7 //confirmed +#define X_DIR_PIN PF8 //confirmed +#define X_ENABLE_PIN PF6 //confirmed + +#define Y_STEP_PIN PF10 //confirmed +#define Y_DIR_PIN PF11 //confirmed +#define Y_ENABLE_PIN PF9 //confirmed + +#define Z_STEP_PIN PF13 //confirmed +#define Z_DIR_PIN PF14 //confirmed +#define Z_ENABLE_PIN PF12 //confirmed + +#define E0_STEP_PIN PG0 //confirmed +#define E0_DIR_PIN PG1 //confirmed +#define E0_ENABLE_PIN PF15 //confirmed + +#define E1_STEP_PIN PG3 //confirmed +#define E1_DIR_PIN PG4 //confirmed +#define E1_ENABLE_PIN PG2 //confirmed + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC0 // See below for activation of thermistor readings +#define TEMP_1_PIN PC1 // See below for activation of thermistor readings +#define TEMP_BED_PIN PC3 //confirmed + +// Lergde-S can choose thermocouple/thermistor mode in software. +// For use with thermistors, these pins must be OUT/LOW. +// This is done automatically. +#define TEMP_0_TR_ENABLE_PIN PF3 +#define TEMP_1_TR_ENABLE_PIN PF4 + +// MAX6675 Cold-Junction-Compensated K-Thermocouple to Digital Converter (0°C to +1024°C) +// https://datasheets.maximintegrated.com/en/ds/MAX6675.pdf + +#define MAX6675_SCK_PIN PB3 // max6675 datasheet: SCK pin, found with multimeter, not tested +#define MAX6675_DO_PIN PB4 // max6675 datasheet: SO pin, found with multimeter, not tested +#define MAX6675_SS_PIN PC4 // max6675 datasheet: /CS pin, found with multimeter, not tested and likely wrong + +// Expansion board with second max6675 +// Warning: Some boards leave the slot unpopulated. + +//#define MAX6675_SCK2_PIN PB3 // max6675 datasheet: SCK pin, found with multimeter, not tested +//#define MAX6675_DO2_PIN PB4 // max6675 datasheet: SO pin, found with multimeter, not tested +//#define MAX6675_SS2_PIN PF1 // max6675 datasheet: /CS pin, found with multimeter, not tested + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA0 //confirmed +#define HEATER_1_PIN PA1 //confirmed +#define HEATER_BED_PIN PA3 //confirmed + +#define FAN_PIN PA15 // heater 0 fan 1 //confirmed +#define FAN1_PIN PB10 // heater 1 fan 2 //confirmed +#define FAN2_PIN PF5 // heater 0 fan 2 and heater 1 fan 1 (two sockets, switched together) //confirmed + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PF5 +#endif + +// +// Prusa i3 MK2 Multi Material Multiplexer Support +// +//#define E_MUX0_PIN -1 +//#define E_MUX1_PIN -1 + +// +// LED / Lighting +// +//Lerdge-S board has two LED connectors (this is the one on the mainboard) +#define CASE_LIGHT_PIN PC7 //confirmed + +//on the dual extrusion addon board is a RGB connector +#define RGB_LED_R_PIN PC7 // Shared with the mainboard LED light connector (CASE_LIGHT_PIN), confirmed +#define RGB_LED_G_PIN PB0 //confirmed +#define RGB_LED_B_PIN PB1 //confirmed + +// +// Misc. Functions +// +#define SDSS PC11 // SD is working using SDIO, not sure if this definition is needed? +#define LED_PIN PC6 // Mainboard soldered green LED, confirmed +#define PS_ON_PIN PB2 // Board has a power module connector, confirmed +#define KILL_PIN -1 // There is no reset button on the LCD +#define POWER_LOSS_PIN -1 // PB2 could be used for this as well + +// +// SD support +// +#define SDIO_SUPPORT + +#define SCK_PIN PC12 //confirmed working +#define MISO_PIN PC8 //confirmed working +#define MOSI_PIN PD2 //confirmed working +#define SS_PIN PC11 //confirmed working + +#define SD_DETECT_PIN PG15 //confirmed + +// +// Persistent Storage +// If no option is selected below the SD Card will be used +// (this section modelled after pins_LONGER3D_LK.h) +// Warning: Not tested yet! Pins traced with multimeter, mistakes are possible +//#define SPI_EEPROM + +#if ENABLED(SPI_EEPROM) + // Lerdge has an SPI EEPROM Winbond W25Q128 (128Mbits) https://www.pjrc.com/teensy/W25Q128FV.pdf + #define SPI_CHAN_EEPROM1 1 + #define SPI_EEPROM1_CS PB12 // datasheet: /CS pin, found with multimeter, not tested + #define EEPROM_SCK PB13 // datasheet: CLK pin, found with multimeter, not tested + #define EEPROM_MISO PB14 // datasheet: DO pin, found with multimeter, not tested + #define EEPROM_MOSI PB15 // datasheet: DI pin, found with multimeter, not tested + #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) + #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64KB for now... +#else + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM +#endif + +// +// LCD / Controller +// + +// The LCD is initialized in FSMC mode +#define BEEPER_PIN PD13 //confirmed + +#define BTN_EN1 PC14 //confirmed +#define BTN_EN2 PC15 //confirmed +#define BTN_ENC PC13 //confirmed + +#define TFT_RESET_PIN PD6 //confirmed +#define TFT_BACKLIGHT_PIN PD3 //confirmed + +#define TFT_CS_PIN PD7 // TFT works +#define TFT_RS_PIN PD11 // TFT works + +// There is touch, but calibration is off +#define TOUCH_CS_PIN PB6 +#define TOUCH_SCK_PIN PB3 +#define TOUCH_MOSI_PIN PB5 +#define TOUCH_MISO_PIN PB4 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 04588bee253e..a9efe102102b 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -20,20 +20,22 @@ #if !defined(STM32F4) && !defined(STM32F4xx) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "LERDGE X supports up to 2 hotends / E-steppers." +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "LERDGE X supports only one hotend / E-steppers" #endif #define BOARD_INFO_NAME "Lerdge X" #define DEFAULT_MACHINE_NAME "LERDGE" -//#define I2C_EEPROM +#define STEP_TIMER 4 +#define TEMP_TIMER 2 + +#define I2C_EEPROM // // Servos // -//#define SERVO0_PIN PD12 -//#define SERVO1_PIN -1 +//#define SERVO0_PIN PD13 // // Limit Switches @@ -51,7 +53,7 @@ // Z Probe (when not Z_MIN_PIN) // //#ifndef Z_MIN_PROBE_PIN -// #define Z_MIN_PROBE_PIN PB15 +// #define Z_MIN_PROBE_PIN PB15 //#endif // @@ -60,37 +62,18 @@ #define X_STEP_PIN PB10 #define X_DIR_PIN PB2 #define X_ENABLE_PIN PB11 -//#ifndef X_CS_PIN -// #define X_CS_PIN PD1 -//#endif #define Y_STEP_PIN PB0 #define Y_DIR_PIN PC5 #define Y_ENABLE_PIN PB1 -//#ifndef Y_CS_PIN -// #define Y_CS_PIN PE12 -//#endif #define Z_STEP_PIN PA7 #define Z_DIR_PIN PA6 #define Z_ENABLE_PIN PC4 -//#ifndef Z_CS_PIN -// #define Z_CS_PIN PD5 -//#endif #define E0_STEP_PIN PA4 #define E0_DIR_PIN PA3 #define E0_ENABLE_PIN PA5 -//#ifndef E0_CS_PIN -// #define E0_CS_PIN PB4 -//#endif - -#define E1_STEP_PIN -1 -#define E1_DIR_PIN -1 -#define E1_ENABLE_PIN -1 -//#ifndef E1_CS_PIN -// #define E1_CS_PIN PE5 -//#endif // // Temperature Sensors @@ -106,9 +89,9 @@ #define HEATER_1_PIN -1 #define HEATER_BED_PIN PA2 -#ifndef FAN_PIN - //#define FAN_PIN PC15 -#endif +//#ifndef FAN_PIN +// #define FAN_PIN PC15 +//#endif #define FAN1_PIN PC15 #define FAN2_PIN PA0 @@ -116,12 +99,6 @@ #define E0_AUTO_FAN_PIN PC15 // FAN1_PIN #endif -// -// Prusa i3 MK2 Multi Material Multiplexer Support -// -//#define E_MUX0_PIN -1 -//#define E_MUX1_PIN -1 - // // LED / Lighting // @@ -136,7 +113,9 @@ #define LED_PIN PC7 // Alive #define PS_ON_PIN -1 #define KILL_PIN -1 -#define POWER_LOSS_PIN -1 // Power-loss / nAC_FAULT + +// Lerdge supports auto-power off and power loss sense through a single pin. +#define POWER_LOSS_PIN PC14 // Power-loss / nAC_FAULT #define SCK_PIN PC12 #define MISO_PIN PC8 @@ -147,36 +126,26 @@ // SD support // #define SDIO_SUPPORT +#define SD_DETECT_PIN PA8 // // LCD / Controller // // The LCD is initialized in FSMC mode -#define SD_DETECT_PIN -1 #define BEEPER_PIN PD12 #define BTN_EN1 PE3 #define BTN_EN2 PE4 #define BTN_ENC PE2 -#define LCD_RESET_PIN PD6 -#define LCD_BACKLIGHT_PIN PD3 -#define FSMC_CS_PIN PD4 -#define FSMC_RS_PIN PD11 -#define TOUCH_CS PB6 - -// -// ST7920 Delays -// -#if HAS_GRAPHICAL_LCD - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) - #endif -#endif +#define TFT_RESET_PIN PD6 +#define TFT_BACKLIGHT_PIN PD3 + +#define TFT_CS_PIN PD7 +#define TFT_RS_PIN PD11 + +#define TOUCH_CS_PIN PB6 +#define TOUCH_SCK_PIN PB3 +#define TOUCH_MOSI_PIN PB5 +#define TOUCH_MISO_PIN PB4 diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp index 5601446f8108..9092633b844f 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp @@ -428,7 +428,7 @@ void USB::Task() { //USB state machine uint8_t rcode; uint8_t tmpdata; static uint32_t delay = 0; - //USB_FD_DEVICE_DESCRIPTOR buf; + //USB_DEVICE_DESCRIPTOR buf; bool lowspeed = false; MAX3421E::Task(); @@ -647,8 +647,8 @@ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { //printf("Configuring: parent = %i, port = %i\r\n", parent, port); uint8_t devConfigIndex; uint8_t rcode = 0; - uint8_t buf[sizeof (USB_FD_DEVICE_DESCRIPTOR)]; - USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); + uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)]; + USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); UsbDevice *p = nullptr; EpInfo *oldep_ptr = nullptr; EpInfo epInfo; @@ -678,13 +678,13 @@ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { p->lowspeed = lowspeed; // Get device descriptor - rcode = getDevDescr(0, 0, sizeof (USB_FD_DEVICE_DESCRIPTOR), (uint8_t*)buf); + rcode = getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Restore p->epinfo p->epinfo = oldep_ptr; if (rcode) { - //printf("Configuring error: Can't get USB_FD_DEVICE_DESCRIPTOR\r\n"); + //printf("Configuring error: Can't get USB_DEVICE_DESCRIPTOR\r\n"); return rcode; } @@ -762,7 +762,7 @@ uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t con uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) { const uint8_t bufSize = 64; uint8_t buf[bufSize]; - USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); + USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); uint8_t ret = getConfDescr(addr, ep, 9, conf, buf); if (ret) return ret; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h index 10478eb6441d..5d4ddaf175c9 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h @@ -30,10 +30,10 @@ class UsbConfigXtracter { public: - //virtual void ConfigXtract(const USB_FD_CONFIGURATION_DESCRIPTOR *conf) = 0; - //virtual void InterfaceXtract(uint8_t conf, const USB_FD_INTERFACE_DESCRIPTOR *iface) = 0; + //virtual void ConfigXtract(const USB_CONFIGURATION_DESCRIPTOR *conf) = 0; + //virtual void InterfaceXtract(uint8_t conf, const USB_INTERFACE_DESCRIPTOR *iface) = 0; - virtual void EndpointXtract(uint8_t conf __attribute__((unused)), uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_FD_ENDPOINT_DESCRIPTOR *ep __attribute__((unused))) { + virtual void EndpointXtract(uint8_t conf __attribute__((unused)), uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *ep __attribute__((unused))) { } }; @@ -50,7 +50,7 @@ class ConfigDescParser : public USBReadParser { MultiValueBuffer theBuffer; MultiByteValueParser valParser; ByteSkipper theSkipper; - uint8_t varBuffer[16 /*sizeof(USB_FD_CONFIGURATION_DESCRIPTOR)*/]; + uint8_t varBuffer[16 /*sizeof(USB_CONFIGURATION_DESCRIPTOR)*/]; uint8_t stateParseDescr; // ParseDescriptor state @@ -97,8 +97,8 @@ void ConfigDescParser::Parse(const uin compare masks for them. When the match is found, calls EndpointXtract passing buffer containing endpoint descriptor */ template bool ConfigDescParser::ParseDescriptor(uint8_t **pp, uint16_t *pcntdn) { - USB_FD_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast(varBuffer); - USB_FD_INTERFACE_DESCRIPTOR* uid = reinterpret_cast(varBuffer); + USB_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast(varBuffer); + USB_INTERFACE_DESCRIPTOR* uid = reinterpret_cast(varBuffer); switch (stateParseDescr) { case 0: theBuffer.valueSize = 2; @@ -155,7 +155,7 @@ bool ConfigDescParser::ParseDescriptor case USB_DESCRIPTOR_ENDPOINT: if (!valParser.Parse(pp, pcntdn)) return false; if (isGoodInterface && theXtractor) - theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_FD_ENDPOINT_DESCRIPTOR*)varBuffer); + theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_ENDPOINT_DESCRIPTOR*)varBuffer); break; //case HID_DESCRIPTOR_HID: // if (!valParser.Parse(pp, pcntdn)) return false; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp index 2512e3846c63..a57245f78a70 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp @@ -250,10 +250,10 @@ bLastUsbError(0) { */ uint8_t BulkOnly::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) { - const uint8_t constBufSize = sizeof (USB_FD_DEVICE_DESCRIPTOR); + const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR); uint8_t buf[constBufSize]; - USB_FD_DEVICE_DESCRIPTOR * udd = reinterpret_cast(buf); + USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast(buf); uint8_t rcode; UsbDevice *p = nullptr; EpInfo *oldep_ptr = nullptr; @@ -529,7 +529,7 @@ uint8_t BulkOnly::Init(uint8_t parent __attribute__((unused)), uint8_t port __at * @param proto * @param pep */ -void BulkOnly::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto __attribute__((unused)), const USB_FD_ENDPOINT_DESCRIPTOR * pep) { +void BulkOnly::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR * pep) { ErrorMessage (PSTR("Conf.Val"), conf); ErrorMessage (PSTR("Iface Num"), iface); ErrorMessage (PSTR("Alt.Set"), alt); @@ -1166,7 +1166,7 @@ uint8_t BulkOnly::HandleSCSIError(uint8_t status) { * * @param ep_ptr */ -void BulkOnly::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) { +void BulkOnly::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR * ep_ptr) { Notify(PSTR("Endpoint descriptor:"), 0x80); Notify(PSTR("\r\nLength:\t\t"), 0x80); D_PrintHex (ep_ptr->bLength, 0x80); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h index 960651ff2fc2..09b82fdb92d4 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h @@ -491,7 +491,7 @@ class BulkOnly : public USBDeviceConfig, public UsbConfigXtracter { uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]; // Sector size, clipped to 16 bits bool LUNOk[MASS_MAX_SUPPORTED_LUN]; // use this to check for media changes. bool WriteOk[MASS_MAX_SUPPORTED_LUN]; - void PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR* ep_ptr); + void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr); // Additional Initialization Method for Subclasses @@ -526,7 +526,7 @@ class BulkOnly : public USBDeviceConfig, public UsbConfigXtracter { virtual uint8_t GetAddress() { return bAddress; } // UsbConfigXtracter implementation - void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_FD_ENDPOINT_DESCRIPTOR *ep); + void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep); virtual bool DEVCLASSOK(uint8_t klass) { return klass == USB_CLASS_MASS_STORAGE; } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp index 0ab58b91f3ed..78a9ba1fd71d 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp @@ -37,7 +37,7 @@ int UsbDEBUGlvl = 0x80; void E_Notifyc(char c, int lvl) { if (UsbDEBUGlvl < lvl) return; USB_HOST_SERIAL.print(c - #if !defined(ARDUINO) && !defined(ARDUINO_ARCH_LPC176X) + #if !defined(ARDUINO) || ARDUINO < 100 , BYTE #endif ); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h index a08d58b23169..039215b1bbcf 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h @@ -116,7 +116,7 @@ typedef struct { uint8_t iProduct; // Index of String Descriptor describing the product. uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number. uint8_t bNumConfigurations; // Number of possible configurations. -} __attribute__((packed)) USB_FD_DEVICE_DESCRIPTOR; +} __attribute__((packed)) USB_DEVICE_DESCRIPTOR; /* Configuration descriptor structure */ typedef struct { @@ -128,7 +128,7 @@ typedef struct { uint8_t iConfiguration; // Index of String Descriptor describing the configuration. uint8_t bmAttributes; // Configuration characteristics. uint8_t bMaxPower; // Maximum power consumed by this configuration. -} __attribute__((packed)) USB_FD_CONFIGURATION_DESCRIPTOR; +} __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR; /* Interface descriptor structure */ typedef struct { @@ -141,7 +141,7 @@ typedef struct { uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF). uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. uint8_t iInterface; // Index of String Descriptor describing the interface. -} __attribute__((packed)) USB_FD_INTERFACE_DESCRIPTOR; +} __attribute__((packed)) USB_INTERFACE_DESCRIPTOR; /* Endpoint descriptor structure */ typedef struct { @@ -151,7 +151,7 @@ typedef struct { uint8_t bmAttributes; // Endpoint transfer type. uint16_t wMaxPacketSize; // Maximum packet size. uint8_t bInterval; // Polling interval in frames. -} __attribute__((packed)) USB_FD_ENDPOINT_DESCRIPTOR; +} __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR; /* HID descriptor */ typedef struct { diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h index 26ed852a279e..6ad9cb5c8dc3 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h @@ -174,7 +174,7 @@ class UHS_Bulk_Storage : public UHS_USBInterface { volatile uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]; // Sector size, clipped to 16 bits volatile bool LUNOk[MASS_MAX_SUPPORTED_LUN]; // use this to check for media changes. volatile bool WriteOk[MASS_MAX_SUPPORTED_LUN]; - void PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR* ep_ptr); + void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr); public: UHS_Bulk_Storage(UHS_USB_HOST_BASE *p); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h index 6ad9cff7f086..a171b13818ca 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h @@ -1188,7 +1188,7 @@ uint8_t UHS_NI UHS_Bulk_Storage::HandleSCSIError(uint8_t status) { * * @param ep_ptr */ -void UHS_NI UHS_Bulk_Storage::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) { +void UHS_NI UHS_Bulk_Storage::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR * ep_ptr) { Notify(PSTR("Endpoint descriptor:"), 0x80); Notify(PSTR("\r\nLength:\t\t"), 0x80); D_PrintHex (ep_ptr->bLength, 0x80); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index eb96c7eb5d5d..908391a157f1 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -239,12 +239,12 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe // wrap in {} to throw away the 64 byte buffer when we are done with it { uint8_t buf[biggest]; - USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); + USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); #else const uint8_t biggest = 18; uint8_t buf[biggest]; - USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); - USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); + USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); + USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); #endif //for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { @@ -309,7 +309,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe sof_delay(200); goto again; } - HOST_DEBUG("Configuring error: 0x%2.2x Can't get USB_FD_DEVICE_DESCRIPTOR\r\n", rcode); + HOST_DEBUG("Configuring error: 0x%2.2x Can't get USB_DEVICE_DESCRIPTOR\r\n", rcode); return rcode; } @@ -378,7 +378,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe } // unwrapped, old large buf now invalid and discarded. uint8_t buf[18]; - USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); + USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); #endif ei.address = addrPool.AllocAddress(parent, IsHub(ei.klass), port); @@ -415,9 +415,9 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe HOST_DEBUG("configs: %i\r\n", configs); for(uint8_t conf = 0; (!rcode) && (conf < configs); conf++) { // read the config descriptor into a buffer. - rcode = getConfDescr(ei.address, sizeof (USB_FD_CONFIGURATION_DESCRIPTOR), conf, buf); + rcode = getConfDescr(ei.address, sizeof (USB_CONFIGURATION_DESCRIPTOR), conf, buf); if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR\r\n", rcode); rcode = UHS_HOST_ERROR_FailGetConfDescr; continue; } @@ -438,7 +438,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe uint8_t offset; rcode = initDescrStream(&ei, ucd, pep, data, &left, &read, &offset); if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode); break; } for(; (numinf) && (!rcode); inf++) { @@ -451,7 +451,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe break; } if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't close USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't close USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode); continue; } rcode = TestInterface(&ei); @@ -471,9 +471,9 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe if(!bestsuccess) rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED; } if(!rcode) { - rcode = getConfDescr(ei.address, sizeof (USB_FD_CONFIGURATION_DESCRIPTOR), bestconf, buf); + rcode = getConfDescr(ei.address, sizeof (USB_CONFIGURATION_DESCRIPTOR), bestconf, buf); if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR\r\n", rcode); rcode = UHS_HOST_ERROR_FailGetConfDescr; } } @@ -497,7 +497,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe uint8_t offset; rcode = initDescrStream(&ei, ucd, pep, data, &left, &read, &offset); if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode); } else { for(; (numinf) && (!rcode); inf++) { // iterate for each interface on this config @@ -508,7 +508,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe break; } if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't close USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't close USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode); continue; } @@ -721,7 +721,7 @@ uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytes * @param offset * @return zero for success or error code */ -uint8_t UHS_USB_HOST_BASE::initDescrStream(ENUMERATION_INFO *ei, USB_FD_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset) { +uint8_t UHS_USB_HOST_BASE::initDescrStream(ENUMERATION_INFO *ei, USB_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset) { if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT; if(!pep) return UHS_HOST_ERROR_NULL_EPINFO; *left = ucd->wTotalLength; @@ -837,7 +837,7 @@ uint8_t UHS_USB_HOST_BASE::getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pe return rcode; } -uint8_t UHS_USB_HOST_BASE::seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_FD_CONFIGURATION_DESCRIPTOR *ucd) { +uint8_t UHS_USB_HOST_BASE::seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_CONFIGURATION_DESCRIPTOR *ucd) { if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT; uint8_t data[ei->bMaxPacketSize0]; UHS_EpInfo *pep; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h index 9d945d69c52b..34b8ad72e7ef 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h @@ -164,7 +164,7 @@ typedef struct { uint8_t iProduct; // Index of String Descriptor describing the product. uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number. uint8_t bNumConfigurations; // Number of possible configurations. -} __attribute__((packed)) USB_FD_DEVICE_DESCRIPTOR; +} __attribute__((packed)) USB_DEVICE_DESCRIPTOR; /* Configuration descriptor structure */ typedef struct { @@ -176,7 +176,7 @@ typedef struct { uint8_t iConfiguration; // Index of String Descriptor describing the configuration. uint8_t bmAttributes; // Configuration characteristics. uint8_t bMaxPower; // Maximum power consumed by this configuration. -} __attribute__((packed)) USB_FD_CONFIGURATION_DESCRIPTOR; +} __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR; /* Interface descriptor structure */ typedef struct { @@ -189,7 +189,7 @@ typedef struct { uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF). uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. uint8_t iInterface; // Index of String Descriptor describing the interface. -} __attribute__((packed)) USB_FD_INTERFACE_DESCRIPTOR; +} __attribute__((packed)) USB_INTERFACE_DESCRIPTOR; /* Endpoint descriptor structure */ typedef struct { @@ -199,7 +199,7 @@ typedef struct { uint8_t bmAttributes; // Endpoint transfer type. uint16_t wMaxPacketSize; // Maximum packet size. uint8_t bInterval; // Polling interval in frames. -} __attribute__((packed)) USB_FD_ENDPOINT_DESCRIPTOR; +} __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR; /* HID descriptor */ /* diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h index c19574b4af1c..9a6b110a156b 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h @@ -207,7 +207,7 @@ class UHS_USB_HOST_BASE { interrupts(); } - uint8_t UHS_NI seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_FD_CONFIGURATION_DESCRIPTOR *ucd); + uint8_t UHS_NI seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_CONFIGURATION_DESCRIPTOR *ucd); uint8_t UHS_NI setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t epcount, volatile UHS_EpInfo* eprecord_ptr); @@ -261,7 +261,7 @@ class UHS_USB_HOST_BASE { uint8_t TestInterface(ENUMERATION_INFO *ei); uint8_t enumerateInterface(ENUMERATION_INFO *ei); uint8_t getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset); - uint8_t initDescrStream(ENUMERATION_INFO *ei, USB_FD_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset); + uint8_t initDescrStream(ENUMERATION_INFO *ei, USB_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset); uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data); uint8_t doSoftReset(uint8_t parent, uint8_t port, uint8_t address); diff --git a/buildroot/share/PlatformIO/boards/LERDGE.json b/buildroot/share/PlatformIO/boards/LERDGE.json new file mode 100644 index 000000000000..b3e4ca44fa90 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/LERDGE.json @@ -0,0 +1,64 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F407xx", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f407zgt6", + "variant": "LERDGE" + }, + "debug": { + "jlink_device": "STM32F407ZG", + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd", + "tools": { + "stlink": { + "server": { + "arguments": [ + "-f", + "scripts/interface/stlink.cfg", + "-c", + "transport select hla_swd", + "-f", + "scripts/target/stm32f4x.cfg", + "-c", + "reset_config none" + ], + "executable": "bin/openocd", + "package": "tool-openocd" + } + } + } + }, + "frameworks": [ + "arduino", + "stm32cube" + ], + "name": "STM32F407ZGT6(192k RAM. 1024k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 196608, + "maximum_size": 1048576, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "http://www.st.com/en/microcontrollers/stm32f407ZG.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/ldscripts/lerdge.ld b/buildroot/share/PlatformIO/ldscripts/lerdge.ld new file mode 100644 index 000000000000..aa0b1dd9cb36 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/lerdge.ld @@ -0,0 +1,186 @@ +/* +***************************************************************************** +** +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F407VGTx Device with +** 1024KByte FLASH, 128KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +** (c)Copyright Ac6. +** You may use this file as-is or modify it according to the needs of your +** project. Distribution of this file (unmodified or modified) is not +** permitted. Ac6 permit registered System Workbench for MCU users the +** rights to distribute the assembled, compiled & linked contents of this +** file as part of an application binary file, provided that it is built +** using the System Workbench for MCU toolchain. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200;; /* required amount of heap */ +_Min_Stack_Size = 0x400;; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text ALIGN(4): + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata ALIGN(4): + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py new file mode 100644 index 000000000000..c27019990fc5 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -0,0 +1,47 @@ +import os,shutil +from SCons.Script import DefaultEnvironment +from platformio import util + +def copytree(src, dst, symlinks=False, ignore=None): + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(dst, item) + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) + +env = DefaultEnvironment() +platform = env.PioPlatform() +board = env.BoardConfig() +variant = board.get("build.variant") +variant_dir = ' +'; +src_filter = env.get("SRC_FILTER") +print("Starting SRC Filter:", env.get("SRC_FILTER")) +src_filter_value = src_filter[0]; + +src_filter_value = src_filter_value + variant_dir +src_filter[0] = src_filter_value; +env["SRC_FILTER"] = src_filter + +print("Modified SRC Filter:", env.get("SRC_FILTER")) + +cxx_flags = env['CXXFLAGS'] +print("CXXFLAGS", cxx_flags) + +FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32") +assert os.path.isdir(FRAMEWORK_DIR) +assert os.path.isdir("buildroot/share/PlatformIO/variants") + +variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) + +source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) +assert os.path.isdir(source_dir) + +if os.path.isdir(variant_dir): + shutil.rmtree(variant_dir) + +if not os.path.isdir(variant_dir): + os.mkdir(variant_dir) + +copytree(source_dir, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/lerdge.py b/buildroot/share/PlatformIO/scripts/lerdge.py new file mode 100644 index 000000000000..fd934a127866 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/lerdge.py @@ -0,0 +1,46 @@ +import os,sys +Import("env") + +from SCons.Script import DefaultEnvironment +board = DefaultEnvironment().BoardConfig() + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/lerdge.ld") +for i, flag in enumerate(env["LINKFLAGS"]): + if "-Wl,-T" in flag: + env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script + elif flag == "-T": + env["LINKFLAGS"][i + 1] = custom_ld_script + +def encryptByte(byte): + byte = 0xFF & ((byte << 6) | (byte >> 2)) + i = 0x58 + byte + j = 0x05 + byte + (i >> 8) + byte = (0xF8 & i) | (0x07 & j) + return byte + +def encrypt_file(input, output_file, file_length): + input_file = bytearray(input.read()) + for i in range(len(input_file)): + result = encryptByte(input_file[i]) + input_file[i] = result + + output_file.write(input_file) + return + +# Encrypt ${PROGNAME}.bin and save it as build.firmware +def encrypt(source, target, env): + print("Encrypting to:", board.get("build.firmware")) + firmware = open(target[0].path, "rb") + result = open(target[0].dir.path + "/" + board.get("build.firmware"), "wb") + length = os.path.getsize(target[0].path) + + encrypt_file(firmware, result, length) + + firmware.close() + result.close() + +if 'firmware' in board.get("build").keys(): + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +else: + print("You need to define output file via board_build.firmware = 'filename' parameter") + exit(1); diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py new file mode 100644 index 000000000000..d517f1c8d1aa --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py @@ -0,0 +1,30 @@ +import os,sys,shutil +Import("env") + +from SCons.Script import DefaultEnvironment +board = DefaultEnvironment().BoardConfig() + +def noencrypt(source, target, env): + firmware = os.path.join(target[0].dir.path, board.get("build.firmware")) + # do not overwrite encrypted firmware if present + if not os.path.isfile(firmware): + shutil.copy(target[0].path, firmware) + +if 'offset' in board.get("build").keys(): + LD_FLASH_OFFSET = board.get("build.offset") + + for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_OFFSET": + env['CPPDEFINES'].remove(define) + env['CPPDEFINES'].append(("VECT_TAB_OFFSET", LD_FLASH_OFFSET)) + + maximum_ram_size = board.get("upload.maximum_ram_size") + + for i, flag in enumerate(env["LINKFLAGS"]): + if "-Wl,--defsym=LD_FLASH_OFFSET" in flag: + env["LINKFLAGS"][i] = "-Wl,--defsym=LD_FLASH_OFFSET=" + LD_FLASH_OFFSET + if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: + env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) + + if 'firmware' in board.get("build").keys(): + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt); diff --git a/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c new file mode 100644 index 000000000000..8cb0776ffad1 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c @@ -0,0 +1,418 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + * Automatically generated from STM32F407Z(E-G)Tx.xml + */ +#include +#include + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + //{PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + //{PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + //{PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + //{PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + //{PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + //{PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + //{PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + //{PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 + //{PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SCL[] = { + {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +const PinMap PinMap_PWM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_TX[] = { + {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_RX[] = { + {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {NC, NP, 0} +}; +#endif + +//*** ETHERNET *** + +#ifdef HAL_ETH_MODULE_ENABLED +const PinMap PinMap_Ethernet[] = { + {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS + {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK + {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO + {PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL + {PA_7, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS_DV|ETH_RX_DV + {PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 + {PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 + {PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + {PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + {PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER + {PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + {PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + {PB_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + {PC_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDC + {PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 + {PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK + {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 + {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 + {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + {NC, NP, 0} +}; +#endif + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +const PinMap PinMap_USB_OTG_FS[] = { + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; +#endif + +#ifdef HAL_PCD_MODULE_ENABLED +const PinMap PinMap_USB_OTG_HS[] = { +#ifdef USE_USB_HS_IN_FS + {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP +#else + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT +#endif /* USE_USB_HS_IN_FS */ + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h new file mode 100644 index 000000000000..b4bb9d45f8ac --- /dev/null +++ b/buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h @@ -0,0 +1,50 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_SOF = PA_8, + USB_OTG_FS_VBUS = PA_9, + USB_OTG_FS_ID = PA_10, + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, + USB_OTG_HS_ULPI_D0 = PA_3, + USB_OTG_HS_SOF = PA_4, + USB_OTG_HS_ULPI_CK = PA_5, + USB_OTG_HS_ULPI_D1 = PB_0, + USB_OTG_HS_ULPI_D2 = PB_1, + USB_OTG_HS_ULPI_D7 = PB_5, + USB_OTG_HS_ULPI_D3 = PB_10, + USB_OTG_HS_ULPI_D4 = PB_11, + USB_OTG_HS_ID = PB_12, + USB_OTG_HS_ULPI_D5 = PB_12, + USB_OTG_HS_ULPI_D6 = PB_13, + USB_OTG_HS_VBUS = PB_13, + USB_OTG_HS_DM = PB_14, + USB_OTG_HS_DP = PB_15, + USB_OTG_HS_ULPI_STP = PC_0, + USB_OTG_HS_ULPI_DIR = PC_2, + USB_OTG_HS_ULPI_NXT = PC_3, +#endif diff --git a/buildroot/share/PlatformIO/variants/LERDGE/variant.cpp b/buildroot/share/PlatformIO/variants/LERDGE/variant.cpp new file mode 100644 index 000000000000..ebc1922eb856 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/LERDGE/variant.cpp @@ -0,0 +1,297 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +const PinName digitalPin[] = { + PB_12, + PB_13, + PB_14, + PB_15, + PD_8, + PD_9, + PD_10, + PD_11, + PD_12, + PD_13, + PD_14, + PD_15, + PG_2, + PG_3, + PG_4, + PG_5, + PG_6, + PG_7, + PG_8, + PC_6, + PC_7, + PC_8, + PC_9, + PA_8, + PA_9, + PA_10, + PA_11, + PA_12, + PA_13, + PA_14, + PA_15, + PC_10, + PC_11, + PC_12, + PD_0, + PD_1, + PD_2, + PD_3, + PD_4, + PD_5, + PD_6, + PD_7, + PG_9, + PG_10, + PG_11, + PG_12, + PG_13, + PG_14, + PG_15, + PB_3, + PB_4, + PB_5, + PB_6, + PB_7, + PB_8, + PB_9, + PB_10, + PB_11, + PE_14, + PE_15, + PE_12, + PE_13, + PE_10, + PE_11, + PE_8, + PE_9, + PG_1, + PE_7, + PF_15, + PG_0, + PF_13, + PF_14, + PF_11, + PF_12, + PB_2, + PB_1, + PC_5, + PB_0, + PA_7, + PC_4, + PA_5, + PA_6, + PA_3, + PA_4, + PA_1, + PA_2, + PC_3, + PA_0, + PC_1, + PC_2, + PC_0, + PF_8, + PF_6, + PF_7, + PF_9, + PF_10, + PF_4, + PF_5, + PF_2, + PF_3, + PF_0, + PF_1, + PE_6, + PC_13, + PE_4, + PE_5, + PE_2, + PE_3, + PE_0, + PE_1, + PC_14, + PC_15, +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +#define __fatal_error(X) + + +/** + * @brief System Clock Configuration + * + * The system Clock is configured for F4/F7 as follows: + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 168000000 + * HCLK(Hz) = 168000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 4 + * APB2 Prescaler = 2 + * HSE Frequency(Hz) = HSE_VALUE + * PLL_M = HSE_VALUE/1000000 + * PLL_N = 336 + * PLL_P = 2 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale1 mode + * Flash Latency(WS) = 5 + * + * The system Clock is configured for L4 as follows: + * System Clock source = PLL (MSI) + * SYSCLK(Hz) = 80000000 + * HCLK(Hz) = 80000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 1 + * APB2 Prescaler = 1 + * MSI Frequency(Hz) = MSI_VALUE (4000000) + * LSE Frequency(Hz) = 32768 + * PLL_M = 1 + * PLL_N = 40 + * PLL_P = 7 + * PLL_Q = 2 + * PLL_R = 2 <= This is the source for SysClk, not as on F4/7 PLL_P + * Flash Latency(WS) = 4 + * @param None + * @retval None + * + * PLL is configured as follows: + * + * VCO_IN + * F4/F7 = HSE / M + * L4 = MSI / M + * VCO_OUT + * F4/F7 = HSE / M * N + * L4 = MSI / M * N + * PLLCLK + * F4/F7 = HSE / M * N / P + * L4 = MSI / M * N / R + * PLL48CK + * F4/F7 = HSE / M * N / Q + * L4 = MSI / M * N / Q USB Clock is obtained over PLLSAI1 + * + * SYSCLK = PLLCLK + * HCLK = SYSCLK / AHB_PRESC + * PCLKx = HCLK / APBx_PRESC + * + * Constraints on parameters: + * + * VCO_IN between 1MHz and 2MHz (2MHz recommended) + * VCO_OUT between 192MHz and 432MHz + * HSE = 8MHz + * M = 2 .. 63 (inclusive) + * N = 192 ... 432 (inclusive) + * P = 2, 4, 6, 8 + * Q = 2 .. 15 (inclusive) + * + * AHB_PRESC=1,2,4,8,16,64,128,256,512 + * APBx_PRESC=1,2,4,8,16 + * + * Output clocks: + * + * CPU SYSCLK max 168MHz + * USB,RNG,SDIO PLL48CK must be 48MHz for USB + * AHB HCLK max 168MHz + * APB1 PCLK1 max 42MHz + * APB2 PCLK2 max 84MHz + * + * Timers run from APBx if APBx_PRESC=1, else 2x APBx + */ +void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + + __PWR_CLK_ENABLE(); + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSIState = RCC_HSI_OFF; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 + clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + + RCC_OscInitStruct.PLL.PLLM = 25; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + __fatal_error("HAL_RCC_OscConfig"); + } + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + __fatal_error("HAL_RCC_ClockConfig"); + } + + /**Configure the Systick interrupt time */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); + + /**Configure the Systick */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/LERDGE/variant.h b/buildroot/share/PlatformIO/variants/LERDGE/variant.h new file mode 100644 index 000000000000..87033a68e5f6 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/LERDGE/variant.h @@ -0,0 +1,238 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// Left Side +#define PB12 0 +#define PB13 1 +#define PB14 2 +#define PB15 3 +#define PD8 4 +#define PD9 5 +#define PD10 6 +#define PD11 7 +#define PD12 8 +#define PD13 9 +#define PD14 10 +#define PD15 11 +#define PG2 12 +#define PG3 13 +#define PG4 14 +#define PG5 15 +#define PG6 16 +#define PG7 17 +#define PG8 18 +#define PC6 19 +#define PC7 20 +#define PC8 21 +#define PC9 22 +#define PA8 23 +#define PA9 24 +#define PA10 25 +#define PA11 26 // USB_DM +#define PA12 27 // USB_DP +#define PA13 28 +#define PA14 29 +#define PA15 30 +#define PC10 31 +#define PC11 32 +#define PC12 33 +#define PD0 34 +#define PD1 35 +#define PD2 36 +#define PD3 37 +#define PD4 38 +#define PD5 39 +#define PD6 40 +#define PD7 41 +#define PG9 42 +#define PG10 43 +#define PG11 44 +#define PG12 45 +#define PG13 46 +#define PG14 47 +#define PG15 48 +#define PB3 49 +#define PB4 50 +#define PB5 51 +#define PB6 52 +#define PB7 53 +#define PB8 54 +#define PB9 55 + +// Right Side +#define PB10 56 +#define PB11 57 +#define PE14 58 +#define PE15 59 +#define PE12 60 +#define PE13 61 +#define PE10 62 +#define PE11 63 +#define PE8 64 +#define PE9 65 +#define PG1 66 +#define PE7 67 +#define PF15 68 +#define PG0 69 +#define PF13 70 +#define PF14 71 +#define PF11 72 +#define PF12 73 +#define PB2 74 +#define PB1 75 // A0 +#define PC5 76 // A1 +#define PB0 77 // A2 +#define PA7 78 // A3 +#define PC4 79 // A4 +#define PA5 80 // A5 +#define PA6 81 // A6 +#define PA3 82 // A7 +#define PA4 83 // A8 +#define PA1 84 // A9 +#define PA2 85 // A10 +#define PC3 86 // A11 +#define PA0 87 // A12/PA_0(WK_UP): BUT K_UP) +#define PC1 88 // A13 +#define PC2 89 // A14 +#define PC0 90 // A15 +#define PF8 91 // A16 +#define PF6 92 // A17 +#define PF7 93 // A18 +#define PF9 94 // LED D1 (active low) +#define PF10 95 // LED D2 (active low) +#define PF4 96 +#define PF5 97 +#define PF2 98 +#define PF3 99 +#define PF0 100 +#define PF1 101 +#define PE6 102 +#define PC13 103 +#define PE4 104 // BUT K0 +#define PE5 105 // BUT K1 +#define PE2 106 +#define PE3 107 +#define PE0 108 +#define PE1 109 +#define PC14 110 +#define PC15 111 +// This must be a literal +#define NUM_DIGITAL_PINS 112 +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 23 +#define NUM_ANALOG_FIRST 75 + + +// Below SPI and I2C definitions already done in the core +// Could be redefined here if differs from the default one +// SPI Definitions +#define PIN_SPI_SS PF11 +#define PIN_SPI_MOSI PB15 +#define PIN_SPI_MISO PB14 +#define PIN_SPI_SCK PB13 + + + +//max6675 +//#define PIN_SPI_SS PA4 +//#define PIN_SPI_SCK PA5 +//#define PIN_SPI_MISO PA6 +//#define PIN_SPI_MOSI PA7 + + + + +// I2C Definitions +#define PIN_WIRE_SDA PB7 +#define PIN_WIRE_SCL PB6 + +// Timer Definitions +//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c +#define TIMER_TONE TIM6 + +// Do not use basic timer: OC is required +#define TIMER_SERVO TIM1 //TODO: advanced-control timers don't work + +// UART Definitions +// Define here Serial instance number to map on Serial generic name +#define SERIAL_UART_INSTANCE 1 //ex: 2 for Serial2 (USART2) +// DEBUG_UART could be redefined to print on another instance than 'Serial' +//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 +// DEBUG_UART baudrate, default: 9600 if not defined +//#define DEBUG_UART_BAUDRATE x +// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART +//#define DEBUG_PINNAME_TX PX_n // PinName used for TX + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +/* Extra HAL modules */ +//#define HAL_DAC_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE Serial1 +#endif + diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX-tests new file mode 100644 index 000000000000..c2d72e0d77e6 --- /dev/null +++ b/buildroot/tests/LERDGEX-tests @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# +# Build tests for LERDGEX environment +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_LERDGE_X +opt_set SERIAL_PORT 1 +exec_test $1 $2 "LERDGE X with Default Configuration" + +# clean up +restore_configs diff --git a/platformio.ini b/platformio.ini index 2c0df405a2fc..a493db923735 100644 --- a/platformio.ini +++ b/platformio.ini @@ -821,6 +821,46 @@ build_flags = ${common_stm32.build_flags} extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py lib_ignore = Adafruit NeoPixel, SailfishLCD, SlowSoftI2CMaster, SoftwareSerial +# +# Lerdge base +# +[lerdge_common] +platform = ${common_stm32.platform} +extends = common_stm32 +board = LERDGE +board_build.offset = 0x10000 +extra_scripts = pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/lerdge.py +build_flags = ${common_stm32.build_flags} + -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 + -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE + -DTRANSFER_CLOCK_DIV=8 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 + +# +# Lerdge X +# +[env:LERDGEX] +extends = lerdge_common +board_build.firmware = Lerdge_X_firmware_force.bin + +# +# Lerdge S +# +[env:LERDGES] +extends = lerdge_common +board_build.firmware = Lerdge_firmware_force.bin + +# +# Lerdge K +# +[env:LERDGEK] +extends = lerdge_common +board_build.firmware = Lerdge_K_firmware_force.bin +build_flags = ${lerdge_common.build_flags} + -DLERDGEK + # # RUMBA32 # From 9ee891c4a602b8cbdf1f477e28b4e1bc9003fd99 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 7 Jul 2020 00:32:33 +0200 Subject: [PATCH 101/483] Fix TMC homing phase coils alignment (#18528) Co-authored-by: Fabio Santos --- Marlin/src/feature/tmc_util.cpp | 22 +++++++++- Marlin/src/module/motion.cpp | 71 +++++++++++++++++---------------- 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index fe8fe06d6fe4..a8a1f5075b42 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -480,6 +480,10 @@ TMC_GLOBAL_SCALER, TMC_CS_ACTUAL, TMC_PWM_SCALE, + TMC_PWM_SCALE_SUM, + TMC_PWM_SCALE_AUTO, + TMC_PWM_OFS_AUTO, + TMC_PWM_GRAD_AUTO, TMC_VSENSE, TMC_STEALTHCHOP, TMC_MICROSTEPS, @@ -492,7 +496,8 @@ TMC_TBL, TMC_HEND, TMC_HSTRT, - TMC_SGT + TMC_SGT, + TMC_MSCNT }; enum TMC_drv_status_enum : char { TMC_DRV_CODES, @@ -591,7 +596,10 @@ #if HAS_TMC220x static void _tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { switch (i) { - case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break; + case TMC_PWM_SCALE_SUM: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break; + case TMC_PWM_SCALE_AUTO: SERIAL_PRINT(st.pwm_scale_auto(), DEC); break; + case TMC_PWM_OFS_AUTO: SERIAL_PRINT(st.pwm_ofs_auto(), DEC); break; + case TMC_PWM_GRAD_AUTO: SERIAL_PRINT(st.pwm_grad_auto(), DEC); break; case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break; case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break; case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break; @@ -680,6 +688,7 @@ case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break; case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break; case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break; + case TMC_MSCNT: SERIAL_PRINT(st.get_microstep_counter(), DEC); break; default: _tmc_status(st, i); break; } } @@ -900,11 +909,20 @@ #if ENABLED(MONITOR_DRIVER_STATUS) TMC_REPORT("triggered\n OTP\t", TMC_OTPW_TRIGGERED); #endif + + #if HAS_TMC220x + TMC_REPORT("pwm scale sum", TMC_PWM_SCALE_SUM); + TMC_REPORT("pwm scale auto", TMC_PWM_SCALE_AUTO); + TMC_REPORT("pwm offset auto", TMC_PWM_OFS_AUTO); + TMC_REPORT("pwm grad auto", TMC_PWM_GRAD_AUTO); + #endif + TMC_REPORT("off time", TMC_TOFF); TMC_REPORT("blank time", TMC_TBL); TMC_REPORT("hysteresis\n -end\t", TMC_HEND); TMC_REPORT(" -start\t", TMC_HSTRT); TMC_REPORT("Stallguard thrs", TMC_SGT); + TMC_REPORT("uStep count", TMC_MSCNT); DRV_REPORT("DRVSTATUS", TMC_DRV_CODES); #if HAS_TMCX1X0 || HAS_TMC220x DRV_REPORT("sg_result", TMC_SG_RESULT); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 1994280a2c31..f7732f577fa6 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1443,65 +1443,69 @@ void set_axis_not_trusted(const AxisEnum axis) { TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); } -/** - * Move the axis back to its home_phase if set and driver is capable (TMC) - * - * Improves homing repeatability by homing to stepper coil's nearest absolute - * phase position. Trinamic drivers use a stepper phase table with 1024 values - * spanning 4 full steps with 256 positions each (ergo, 1024 positions). - */ -void backout_to_tmc_homing_phase(const AxisEnum axis) { - #ifdef TMC_HOME_PHASE - const abc_long_t home_phase = TMC_HOME_PHASE; +#ifdef TMC_HOME_PHASE + /** + * Move the axis back to its home_phase if set and driver is capable (TMC) + * + * Improves homing repeatability by homing to stepper coil's nearest absolute + * phase position. Trinamic drivers use a stepper phase table with 1024 values + * spanning 4 full steps with 256 positions each (ergo, 1024 positions). + */ + void backout_to_tmc_homing_phase(const AxisEnum axis) { + const xyz_long_t home_phase = TMC_HOME_PHASE; // check if home phase is disabled for this axis. if (home_phase[axis] < 0) return; - int16_t axisMicrostepSize; - int16_t phaseCurrent; - bool invertDir; + int16_t phasePerUStep, // TMC µsteps(phase) per Marlin µsteps + phaseCurrent, // The TMC µsteps(phase) count of the current position + effectorBackoutDir, // Direction in which the effector mm coordinates move away from endstop. + stepperBackoutDir; // Direction in which the TMC µstep count(phase) move away from endstop. switch (axis) { #ifdef X_MICROSTEPS case X_AXIS: - axisMicrostepSize = 256 / (X_MICROSTEPS); + phasePerUStep = 256 / (X_MICROSTEPS); phaseCurrent = stepperX.get_microstep_counter(); - invertDir = INVERT_X_DIR; + effectorBackoutDir = -X_HOME_DIR; + stepperBackoutDir = INVERT_X_DIR ? effectorBackoutDir : -effectorBackoutDir; break; #endif #ifdef Y_MICROSTEPS case Y_AXIS: - axisMicrostepSize = 256 / (Y_MICROSTEPS); + phasePerUStep = 256 / (Y_MICROSTEPS); phaseCurrent = stepperY.get_microstep_counter(); - invertDir = INVERT_Y_DIR; + effectorBackoutDir = -Y_HOME_DIR; + stepperBackoutDir = INVERT_Y_DIR ? effectorBackoutDir : -effectorBackoutDir; break; #endif #ifdef Z_MICROSTEPS case Z_AXIS: - axisMicrostepSize = 256 / (Z_MICROSTEPS); + phasePerUStep = 256 / (Z_MICROSTEPS); phaseCurrent = stepperZ.get_microstep_counter(); - invertDir = INVERT_Z_DIR; + effectorBackoutDir = -Z_HOME_DIR; + stepperBackoutDir = INVERT_Z_DIR ? effectorBackoutDir : -effectorBackoutDir; break; #endif default: return; } - // Depending on invert dir measure the distance to nearest home phase. - int16_t phaseDelta = (invertDir ? -1 : 1) * (home_phase[axis] - phaseCurrent); + // Phase distance to nearest home phase position when moving in the backout direction from endstop(may be negative). + int16_t phaseDelta = (home_phase[axis] - phaseCurrent) * stepperBackoutDir; // Check if home distance within endstop assumed repeatability noise of .05mm and warn. - if (ABS(phaseDelta) * planner.steps_to_mm[axis] / axisMicrostepSize < 0.05f) - DEBUG_ECHOLNPAIR("Selected home phase ", home_phase[axis], + if (ABS(phaseDelta) * planner.steps_to_mm[axis] / phasePerUStep < 0.05f) + SERIAL_ECHOLNPAIR("Selected home phase ", home_phase[axis], " too close to endstop trigger phase ", phaseCurrent, ". Pick a different phase for ", axis_codes[axis]); // Skip to next if target position is behind current. So it only moves away from endstop. if (phaseDelta < 0) phaseDelta += 1024; - // Get the integer µsteps to target. Unreachable phase? Consistently stop at the µstep before / after based on invertDir. - const float mmDelta = -(int16_t(phaseDelta / axisMicrostepSize) * planner.steps_to_mm[axis] * (Z_HOME_DIR)); + // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm + const float mmDelta = int16_t(phaseDelta / phasePerUStep) * effectorBackoutDir * planner.steps_to_mm[axis]; - // optional debug messages. + // Optional debug messages if (DEBUGGING(LEVELING)) { DEBUG_ECHOLNPAIR( "Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent, @@ -1510,14 +1514,11 @@ void backout_to_tmc_homing_phase(const AxisEnum axis) { } if (mmDelta != 0) { - // retrace by the amount computed in mmDelta. + // Retrace by the amount computed in mmDelta. do_homing_move(axis, mmDelta, get_homing_bump_feedrate(axis)); } - #else - UNUSED(axis); - #endif -} - + } +#endif /** * Home an individual "raw axis" to its endstop. @@ -1748,8 +1749,10 @@ void homeaxis(const AxisEnum axis) { } #endif - // move back to homing phase if configured and capable - backout_to_tmc_homing_phase(axis); + #ifdef TMC_HOME_PHASE + // move back to homing phase if configured and capable + backout_to_tmc_homing_phase(axis); + #endif #if IS_SCARA From 9a0b9de3ba4747a7eac0c714e361b56a1f86fbeb Mon Sep 17 00:00:00 2001 From: shuttercat <67816426+shuttercat@users.noreply.github.com> Date: Mon, 6 Jul 2020 15:48:55 -0700 Subject: [PATCH 102/483] Scale runout distance setting for editable range (#18567) --- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index cee5e6e33f09..a252f91a33ec 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -152,7 +152,7 @@ void menu_cancelobject(); #if HAS_FILAMENT_RUNOUT_DISTANCE editable.decimal = runout.runout_distance(); - EDIT_ITEM(float3, MSG_RUNOUT_DISTANCE_MM, &editable.decimal, 1, 30, + EDIT_ITEM(float3, MSG_RUNOUT_DISTANCE_MM, &editable.decimal, 1, float(FILAMENT_RUNOUT_DISTANCE_MM) * 1.5f, []{ runout.set_runout_distance(editable.decimal); }, true ); #endif From 378b5685b3510d59d5b1b0b46942f2cc9df0c8fa Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 6 Jul 2020 15:51:36 -0700 Subject: [PATCH 103/483] 0.7.1 <= TMCStepper <= 0.7.9 (#18564) --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index a493db923735..da08d2d14afe 100644 --- a/platformio.ini +++ b/platformio.ini @@ -29,7 +29,7 @@ extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants lib_deps = LiquidCrystal@1.5.0 - TMCStepper@~0.7.0 + TMCStepper@~0.7.1 Adafruit MAX31865 library@~1.1.0 Adafruit NeoPixel@1.5.0 U8glib-HAL@0.4.1 @@ -294,7 +294,7 @@ src_filter = ${common.default_src_filter} + lib_deps = Servo LiquidCrystal@1.0.0 U8glib-HAL@0.4.1 - TMCStepper@~0.7.0 + TMCStepper@~0.7.1 Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip build_flags = -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g ${common.build_flags} @@ -381,7 +381,7 @@ build_flags = ${common_stm32f1.build_flags} extra_scripts = pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py lib_deps = - TMCStepper@~0.7.0 + TMCStepper@~0.7.1 Adafruit MAX31865 library@~1.1.0 U8glib-HAL@0.4.1 Arduino-L6470@0.8.0 From ea8c3a9388f74ab1a05f5261b3373a1682575899 Mon Sep 17 00:00:00 2001 From: espr14 Date: Tue, 7 Jul 2020 01:52:21 +0200 Subject: [PATCH 104/483] Reduce 'first loop' temperature residency time (#18421) Co-authored-by: Scott Lahteine --- Marlin/src/module/temperature.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1afe5c4e4ecf..ff7f69e5c871 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -3100,9 +3100,7 @@ void Temperature::tick() { if (!residency_start_ms) { // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time. if (temp_diff < TEMP_WINDOW) { - residency_start_ms = now; - if (first_loop) residency_start_ms += SEC_TO_MS(TEMP_RESIDENCY_TIME); - } + residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_RESIDENCY_TIME) / 3 : 0); } else if (temp_diff > TEMP_HYSTERESIS) { // Restart the timer whenever the temperature falls outside the hysteresis. @@ -3227,10 +3225,8 @@ void Temperature::tick() { if (!residency_start_ms) { // Start the TEMP_BED_RESIDENCY_TIME timer when we reach target temp for the first time. - if (temp_diff < TEMP_BED_WINDOW) { - residency_start_ms = now; - if (first_loop) residency_start_ms += SEC_TO_MS(TEMP_BED_RESIDENCY_TIME); - } + if (temp_diff < TEMP_BED_WINDOW) + residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_BED_RESIDENCY_TIME) / 3 : 0); } else if (temp_diff > TEMP_BED_HYSTERESIS) { // Restart the timer whenever the temperature falls outside the hysteresis. @@ -3319,7 +3315,7 @@ void Temperature::tick() { } now = millis(); - if (ELAPSED(now, next_temp_ms)) { //Print Temp Reading every 1 second while heating up. + if (ELAPSED(now, next_temp_ms)) { // Print Temp Reading every 1 second while heating up. next_temp_ms = now + 1000UL; print_heater_states(active_extruder); #if TEMP_CHAMBER_RESIDENCY_TIME > 0 @@ -3343,10 +3339,8 @@ void Temperature::tick() { if (!residency_start_ms) { // Start the TEMP_CHAMBER_RESIDENCY_TIME timer when we reach target temp for the first time. - if (temp_diff < TEMP_CHAMBER_WINDOW) { - residency_start_ms = now; - if (first_loop) residency_start_ms += SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME); - } + if (temp_diff < TEMP_CHAMBER_WINDOW) + residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME) / 3 : 0); } else if (temp_diff > TEMP_CHAMBER_HYSTERESIS) { // Restart the timer whenever the temperature falls outside the hysteresis. From 12e7106a8afaceb01f41a1bf61e24049c6e7b49e Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 7 Jul 2020 11:53:26 +1200 Subject: [PATCH 105/483] Update and fix POWER_MONITOR (#18561) --- Marlin/src/feature/power_monitor.cpp | 7 ++++--- Marlin/src/feature/power_monitor.h | 4 ++-- Marlin/src/gcode/feature/power_monitor/M430.cpp | 2 +- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 16 ++++++++++------ Marlin/src/lcd/menu/menu_power_monitor.cpp | 8 ++++---- Marlin/src/module/configuration_store.cpp | 2 +- buildroot/tests/mega1280-tests | 7 +++++-- 8 files changed, 28 insertions(+), 20 deletions(-) diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp index 30b19a99e10c..cf8ff1139bf8 100644 --- a/Marlin/src/feature/power_monitor.cpp +++ b/Marlin/src/feature/power_monitor.cpp @@ -28,6 +28,7 @@ #include "../lcd/ultralcd.h" #include "../lcd/lcdprint.h" +#include "../libs/numtostr.h" uint8_t PowerMonitor::flags; // = 0 @@ -48,7 +49,7 @@ PowerMonitor power_monitor; // Single instance - this calls the constructor #if ENABLED(POWER_MONITOR_CURRENT) void PowerMonitor::draw_current() { const float amps = getAmps(); - lcd_put_u8str(amps < 100 ? ftostr21ns(amps) : ui16tostr4((uint16_t)amps)); + lcd_put_u8str(amps < 100 ? ftostr31ns(amps) : ui16tostr4rj((uint16_t)amps)); lcd_put_wchar('A'); } #endif @@ -56,7 +57,7 @@ PowerMonitor power_monitor; // Single instance - this calls the constructor #if HAS_POWER_MONITOR_VREF void PowerMonitor::draw_voltage() { const float volts = getVolts(); - lcd_put_u8str(volts < 100 ? ftostr21ns(volts) : ui16tostr4((uint16_t)volts)); + lcd_put_u8str(volts < 100 ? ftostr31ns(volts) : ui16tostr4rj((uint16_t)volts)); lcd_put_wchar('V'); } #endif @@ -64,7 +65,7 @@ PowerMonitor power_monitor; // Single instance - this calls the constructor #if HAS_POWER_MONITOR_WATTS void PowerMonitor::draw_power() { const float power = getPower(); - lcd_put_u8str(power < 100 ? ftostr21ns(power) : ui16tostr4((uint16_t)power)); + lcd_put_u8str(power < 100 ? ftostr31ns(power) : ui16tostr4rj((uint16_t)power)); lcd_put_wchar('W'); } #endif diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index fc7a23b8f341..00b45b0f9a82 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -100,13 +100,13 @@ class PowerMonitor { static void draw_voltage(); FORCE_INLINE static bool voltage_display_enabled() { return TEST(flags, PM_DISP_BIT_V); } FORCE_INLINE static void set_voltage_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_V, b); } - FORCE_INLINE static void toggle_voltage_display() { TBI(flags, PM_DISP_BIT_I); } + FORCE_INLINE static void toggle_voltage_display() { TBI(flags, PM_DISP_BIT_V); } #endif #if HAS_POWER_MONITOR_WATTS static void draw_power(); FORCE_INLINE static bool power_display_enabled() { return TEST(flags, PM_DISP_BIT_P); } FORCE_INLINE static void set_power_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_P, b); } - FORCE_INLINE static void toggle_power_display() { TBI(flags, PM_DISP_BIT_I); } + FORCE_INLINE static void toggle_power_display() { TBI(flags, PM_DISP_BIT_P); } #endif #endif diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp index 50bb146c7802..356fe6749559 100644 --- a/Marlin/src/gcode/feature/power_monitor/M430.cpp +++ b/Marlin/src/gcode/feature/power_monitor/M430.cpp @@ -25,7 +25,7 @@ #if HAS_POWER_MONITOR #include "../../../feature/power_monitor.h" -#include "../../../Marlin.h" +#include "../../../MarlinCore.h" #include "../../gcode.h" /** diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 41cad412a432..3e5cef9dc3c1 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -356,7 +356,7 @@ #if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) #define HAS_POWER_MONITOR 1 #endif -#if ENABLED(POWER_MONITOR_VOLTAGE) || defined(POWER_MONITOR_FIXED_VOLTAGE) +#if ENABLED(POWER_MONITOR_VOLTAGE) && defined(POWER_MONITOR_FIXED_VOLTAGE) #define HAS_POWER_MONITOR_VREF 1 #endif #if BOTH(HAS_POWER_MONITOR_VREF, POWER_MONITOR_CURRENT) diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 8be9b27dda07..ae8952ab3365 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -113,22 +113,26 @@ lcd_moveto(x, y); + #if HAS_POWER_MONITOR_WATTS + const bool wflag = power_monitor.power_display_enabled(); + #endif #if ENABLED(POWER_MONITOR_CURRENT) const bool iflag = power_monitor.current_display_enabled(); #endif #if HAS_POWER_MONITOR_VREF const bool vflag = power_monitor.voltage_display_enabled(); #endif - #if HAS_POWER_MONITOR_WATTS - const bool wflag = power_monitor.power_display_enabled(); - #endif - #if ENABLED(POWER_MONITOR_CURRENT) || HAS_POWER_MONITOR_VREF - // cycle between current, voltage, and power + #if HAS_POWER_MONITOR_WATTS + // Cycle between current, voltage, and power if (ELAPSED(millis(), power_monitor.display_item_ms)) { power_monitor.display_item_ms = millis() + 1000UL; ++power_monitor.display_item; } + #elif ENABLED(POWER_MONITOR_CURRENT) + power_monitor.display_item = 0; + #elif HAS_POWER_MONITOR_VREF + power_monitor.display_item = 1; #endif // ensure we have the right one selected for display @@ -139,7 +143,7 @@ #if HAS_POWER_MONITOR_VREF if (power_monitor.display_item == 1 && !vflag) ++power_monitor.display_item; #endif - #if ENABLED(POWER_MONITOR_CURRENT) + #if HAS_POWER_MONITOR_WATTS if (power_monitor.display_item == 2 && !wflag) ++power_monitor.display_item; #endif if (power_monitor.display_item >= 3) power_monitor.display_item = 0; diff --git a/Marlin/src/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp index 7055f01c31fe..3486d54a574b 100644 --- a/Marlin/src/lcd/menu/menu_power_monitor.cpp +++ b/Marlin/src/lcd/menu/menu_power_monitor.cpp @@ -33,26 +33,26 @@ void menu_power_monitor() { START_MENU(); - MENU_BACK(MSG_MAIN); + BACK_ITEM(MSG_MAIN); #if ENABLED(POWER_MONITOR_CURRENT) { bool ena = power_monitor.current_display_enabled(); - MENU_ITEM_EDIT_CALLBACK(bool, MSG_CURRENT, &ena, power_monitor.toggle_current_display); + EDIT_ITEM(bool, MSG_CURRENT, &ena, power_monitor.toggle_current_display); } #endif #if HAS_POWER_MONITOR_VREF { bool ena = power_monitor.voltage_display_enabled(); - MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLTAGE, &ena, power_monitor.toggle_voltage_display); + EDIT_ITEM(bool, MSG_VOLTAGE, &ena, power_monitor.toggle_voltage_display); } #endif #if HAS_POWER_MONITOR_WATTS { bool ena = power_monitor.power_display_enabled(); - MENU_ITEM_EDIT_CALLBACK(bool, MSG_POWER, &ena, power_monitor.toggle_power_display); + EDIT_ITEM(bool, MSG_POWER, &ena, power_monitor.toggle_power_display); } #endif diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 0915c0451a10..6c4c13f830e0 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -94,7 +94,7 @@ #include "../feature/powerloss.h" #endif -#if ENABLED(POWER_MONITOR) +#if HAS_POWER_MONITOR #include "../feature/power_monitor.h" #endif diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index c9caf7d8525b..6bd9cda60562 100644 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -18,13 +18,16 @@ set -e restore_configs opt_set LCD_LANGUAGE an opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING \ + EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ SENSORLESS_BACKOFF_MM HOMING_BACKOFF_POST_MM HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ G26_MESH_VALIDATION MESH_EDIT_MENU GCODE_QUOTED_STRINGS \ - EXTERNAL_CLOSED_LOOP_CONTROLLER + EXTERNAL_CLOSED_LOOP_CONTROLLER POWER_MONITOR_CURRENT POWER_MONITOR_VOLTAGE +opt_set POWER_MONITOR_CURRENT_PIN 14 +opt_set POWER_MONITOR_VOLTAGE_PIN 15 opt_set CLOSED_LOOP_ENABLE_PIN 44 opt_set CLOSED_LOOP_MOVE_COMPLETE_PIN 45 -exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, and LCD" +exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, Power Monitor, and LCD" # # Test DUAL_X_CARRIAGE From d3b2c092219c238cdeda7d2b601460bb6c449deb Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 7 Jul 2020 00:08:30 +0000 Subject: [PATCH 106/483] [cron] Bump distribution date (2020-07-07) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index fba59c7c99e3..f50ce9d744ce 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-06" + #define STRING_DISTRIBUTION_DATE "2020-07-07" #endif /** From 9546847dc1af1d4df4842b99576010890bdaf8b1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 7 Jul 2020 01:50:57 -0500 Subject: [PATCH 107/483] Temp Residency followup --- Marlin/src/module/temperature.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index ff7f69e5c871..d5de826b47ec 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1813,12 +1813,12 @@ void Temperature::init() { }while(0) #define _MINMAX_TEST(N,M) (HOTENDS > N && THERMISTOR_HEATER_##N && THERMISTOR_HEATER_##N != 998 && THERMISTOR_HEATER_##N != 999 && defined(HEATER_##N##_##M##TEMP)) - + #if _MINMAX_TEST(0, MIN) _TEMP_MIN_E(0); #endif #if _MINMAX_TEST(0, MAX) - _TEMP_MAX_E(0); + _TEMP_MAX_E(0); #endif #if _MINMAX_TEST(1, MIN) _TEMP_MIN_E(1); @@ -3099,7 +3099,7 @@ void Temperature::tick() { if (!residency_start_ms) { // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time. - if (temp_diff < TEMP_WINDOW) { + if (temp_diff < TEMP_WINDOW) residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_RESIDENCY_TIME) / 3 : 0); } else if (temp_diff > TEMP_HYSTERESIS) { From d6682c860924ca96ee51c15906beffc8e4b4f37b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 7 Jul 2020 01:57:05 -0500 Subject: [PATCH 108/483] Whitespace cleanup --- Marlin/src/feature/leds/neopixel.cpp | 4 ++-- Marlin/src/gcode/feature/leds/M150.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 6 +++--- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 6 +++--- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/module/motion.cpp | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index d2aa2e9fd9e6..93e8348cfd1f 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -53,11 +53,11 @@ Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIX #endif void Marlin_NeoPixel::set_color(const uint32_t color) { - if (get_neo_index() >= 0) { + if (get_neo_index() >= 0) { set_pixel_color(get_neo_index(), color); set_neo_index(-1); } - else { + else { for (uint16_t i = 0; i < pixels(); ++i) { #ifdef NEOPIXEL_BKGD_LED_INDEX if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) { diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index a2497961ace1..88e4ec1e27e6 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -47,7 +47,7 @@ * M150 P127 ; Set LED 50% brightness * M150 P ; Set LED full brightness * M150 I1 R ; Set NEOPIXEL index 1 to red - */ + */ void GcodeSuite::M150() { #if ENABLED(NEOPIXEL_LED) neo.set_neo_index(parser.intval('I', -1)); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index b1b2cf9b8250..877518c89764 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -121,10 +121,10 @@ #define IS_U8GLIB_SSD1306 #elif ENABLED(FYSETC_242_OLED_12864) - + #define IS_RRD_SC #define U8GLIB_SH1106 - + #define LED_CONTROL_MENU #define NEOPIXEL_LED #undef NEOPIXEL_TYPE @@ -136,7 +136,7 @@ #ifndef NEOPIXEL_BRIGHTNESS #define NEOPIXEL_BRIGHTNESS 127 #endif - + #if ENABLED(PSU_CONTROL) #define LED_BACKLIGHT_TIMEOUT 10000 #endif diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index d1a60e7705e4..b83a175589c2 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -124,11 +124,11 @@ #endif #elif ENABLED(FYSETC_242_OLED_12864) - + // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER - + #define FORCE_SOFT_SPI // SW-SPI - + #if ENABLED(ALTERNATIVE_LCD) #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes #else diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 457f3dd174b7..0bd1c1e65511 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -310,7 +310,7 @@ void menu_advanced_settings(); #if HAS_FAN editable.uint8 = uint8_t(ui.material_preset[m].fan_speed); EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; }); - #endif + #endif #if HAS_TEMP_HOTEND EDIT_ITEM(uint16_3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); #endif diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index f7732f577fa6..cbf52bae223e 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1502,7 +1502,7 @@ void set_axis_not_trusted(const AxisEnum axis) { // Skip to next if target position is behind current. So it only moves away from endstop. if (phaseDelta < 0) phaseDelta += 1024; - // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm + // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm const float mmDelta = int16_t(phaseDelta / phasePerUStep) * effectorBackoutDir * planner.steps_to_mm[axis]; // Optional debug messages diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 2146c4a5287e..114c44071526 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -100,7 +100,7 @@ #define TEMP_BED_PIN PC0 // Analog Input // Lergde-K can choose thermocouple/thermistor mode in software. -// For use with thermistors, these pins must be OUT/LOW. +// For use with thermistors, these pins must be OUT/LOW. // This is done automatically. #define TEMP_0_TR_ENABLE_PIN PF10 #define TEMP_1_TR_ENABLE_PIN PF9 From ea94716a87885653ae88d2ba92c6cccb22286f12 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 6 Jul 2020 19:28:25 -0500 Subject: [PATCH 109/483] Combine command macros --- .../lcd/extui/lib/mks_ui/printer_opration.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp index ac876bb16a43..49413a9b1cf6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp @@ -51,10 +51,7 @@ if (uiCfg.waitEndMoves > 20) { uiCfg.waitEndMoves = 0; planner.synchronize(); - gcode.process_subcommands_now_P(PSTR("M25")); - gcode.process_subcommands_now_P(PSTR("G91")); - gcode.process_subcommands_now_P(PSTR("G1 Z5")); - gcode.process_subcommands_now_P(PSTR("G90")); + gcode.process_subcommands_now_P(PSTR("M25\nG91\nG1 Z5\nG90")); uiCfg.print_state = PAUSED; @@ -76,10 +73,7 @@ if (uiCfg.print_state == RESUMING) { if (IS_SD_PAUSED()) { - gcode.process_subcommands_now_P(PSTR("G91")); - gcode.process_subcommands_now_P(PSTR("G1 Z-5")); - gcode.process_subcommands_now_P(PSTR("G90")); - gcode.process_subcommands_now_P(PSTR("M24")); + gcode.process_subcommands_now_P(PSTR("G91\nG1 Z-5\nG90\nM24")); uiCfg.print_state = WORKING; start_print_time(); @@ -104,11 +98,8 @@ } #endif - if (gCfgItems.pause_reprint == 1) { - gcode.process_subcommands_now_P(PSTR("G91")); - gcode.process_subcommands_now_P(PSTR("G1 Z-5")); - gcode.process_subcommands_now_P(PSTR("G90")); - } + if (gCfgItems.pause_reprint == 1) + gcode.process_subcommands_now_P(PSTR("G91\nG1 Z-5\nG90")); recovery.resume(); uiCfg.print_state = WORKING; From 588d40aedf4d0f148186280cf6f387f5436302c2 Mon Sep 17 00:00:00 2001 From: notabucketofspam <43456540+notabucketofspam@users.noreply.github.com> Date: Tue, 7 Jul 2020 07:55:01 -0400 Subject: [PATCH 110/483] Fix typo in Configuration_adv.h (#18570) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e1036e6fbf3e..edd66cade4c9 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1829,7 +1829,7 @@ // @section motion -// The number of lineear moves that can be in the planner at once. +// The number of linear moves that can be in the planner at once. // The value of BLOCK_BUFFER_SIZE must be a power of 2 (e.g. 8, 16, 32) #if BOTH(SDSUPPORT, DIRECT_STEPPING) #define BLOCK_BUFFER_SIZE 8 From 35bb616d3230537e09fdb83afe054508ae2725ab Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 8 Jul 2020 00:08:30 +0000 Subject: [PATCH 111/483] [cron] Bump distribution date (2020-07-08) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f50ce9d744ce..10925fa1e4bf 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-07" + #define STRING_DISTRIBUTION_DATE "2020-07-08" #endif /** From 759d63d76a505ad11742f5e90a331b4401a99900 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 6 Jul 2020 19:14:15 -0500 Subject: [PATCH 112/483] Tweak PLR debug --- Marlin/src/feature/powerloss.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 0ae1280213cf..97b30435f100 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -523,7 +523,7 @@ void PrintJobRecovery::resume() { #endif #if HAS_LEVELING - DEBUG_ECHOLNPAIR("leveling: ", int(info.leveling), "\n fade: ", int(info.fade)); + DEBUG_ECHOLNPAIR("leveling: ", int(info.leveling), " fade: ", info.fade); #endif #if ENABLED(FWRETRACT) DEBUG_ECHOPGM("retract: "); From 67b2b78717ed1dfd1950872832e94a11e77357a8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 7 Jul 2020 19:31:44 -0500 Subject: [PATCH 113/483] Fix warning with PIO --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index da08d2d14afe..ae08ee9335f6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -19,6 +19,7 @@ src_dir = Marlin boards_dir = buildroot/share/PlatformIO/boards default_envs = mega2560 +include_dir = Marlin # # The 'common' values are used for most Marlin builds From d6c177008f465a6369415015bac8d8cfe5101d41 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 27 Jun 2020 22:53:42 -0500 Subject: [PATCH 114/483] SKR 1.4 alert for unsupported LCD --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index e2801ebfa673..78da8e842f75 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -250,7 +250,8 @@ #define LCD_PINS_ENABLE P1_23 #define LCD_PINS_D4 P1_21 - #else + #elif HAS_GRAPHICAL_LCD + #define BTN_ENC P0_28 // (58) open-drain #define LCD_PINS_RS P1_19 @@ -311,6 +312,10 @@ #endif // !FYSETC_MINI_12864 + #elif HAS_CHARACTER_LCD + + #error "Character LCD not yet supported for SKR 1.4." + #endif #endif // HAS_SPI_LCD From f52a1eb111d7654fec1e03db7fa87a59a8146730 Mon Sep 17 00:00:00 2001 From: cccc Date: Wed, 8 Jul 2020 14:15:05 +0800 Subject: [PATCH 115/483] Update Chinese (zh_CN) language (#18580) --- Marlin/src/lcd/language/language_zh_CN.h | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 34452275400f..7aaf57d3b579 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -35,7 +35,7 @@ namespace Language_zh_CN { PROGMEM Language_Str LANGUAGE = _UxGT("简体中文"); PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT("已就绪."); //" ready." - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_MARLIN = _UxGT("马林"); PROGMEM Language_Str MSG_YES = _UxGT("是"); PROGMEM Language_Str MSG_NO = _UxGT("å¦"); PROGMEM Language_Str MSG_BACK = _UxGT("返回"); // â€Back“ @@ -201,7 +201,7 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 细调所有的"); PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. ä¿å­˜çƒ­åºŠç½‘æ ¼"); - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("ç¯ç®¡æŽ§åˆ¶"); // "LED Control") + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED控制"); // "LED Control") PROGMEM Language_Str MSG_LEDS = _UxGT("ç¯"); // "Lights") PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("ç¯é¢„ç½®"); // "Light Presets") PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("红"); // "Red") @@ -234,11 +234,11 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移动 10 mm"); //"Move 10mm" PROGMEM Language_Str MSG_SPEED = _UxGT("速率"); //"Speed" PROGMEM Language_Str MSG_BED_Z = _UxGT("热床Z"); //"Bed Z" - PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴"); //"Nozzle" 噴嘴 - PROGMEM Language_Str MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" 喷嘴 ~"); //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE = _UxGT("喷嘴"); //"Nozzle" 噴嘴 + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("喷嘴 ~"); //"Nozzle" 噴嘴 PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("喷嘴已åœé "); PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("喷嘴待命中"); - PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" 热床"); //"Bed" + PROGMEM Language_Str MSG_BED = _UxGT("热床"); //"Bed" PROGMEM Language_Str MSG_CHAMBER = _UxGT("机箱壳"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("风扇速率"); //"Fan speed" PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("风扇速率 ~"); //"Fan speed" @@ -310,8 +310,10 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_EN_STEPS = _UxGT("挤出机~步数/mm"); PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("温度"); //"Temperature" PROGMEM Language_Str MSG_MOTION = _UxGT("è¿åŠ¨"); //"Motion" - PROGMEM Language_Str MSG_FILAMENT = _UxGT("ä¸æ–™æµ‹å®¹"); //"Filament" menu_advanced_filament - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("测容积mm³"); //"E in mm3" volumetric_enabled + PROGMEM Language_Str MSG_FILAMENT = _UxGT("æ–™ä¸"); //"Filament" menu_advanced_filament + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); //"E in mm3" volumetric_enabled + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("ä¸æ–™ç›´å¾„"); //"Fil. Dia." PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("ä¸æ–™ç›´å¾„ *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("å¸è½½ mm"); // "Unload mm" @@ -329,10 +331,14 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("设置已ä¿å­˜"); PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("存储器更新"); PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("å¤ä½æ‰“å°æœº"); - PROGMEM Language_Str MSG_REFRESH = _UxGT("刷新"); //"Refresh" + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("刷新"); PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("ä¿¡æ¯å±"); //"Info screen" PROGMEM Language_Str MSG_PREPARE = _UxGT("准备"); //"Prepare" PROGMEM Language_Str MSG_TUNE = _UxGT("调整"); //"Tune" + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("电æºç›‘控"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("电æµ"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("电压"); + PROGMEM Language_Str MSG_POWER = _UxGT("功率"); PROGMEM Language_Str MSG_START_PRINT = _UxGT("开始打å°"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("下一个"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("åˆå§‹"); From 1815866877787b6f6c6a2315fe565362272452c6 Mon Sep 17 00:00:00 2001 From: cccc Date: Wed, 8 Jul 2020 18:02:40 +0800 Subject: [PATCH 116/483] Show fixed V in Power Display with no V sensor (#18579) --- Marlin/src/inc/Conditionals_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 3e5cef9dc3c1..e6376aec21cc 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -356,7 +356,7 @@ #if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) #define HAS_POWER_MONITOR 1 #endif -#if ENABLED(POWER_MONITOR_VOLTAGE) && defined(POWER_MONITOR_FIXED_VOLTAGE) +#if ENABLED(POWER_MONITOR_CURRENT) && defined(POWER_MONITOR_FIXED_VOLTAGE) #define HAS_POWER_MONITOR_VREF 1 #endif #if BOTH(HAS_POWER_MONITOR_VREF, POWER_MONITOR_CURRENT) From c2e0e61fe85967ff4ef4bba7f1f49475f396ed53 Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 8 Jul 2020 23:28:32 +1200 Subject: [PATCH 117/483] Fix User Temp Sensor (1000), reversed Pt100 / Pt1000 (#18590) --- Marlin/src/module/temperature.cpp | 4 ++-- Marlin/src/module/thermistor/thermistor_1010.h | 2 ++ Marlin/src/module/thermistor/thermistor_1047.h | 2 ++ Marlin/src/module/thermistor/thermistor_110.h | 2 ++ Marlin/src/module/thermistor/thermistor_147.h | 2 ++ 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index d5de826b47ec..4d081f39c122 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1800,13 +1800,13 @@ void Temperature::init() { #if HAS_HOTEND #define _TEMP_MIN_E(NR) do{ \ - const int16_t tmin = _MAX(HEATER_ ##NR## _MINTEMP, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MINTEMP_IND].celsius)); \ + const int16_t tmin = _MAX(HEATER_ ##NR## _MINTEMP, TERN(HEATER_##NR##_USER_THERMISTOR, 0, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MINTEMP_IND].celsius))); \ temp_range[NR].mintemp = tmin; \ while (analog_to_celsius_hotend(temp_range[NR].raw_min, NR) < tmin) \ temp_range[NR].raw_min += TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) #define _TEMP_MAX_E(NR) do{ \ - const int16_t tmax = _MIN(HEATER_ ##NR## _MAXTEMP, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MAXTEMP_IND].celsius) - 1); \ + const int16_t tmax = _MIN(HEATER_ ##NR## _MAXTEMP, TERN(HEATER_##NR##_USER_THERMISTOR, 2000, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MAXTEMP_IND].celsius) - 1)); \ temp_range[NR].maxtemp = tmax; \ while (analog_to_celsius_hotend(temp_range[NR].raw_max, NR) > tmax) \ temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ diff --git a/Marlin/src/module/thermistor/thermistor_1010.h b/Marlin/src/module/thermistor/thermistor_1010.h index 71e830d952fd..161e1385f9e6 100644 --- a/Marlin/src/module/thermistor/thermistor_1010.h +++ b/Marlin/src/module/thermistor/thermistor_1010.h @@ -21,6 +21,8 @@ */ #pragma once +#define REVERSE_TEMP_SENSOR_RANGE_1010 1 + // Pt1000 with 1k0 pullup const temp_entry_t temptable_1010[] PROGMEM = { PtLine( 0, 1000, 1000), diff --git a/Marlin/src/module/thermistor/thermistor_1047.h b/Marlin/src/module/thermistor/thermistor_1047.h index 6a82d04be8fe..cc99771be677 100644 --- a/Marlin/src/module/thermistor/thermistor_1047.h +++ b/Marlin/src/module/thermistor/thermistor_1047.h @@ -21,6 +21,8 @@ */ #pragma once +#define REVERSE_TEMP_SENSOR_RANGE_1047 1 + // Pt1000 with 4k7 pullup const temp_entry_t temptable_1047[] PROGMEM = { // only a few values are needed as the curve is very flat diff --git a/Marlin/src/module/thermistor/thermistor_110.h b/Marlin/src/module/thermistor/thermistor_110.h index 32ee08580769..264b6f5bab3f 100644 --- a/Marlin/src/module/thermistor/thermistor_110.h +++ b/Marlin/src/module/thermistor/thermistor_110.h @@ -21,6 +21,8 @@ */ #pragma once +#define REVERSE_TEMP_SENSOR_RANGE_110 1 + // Pt100 with 1k0 pullup const temp_entry_t temptable_110[] PROGMEM = { // only a few values are needed as the curve is very flat diff --git a/Marlin/src/module/thermistor/thermistor_147.h b/Marlin/src/module/thermistor/thermistor_147.h index 61a82affa74b..b1e782e11169 100644 --- a/Marlin/src/module/thermistor/thermistor_147.h +++ b/Marlin/src/module/thermistor/thermistor_147.h @@ -21,6 +21,8 @@ */ #pragma once +#define REVERSE_TEMP_SENSOR_RANGE_147 1 + // Pt100 with 4k7 pullup const temp_entry_t temptable_147[] PROGMEM = { // only a few values are needed as the curve is very flat From 8a55f9405c12b02263df4377e3ad4fa26d4404c7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 8 Jul 2020 06:33:41 -0500 Subject: [PATCH 118/483] Fix some comments --- Marlin/Configuration.h | 6 +++--- Marlin/Configuration_adv.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ffa31a8d7227..0cef8928fd87 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1376,14 +1376,14 @@ // // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers time out, it will need X and Y homing again before Z homing. -// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing. // - Prevent Z homing when the Z probe is outside bed area. // //#define Z_SAFE_HOMING #if ENABLED(Z_SAFE_HOMING) - #define Z_SAFE_HOMING_X_POINT X_CENTER // X point for Z homing when homing all axes (G28). - #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_X_POINT X_CENTER // X point for Z homing + #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing #endif // Homing speeds (mm/m) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index edd66cade4c9..96c44f3dcaa8 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -36,7 +36,7 @@ // @section temperature //=========================================================================== -//=============================Thermal Settings ============================ +//============================= Thermal Settings ============================ //=========================================================================== /** From 915847b75aeaece5d9f4ef2f2c79ec464fd30a4b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 8 Jul 2020 06:33:30 -0500 Subject: [PATCH 119/483] Add `Cap:RUNOUT` Co-Authored-By: Julius ter Pelkwijk --- Marlin/src/gcode/host/M115.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index a7bf3f491c1d..41bcec798180 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -77,6 +77,9 @@ void GcodeSuite::M115() { // AUTOLEVEL (G29) cap_line(PSTR("AUTOLEVEL"), ENABLED(HAS_AUTOLEVEL)); + // RUNOUT (M412, M600) + cap_line(PSTR("RUNOUT"), ENABLED(FILAMENT_RUNOUT_SENSOR)); + // Z_PROBE (G30) cap_line(PSTR("Z_PROBE"), ENABLED(HAS_BED_PROBE)); @@ -89,9 +92,8 @@ void GcodeSuite::M115() { // SOFTWARE_POWER (M80, M81) cap_line(PSTR("SOFTWARE_POWER"), ENABLED(PSU_CONTROL)); - // CASE LIGHTS (M355) + // TOGGLE_LIGHTS (M355) cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(HAS_CASE_LIGHT)); - cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(HAS_CASE_LIGHT, PWM_PIN(CASE_LIGHT_PIN))); // EMERGENCY_PARSER (M108, M112, M410, M876) From ca78a57b1dd5bdec1aac9a2ee7bfd72fa3d7bfc5 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 9 Jul 2020 00:15:37 +0000 Subject: [PATCH 120/483] [cron] Bump distribution date (2020-07-09) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 10925fa1e4bf..fca6ab3c198d 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-08" + #define STRING_DISTRIBUTION_DATE "2020-07-09" #endif /** From 0eab9fc08cbef629b43ea42d77906896d64ccce1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 8 Jul 2020 19:21:04 -0500 Subject: [PATCH 121/483] Fix missing controller fan include --- Marlin/src/feature/power.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 71c0f1facbb5..5df016a2d21d 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -33,6 +33,10 @@ #include "../module/stepper/indirection.h" #include "../MarlinCore.h" +#if BOTH(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) + #include "controllerfan.h" +#endif + Power powerManager; millis_t Power::lastPowerOn; From 73fc0778b864ab1f5e5c3f065f5d8db75a0bbb7c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 8 Jul 2020 21:44:21 -0500 Subject: [PATCH 122/483] Consolidate probe clearance, add section debug (#18576) * Better section / function log * Add do_z_clearance motion function --- Marlin/src/core/debug_out.h | 9 ++++ Marlin/src/core/debug_section.h | 49 +++++++++++++++++++++ Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 21 +++------ Marlin/src/gcode/bedlevel/G26.cpp | 3 +- Marlin/src/gcode/bedlevel/G35.cpp | 9 ++-- Marlin/src/gcode/bedlevel/abl/G29.cpp | 14 +++--- Marlin/src/gcode/calibrate/G28.cpp | 49 ++++++--------------- Marlin/src/gcode/calibrate/G34_M422.cpp | 8 +--- Marlin/src/gcode/calibrate/G76_M871.cpp | 2 +- Marlin/src/gcode/calibrate/M666.cpp | 3 +- Marlin/src/gcode/control/T.cpp | 11 +---- Marlin/src/gcode/probe/G30.cpp | 5 +-- Marlin/src/gcode/probe/M401_M402.cpp | 4 +- Marlin/src/module/delta.cpp | 5 +-- Marlin/src/module/motion.cpp | 17 ++++--- Marlin/src/module/motion.h | 2 + Marlin/src/module/probe.cpp | 35 +++------------ Marlin/src/module/probe.h | 17 +++++-- 18 files changed, 132 insertions(+), 131 deletions(-) create mode 100644 Marlin/src/core/debug_section.h diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index 8be6523ca770..73c1ae4b90c2 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -26,6 +26,7 @@ // (or not) in a given .cpp file // +#undef DEBUG_SECTION #undef DEBUG_PRINT_P #undef DEBUG_ECHO_START #undef DEBUG_ERROR_START @@ -53,6 +54,10 @@ #undef DEBUG_DELAY #if DEBUG_OUT + + #include "debug_section.h" + #define DEBUG_SECTION(N,S,D) SectionLog N(PSTR(S),D) + #define DEBUG_PRINT_P(P) serialprintPGM(P) #define DEBUG_ECHO_START SERIAL_ECHO_START #define DEBUG_ERROR_START SERIAL_ERROR_START @@ -78,7 +83,10 @@ #define DEBUG_POS SERIAL_POS #define DEBUG_XYZ SERIAL_XYZ #define DEBUG_DELAY(ms) serial_delay(ms) + #else + + #define DEBUG_SECTION(...) NOOP #define DEBUG_PRINT_P(P) NOOP #define DEBUG_ECHO_START() NOOP #define DEBUG_ERROR_START() NOOP @@ -104,6 +112,7 @@ #define DEBUG_POS(...) NOOP #define DEBUG_XYZ(...) NOOP #define DEBUG_DELAY(...) NOOP + #endif #undef DEBUG_OUT diff --git a/Marlin/src/core/debug_section.h b/Marlin/src/core/debug_section.h new file mode 100644 index 000000000000..8181238890c8 --- /dev/null +++ b/Marlin/src/core/debug_section.h @@ -0,0 +1,49 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "serial.h" +#include "../module/motion.h" + +class SectionLog { +public: + SectionLog(PGM_P const msg=nullptr, bool inbug=true) { + the_msg = msg; + if ((debug = inbug)) echo_msg(PSTR(">>>")); + } + + ~SectionLog() { if (debug) echo_msg(PSTR("<<<")); } + +private: + PGM_P the_msg; + bool debug; + + void echo_msg(PGM_P const pre) { + serialprintPGM(pre); + if (the_msg) { + SERIAL_CHAR(' '); + serialprintPGM(the_msg); + } + SERIAL_CHAR(' '); + print_xyz(current_position); + } +}; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index da3477078a93..7981600d0a3f 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -462,7 +462,7 @@ // Manually Probe Mesh in areas that can't be reached by the probe // SERIAL_ECHOLNPGM("Manually probing unreachable points."); - do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); if (parser.seen('C') && !xy_seen) { @@ -780,9 +780,7 @@ probe.stow(); TERN_(HAS_LCD_MENU, ui.capture()); - #ifdef Z_AFTER_PROBING - probe.move_z_after_probing(); - #endif + probe.move_z_after_probing(); restore_ubl_active_state_and_leave(); @@ -858,7 +856,6 @@ echo_and_take_a_measurement(); const float z2 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES); const float thickness = ABS(z1 - z2); @@ -899,7 +896,7 @@ LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT); do_blocking_move_to(ppos); - do_blocking_move_to_z(z_clearance); + do_z_clearance(z_clearance); KEEPALIVE_STATE(PAUSED_FOR_USER); ui.capture(); @@ -915,7 +912,7 @@ if (click_and_hold()) { SERIAL_ECHOLNPGM("\nMesh only partially populated."); - do_blocking_move_to_z(Z_CLEARANCE_DEPLOY_PROBE); + do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); return restore_ubl_active_state_and_leave(); } @@ -940,7 +937,7 @@ void abort_fine_tune() { ui.return_to_status(); - do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); } @@ -1415,9 +1412,7 @@ } probe.stow(); - #ifdef Z_AFTER_PROBING - probe.move_z_after_probing(); - #endif + probe.move_z_after_probing(); if (abort_flag) { SERIAL_ECHOLNPGM("?Error probing point. Aborting operation."); @@ -1478,9 +1473,7 @@ } } probe.stow(); - #ifdef Z_AFTER_PROBING - probe.move_z_after_probing(); - #endif + probe.move_z_after_probing(); if (abort_flag || finish_incremental_LSF(&lsf_results)) { SERIAL_ECHOPGM("Could not complete LSF!"); diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 4e2e94a7144a..b60e03fc902b 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -622,8 +622,7 @@ void GcodeSuite::G26() { */ set_bed_leveling_enabled(!parser.seen('D')); - if (current_position.z < Z_CLEARANCE_BETWEEN_PROBES) - do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); #if DISABLED(NO_VOLUMETRICS) bool volumetric_was_enabled = parser.volumetric_enabled; diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 0f7c9b971223..2d0ad3f64d7f 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -75,10 +75,9 @@ static_assert(G35_PROBE_COUNT > 2, "TRAMMING_POINT_XY requires at least 3 XY pos * 51 - Counter-Clockwise M5 **/ void GcodeSuite::G35() { - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPGM(">>> G35"); - log_machine_info(); - } + DEBUG_SECTION(log_G35, "G35", DEBUGGING(LEVELING)); + + if (DEBUGGING(LEVELING)) log_machine_info(); float z_measured[G35_PROBE_COUNT] = { 0 }; @@ -181,8 +180,6 @@ void GcodeSuite::G35() { // Home Z after the alignment procedure process_subcommands_now_P(PSTR("G28Z")); - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< G35"); } #endif // ASSISTED_TRAMMING diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index dcb465f1d1e1..9a86118046f9 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -172,10 +172,8 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(DEBUG_LEVELING_FEATURE) const uint8_t old_debug_flags = marlin_debug_flags; if (seenQ) marlin_debug_flags |= MARLIN_DEBUG_LEVELING; - if (DEBUGGING(LEVELING)) { - DEBUG_POS(">>> G29", current_position); - log_machine_info(); - } + DEBUG_SECTION(log_G29, "G29", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) log_machine_info(); marlin_debug_flags = old_debug_flags; if (DISABLED(PROBE_MANUALLY) && seenQ) G29_RETURN(false); #endif @@ -188,7 +186,7 @@ G29_TYPE GcodeSuite::G29() { if (axis_unhomed_error()) G29_RETURN(false); if (!no_action && planner.leveling_active && parser.boolval('O')) { // Auto-level only if needed - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> Auto-level not needed, skip\n<<< G29"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> Auto-level not needed, skip"); G29_RETURN(false); } @@ -416,7 +414,7 @@ G29_TYPE GcodeSuite::G29() { // Deploy certain probes before starting probing #if HAS_BED_PROBE if (ENABLED(BLTOUCH)) - do_blocking_move_to_z(Z_CLEARANCE_DEPLOY_PROBE); + do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); else if (probe.deploy()) { set_bed_leveling_enabled(abl_should_enable); G29_RETURN(false); @@ -884,7 +882,7 @@ G29_TYPE GcodeSuite::G29() { // Sync the planner from the current_position if (planner.leveling_active) sync_plan_position(); - #if HAS_BED_PROBE && defined(Z_AFTER_PROBING) + #if HAS_BED_PROBE probe.move_z_after_probing(); #endif @@ -900,8 +898,6 @@ G29_TYPE GcodeSuite::G29() { report_current_position(); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< G29"); - G29_RETURN(isnan(measured_z)); } diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index b97caa96e3e8..5ec8fd5af47d 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -115,11 +115,11 @@ #if ENABLED(Z_SAFE_HOMING) inline void home_z_safely() { + DEBUG_SECTION(log_G28, "home_z_safely", DEBUGGING(LEVELING)); + // Disallow Z homing if X or Y homing is needed if (axis_unhomed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("home_z_safely >>>"); - sync_plan_position(); /** @@ -146,8 +146,6 @@ LCD_MESSAGEPGM(MSG_ZPROBE_OUT); SERIAL_ECHO_MSG(STR_ZPROBE_OUT_SER); } - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< home_z_safely"); } #endif // Z_SAFE_HOMING @@ -197,15 +195,10 @@ * */ void GcodeSuite::G28() { + DEBUG_SECTION(log_G28, "G28", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) log_machine_info(); - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPGM(">>> G28"); - log_machine_info(); - } - - #if ENABLED(LASER_MOVE_G28_OFF) - cutter.set_inline_enabled(false); // turn off laser - #endif + TERN_(LASER_MOVE_G28_OFF, cutter.set_inline_enabled(false)); // turn off laser TERN_(DWIN_CREALITY_LCD, HMI_flag.home_flag = true); @@ -220,14 +213,13 @@ void GcodeSuite::G28() { sync_plan_position(); SERIAL_ECHOLNPGM("Simulated Homing"); report_current_position(); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< G28"); return; } #endif // Home (O)nly if position is unknown if (!homing_needed() && parser.boolval('O')) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> homing not needed, skip\n<<< G28"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> homing not needed, skip"); return; } @@ -313,8 +305,6 @@ void GcodeSuite::G28() { home_all = homeX == homeY && homeX == homeZ, // All or None doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ; - destination = current_position; - #if Z_HOME_DIR > 0 // If homing away from BED do Z first if (doZ) homeaxis(Z_AXIS); @@ -322,17 +312,14 @@ void GcodeSuite::G28() { #endif const float z_homing_height = - (DISABLED(UNKNOWN_Z_NO_RAISE) || TEST(axis_known_position, Z_AXIS)) - ? (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) - : 0; + ENABLED(UNKNOWN_Z_NO_RAISE) && TEST(axis_known_position, Z_AXIS) + ? 0 + : (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT); - if (z_homing_height && (doX || doY || ENABLED(Z_SAFE_HOMING))) { + if (z_homing_height && (doX || doY || (ENABLED(Z_SAFE_HOMING) && doZ))) { // Raise Z before homing any other axes and z is not already high enough (never lower z) - destination.z = z_homing_height + (TEST(axis_known_position, Z_AXIS) ? 0.0f : current_position.z); - if (destination.z > current_position.z) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) to ", destination.z); - do_blocking_move_to_z(destination.z); - } + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); + do_z_clearance(z_homing_height, TEST(axis_known_position, Z_AXIS), DISABLED(UNKNOWN_Z_NO_RAISE)); } #if ENABLED(QUICK_HOME) @@ -387,15 +374,7 @@ void GcodeSuite::G28() { TERN(Z_SAFE_HOMING, home_z_safely(), homeaxis(Z_AXIS)); - #if HOMING_Z_WITH_PROBE && defined(Z_AFTER_PROBING) - #if Z_AFTER_HOMING > Z_AFTER_PROBING - do_blocking_move_to_z(Z_AFTER_HOMING); - #else - probe.move_z_after_probing(); - #endif - #elif defined(Z_AFTER_HOMING) - do_blocking_move_to_z(Z_AFTER_HOMING); - #endif + probe.move_z_after_homing(); } // doZ @@ -485,8 +464,6 @@ void GcodeSuite::G28() { if (ENABLED(NANODLP_Z_SYNC) && (doZ || ENABLED(NANODLP_ALL_AXIS))) SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< G28"); - #if HAS_L64XX // Set L6470 absolute position registers to counts // constexpr *might* move this to PROGMEM. diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index d0fa84b9ada5..6c85a7e021e2 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -56,10 +56,8 @@ * R points based on current probe offsets */ void GcodeSuite::G34() { - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPGM(">>> G34"); - log_machine_info(); - } + DEBUG_SECTION(log_G34, "G34", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) log_machine_info(); do { // break out on error @@ -367,8 +365,6 @@ void GcodeSuite::G34() { #endif }while(0); - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< G34"); } /** diff --git a/Marlin/src/gcode/calibrate/G76_M871.cpp b/Marlin/src/gcode/calibrate/G76_M871.cpp index bc7aee8f4daf..660db3225957 100644 --- a/Marlin/src/gcode/calibrate/G76_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M871.cpp @@ -104,7 +104,7 @@ void GcodeSuite::G76() { }; auto g76_probe = [](const TempSensorID sid, uint16_t &targ, const xy_pos_t &nozpos) { - do_blocking_move_to_z(5.0); // Raise nozzle before probing + do_z_clearance(5.0); // Raise nozzle before probing const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false if (isnan(measured_z)) SERIAL_ECHOLNPGM("!Received NAN. Aborting."); diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp index 721cbcfaa053..7f8d917b634e 100644 --- a/Marlin/src/gcode/calibrate/M666.cpp +++ b/Marlin/src/gcode/calibrate/M666.cpp @@ -38,7 +38,7 @@ * M666: Set delta endstop adjustment */ void GcodeSuite::M666() { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM(">>> M666"); + DEBUG_SECTION(log_M666, "M666", DEBUGGING(LEVELING)); LOOP_XYZ(i) { if (parser.seen(XYZ_CHAR(i))) { const float v = parser.value_linear_units(); @@ -46,7 +46,6 @@ if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", XYZ_CHAR(i), "] = ", delta_endstop_adj[i]); } } - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< M666"); } #elif HAS_EXTRA_ENDSTOPS diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 872b3d548801..1d34cf4d5862 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -48,10 +48,8 @@ */ void GcodeSuite::T(const uint8_t tool_index) { - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR(">>> T(", tool_index, ")"); - DEBUG_POS("BEFORE", current_position); - } + DEBUG_SECTION(log_T, "T", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("...(", tool_index, ")"); // Count this command as movement / activity reset_stepper_timeout(); @@ -75,9 +73,4 @@ void GcodeSuite::T(const uint8_t tool_index) { ); #endif - - if (DEBUGGING(LEVELING)) { - DEBUG_POS("AFTER", current_position); - DEBUG_ECHOLNPGM("<<< T()"); - } } diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index 0d8049158c57..167e364fa707 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -57,9 +57,8 @@ void GcodeSuite::G30() { restore_feedrate_and_scaling(); - #ifdef Z_AFTER_PROBING - if (raise_after == PROBE_PT_STOW) probe.move_z_after_probing(); - #endif + if (raise_after == PROBE_PT_STOW) + probe.move_z_after_probing(); report_current_position(); } diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp index a0a6c1cec5d5..af6a0cdbc95c 100644 --- a/Marlin/src/gcode/probe/M401_M402.cpp +++ b/Marlin/src/gcode/probe/M401_M402.cpp @@ -41,9 +41,7 @@ void GcodeSuite::M401() { */ void GcodeSuite::M402() { probe.stow(); - #ifdef Z_AFTER_PROBING - probe.move_z_after_probing(); - #endif + probe.move_z_after_probing(); report_current_position(); } diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 1f80b7fe722a..3e8b69045579 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -233,7 +233,8 @@ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) * This is like quick_home_xy() but for 3 towers. */ void home_delta() { - if (DEBUGGING(LEVELING)) DEBUG_POS(">>> home_delta", current_position); + DEBUG_SECTION(log_home_delta, "home_delta", DEBUGGING(LEVELING)); + // Init the current position of all carriages to 0,0,0 current_position.reset(); destination.reset(); @@ -283,8 +284,6 @@ void home_delta() { line_to_current_position(homing_feedrate(Z_AXIS)); } #endif - - if (DEBUGGING(LEVELING)) DEBUG_POS("<<< home_delta", current_position); } #endif // DELTA diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index cbf52bae223e..5b7845e45b4b 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -387,7 +387,8 @@ void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ * Plan a move to (X, Y, Z) and set the current_position */ void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s/*=0.0*/) { - if (DEBUGGING(LEVELING)) DEBUG_XYZ(">>> do_blocking_move_to", rx, ry, rz); + DEBUG_SECTION(log_move, "do_blocking_move_to", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) DEBUG_XYZ("> ", rx, ry, rz); const feedRate_t z_feedrate = fr_mm_s ?: homing_feedrate(Z_AXIS), xy_feedrate = fr_mm_s ?: feedRate_t(XY_PROBE_FEEDRATE_MM_S); @@ -471,8 +472,6 @@ void do_blocking_move_to(const float rx, const float ry, const float rz, const f #endif - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< do_blocking_move_to"); - planner.synchronize(); } @@ -507,6 +506,13 @@ void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRat do_blocking_move_to(raw.x, raw.y, z, fr_mm_s); } +void do_z_clearance(const float &zclear, const bool z_known/*=true*/, const bool raise_on_unknown/*=true*/, const bool lower_allowed/*=false*/) { + const bool rel = raise_on_unknown && !z_known; + float zdest = zclear + (rel ? current_position.z : 0.0f); + if (!lower_allowed) NOLESS(zdest, current_position.z); + do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); +} + // // Prepare to do endstop or probe moves with custom feedrates. // - Save / restore current feedrate and multiplier @@ -1272,11 +1278,12 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { * Home an individual linear axis */ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0) { + DEBUG_SECTION(log_move, "do_homing_move", DEBUGGING(LEVELING)); const feedRate_t real_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR(">>> do_homing_move(", axis_codes[axis], ", ", distance, ", "); + DEBUG_ECHOPAIR("...(", axis_codes[axis], ", ", distance, ", "); if (fr_mm_s) DEBUG_ECHO(fr_mm_s); else @@ -1349,8 +1356,6 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t // Re-enable stealthChop if used. Disable diag1 pin on driver. TERN_(SENSORLESS_HOMING, end_sensorless_homing_per_axis(axis, stealth_states)); } - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< do_homing_move(", axis_codes[axis], ")"); } /** diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 1348adb3bd5a..f51b205b3935 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -234,6 +234,8 @@ void remember_feedrate_and_scaling(); void remember_feedrate_scaling_off(); void restore_feedrate_and_scaling(); +void do_z_clearance(const float &zclear, const bool z_known=true, const bool raise_on_unknown=true, const bool lower_allowed=false); + // // Homing // diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index b077b3a0e397..524b6228bc54 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -260,15 +260,10 @@ xyz_pos_t Probe::offset; // Initialized by settings.load() * Raise Z to a minimum height to make room for a probe to move */ void Probe::do_z_raise(const float z_raise) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probe::move_z(", z_raise, ")"); - + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probe::do_z_raise(", z_raise, ")"); float z_dest = z_raise; if (offset.z < 0) z_dest -= offset.z; - - NOMORE(z_dest, Z_MAX_POS); - - if (z_dest > current_position.z) - do_blocking_move_to_z(z_dest); + do_z_clearance(z_dest); } FORCE_INLINE void probe_specific_action(const bool deploy) { @@ -410,16 +405,6 @@ bool Probe::set_deployed(const bool deploy) { return false; } -#ifdef Z_AFTER_PROBING - // After probing move to a preferred Z position - void Probe::move_z_after_probing() { - if (current_position.z != Z_AFTER_PROBING) { - do_blocking_move_to_z(Z_AFTER_PROBING); - current_position.z = Z_AFTER_PROBING; - } - } -#endif - /** * @brief Used by run_z_probe to do a single Z probe move. * @@ -439,7 +424,7 @@ bool Probe::set_deployed(const bool deploy) { * @return TRUE if the probe failed to trigger. */ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { - if (DEBUGGING(LEVELING)) DEBUG_POS(">>> Probe::probe_down_to_z", current_position); + DEBUG_SECTION(log_probe, "Probe::probe_down_to_z", DEBUGGING(LEVELING)); #if BOTH(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) thermalManager.wait_for_bed_heating(); @@ -499,8 +484,6 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { // Tell the planner where we actually are sync_plan_position(); - if (DEBUGGING(LEVELING)) DEBUG_POS("<<< Probe::probe_down_to_z", current_position); - return !probe_triggered; } @@ -513,8 +496,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { * @return The Z position of the bed at the current XY or NAN on error. */ float Probe::run_z_probe(const bool sanity_check/*=true*/) { - - if (DEBUGGING(LEVELING)) DEBUG_POS(">>> Probe::run_z_probe", current_position); + DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); auto try_to_probe = [&](PGM_P const plbl, const float &z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) { // Do a first probe at the fast speed @@ -527,7 +509,6 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { if (probe_fail) DEBUG_ECHOPGM(" No trigger."); if (early_fail) DEBUG_ECHOPGM(" Triggered early."); DEBUG_EOL(); - DEBUG_POS("<<< run_z_probe", current_position); } #else UNUSED(plbl); @@ -651,8 +632,6 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { #endif - if (DEBUGGING(LEVELING)) DEBUG_POS("<<< run_z_probe", current_position); - return measured_z; } @@ -666,9 +645,11 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { * - Return the probed Z position */ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/, const bool sanity_check/*=true*/) { + DEBUG_SECTION(log_probe, "Probe::probe_at_point", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) { DEBUG_ECHOLNPAIR( - ">>> Probe::probe_at_point(", LOGICAL_X_POSITION(rx), ", ", LOGICAL_Y_POSITION(ry), + "...(", LOGICAL_X_POSITION(rx), ", ", LOGICAL_Y_POSITION(ry), ", ", raise_after == PROBE_PT_RAISE ? "raise" : raise_after == PROBE_PT_STOW ? "stow" : "none", ", ", int(verbose_level), ", ", probe_relative ? "probe" : "nozzle", "_relative)" @@ -729,8 +710,6 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise #endif } - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< Probe::probe_at_point"); - return measured_z; } diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index abab33bf7114..f8cb9e9d00fa 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -79,9 +79,18 @@ class Probe { #endif - #ifdef Z_AFTER_PROBING - static void move_z_after_probing(); - #endif + static inline void move_z_after_probing() { + #ifdef Z_AFTER_PROBING + do_z_clearance(Z_AFTER_PROBING, true, true, true); // Move down still permitted + #endif + } + static inline void move_z_after_homing() { + #ifdef Z_AFTER_HOMING + do_z_clearance(Z_AFTER_HOMING, true, true, true); + #elif defined(Z_AFTER_PROBING) + move_z_after_probing(); + #endif + } static float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); static inline float probe_at_point(const xy_pos_t &pos, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true) { return probe_at_point(pos.x, pos.y, raise_after, verbose_level, probe_relative, sanity_check); @@ -89,6 +98,8 @@ class Probe { #else + FORCE_INLINE static void move_z_after_homing() {} + static constexpr xyz_pos_t offset = xyz_pos_t({ 0, 0, 0 }); // See #16767 static bool set_deployed(const bool) { return false; } From 95c2cc3966f1c1f1cbaeb5085a4f501a07572700 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Thu, 9 Jul 2020 08:43:59 +0200 Subject: [PATCH 123/483] Remove outdated comment (#18597) --- Marlin/Configuration.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0cef8928fd87..2d50a9f8b218 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1162,7 +1162,6 @@ * * RAMPS-based boards use SERVO3_PIN for the first runout sensor. * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. - * By default the firmware assumes HIGH=FILAMENT PRESENT. */ //#define FILAMENT_RUNOUT_SENSOR #if ENABLED(FILAMENT_RUNOUT_SENSOR) From abc5c93986cde6f98916b0dfc259996e1a6a8e72 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 9 Jul 2020 02:01:03 -0500 Subject: [PATCH 124/483] Clean up some MMU comments --- Marlin/Configuration_adv.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 96c44f3dcaa8..f1c52a0ee8bc 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3429,12 +3429,15 @@ /** * MMU Extruder Sensor - * Add support for Prusa IR Sensor (or other) to detect that filament reach the extruder to make loading filament more reliable - * If your extruder is equipped with a filament sensor located less than 38mm from the gears you can use this feature - * During loading to the extruder, the sensor will stop the loading command when he's triggered and make a last move to load filament to the gears - * If no filament is detected, MMU2 will make more loading attemps, if finally no filament is detected, the printer will enter in runout state + * + * Support for a Prusa (or other) IR Sensor to detect filament near the extruder + * and make loading more reliable. Suitable for an extruder equipped with a filament + * sensor less than 38mm from the gears. + * + * During loading the extruder will stop when the sensor is triggered, then do a last + * move up to the gears. If no filament is detected, the MMU2 can make some more attempts. + * If all attempts fail, a filament runout will be triggered. */ - //#define MMU_EXTRUDER_SENSOR #if ENABLED(MMU_EXTRUDER_SENSOR) #define MMU_LOADING_ATTEMPTS_NR 5 //max. number of attempts to load filament if first load fail @@ -3442,10 +3445,9 @@ /** * Using a sensor like the MMU2S - * This mode only work if you have a MK3S extruder with sensor sensing the extruder idler mmu2s + * This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S. * See https://help.prusa3d.com/en/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560, step 11 */ - //#define PRUSA_MMU2_S_MODE #if ENABLED(PRUSA_MMU2_S_MODE) #define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries) From b0c6cfb0511b8d71fec26ab91cd945f3d623b3c0 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Thu, 9 Jul 2020 10:11:57 +0200 Subject: [PATCH 125/483] MarlinUI support for up to 5 Material Presets (#18488) - Add `I` preset parameter to `G26`, `M106`, `M140`, and `M190`. - Extend menu items to permit a string interpolation. - Keep material names in a list and interpolate in menu items. - Extend material presets to support up to 5 predefined materials. Co-authored-by: Scott Lahteine --- Marlin/src/gcode/bedlevel/G26.cpp | 57 +++++- Marlin/src/gcode/temp/M104_M109.cpp | 76 ++++++-- Marlin/src/gcode/temp/M106_M107.cpp | 32 +++- Marlin/src/gcode/temp/M140_M190.cpp | 70 ++++++- Marlin/src/inc/Conditionals_LCD.h | 8 - Marlin/src/inc/Conditionals_post.h | 14 +- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 14 +- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 16 +- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 36 ---- Marlin/src/lcd/language/language_an.h | 31 +-- Marlin/src/lcd/language/language_bg.h | 31 +-- Marlin/src/lcd/language/language_ca.h | 31 +-- Marlin/src/lcd/language/language_cz.h | 39 ++-- Marlin/src/lcd/language/language_da.h | 31 +-- Marlin/src/lcd/language/language_de.h | 39 ++-- Marlin/src/lcd/language/language_el.h | 31 +-- Marlin/src/lcd/language/language_el_gr.h | 31 +-- Marlin/src/lcd/language/language_en.h | 37 ++-- Marlin/src/lcd/language/language_es.h | 39 ++-- Marlin/src/lcd/language/language_eu.h | 39 ++-- Marlin/src/lcd/language/language_fi.h | 31 +-- Marlin/src/lcd/language/language_fr.h | 39 ++-- Marlin/src/lcd/language/language_gl.h | 39 ++-- Marlin/src/lcd/language/language_hr.h | 31 +-- Marlin/src/lcd/language/language_hu.h | 39 ++-- Marlin/src/lcd/language/language_it.h | 39 ++-- Marlin/src/lcd/language/language_jp_kana.h | 31 +-- Marlin/src/lcd/language/language_ko_KR.h | 19 +- Marlin/src/lcd/language/language_nl.h | 31 +-- Marlin/src/lcd/language/language_pl.h | 39 ++-- Marlin/src/lcd/language/language_pt.h | 31 +-- Marlin/src/lcd/language/language_pt_br.h | 39 ++-- Marlin/src/lcd/language/language_ro.h | 39 ++-- Marlin/src/lcd/language/language_ru.h | 46 +++-- Marlin/src/lcd/language/language_sk.h | 39 ++-- Marlin/src/lcd/language/language_tr.h | 39 ++-- Marlin/src/lcd/language/language_uk.h | 39 ++-- Marlin/src/lcd/language/language_vi.h | 39 ++-- Marlin/src/lcd/language/language_zh_CN.h | 39 ++-- Marlin/src/lcd/language/language_zh_TW.h | 39 ++-- Marlin/src/lcd/lcdprint.cpp | 19 +- Marlin/src/lcd/lcdprint.h | 63 +++++- Marlin/src/lcd/menu/menu.cpp | 1 + Marlin/src/lcd/menu/menu.h | 200 ++++++++++++-------- Marlin/src/lcd/menu/menu_addon.h | 3 - Marlin/src/lcd/menu/menu_configuration.cpp | 28 +-- Marlin/src/lcd/menu/menu_filament.cpp | 23 ++- Marlin/src/lcd/menu/menu_temperature.cpp | 150 ++++++--------- Marlin/src/lcd/menu/menu_ubl.cpp | 97 ++++++---- Marlin/src/lcd/ultralcd.cpp | 31 ++- Marlin/src/lcd/ultralcd.h | 9 +- 51 files changed, 1181 insertions(+), 872 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index b60e03fc902b..09c9e8fbeb18 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -47,6 +47,8 @@ * * H # Hotend Set the Nozzle Temperature. If not specified, a default of 205 C. will be assumed. * + * I # Preset Heat the Nozzle and Bed based on a Material Preset (if material presets are defined). + * * F # Filament Used to specify the diameter of the filament being used. If not specified * 1.75mm filament is assumed. If you are not getting acceptable results by using the * 'correct' numbers, you can scale this number up or down a little bit to change the amount @@ -140,7 +142,7 @@ constexpr float g26_e_axis_feedrate = 0.025; static MeshFlags circle_flags, horizontal_mesh_line_flags, vertical_mesh_line_flags; -float random_deviation = 0.0; +float g26_random_deviation = 0.0; static bool g26_retracted = false; // Track the retracted state of the nozzle so mismatched // retracts/recovers won't result in a bad state. @@ -193,7 +195,7 @@ mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { f += (g26_xy_pos - m).magnitude() / 15.0f; // Add the specified amount of Random Noise to our search - if (random_deviation > 1.0) f += random(0.0, random_deviation); + if (g26_random_deviation > 1.0) f += random(0.0, g26_random_deviation); if (f < closest) { closest = f; // Found a closer un-printed location @@ -508,15 +510,35 @@ void GcodeSuite::G26() { bool g26_continue_with_closest = parser.boolval('C'), g26_keep_heaters_on = parser.boolval('K'); + // Accept 'I' if temperature presets are defined + const uint8_t preset_index = (0 + #if PREHEAT_COUNT + + (parser.seenval('I') ? _MIN(parser.value_byte(), PREHEAT_COUNT - 1) + 1 : 0) + #endif + ); + #if HAS_HEATED_BED - if (parser.seenval('B')) { - g26_bed_temp = parser.value_celsius(); - if (g26_bed_temp && !WITHIN(g26_bed_temp, 40, BED_MAX_TARGET)) { + + // Get a temperature from 'I' or 'B' + int16_t bedtemp = 0; + + // Use the 'I' index if temperature presets are defined + #if PREHEAT_COUNT + if (preset_index) bedtemp = ui.material_preset[preset_index - 1].bed_temp; + #endif + + // Look for 'B' Bed Temperature + if (parser.seenval('B')) bedtemp = parser.value_celsius(); + + if (bedtemp) { + if (!WITHIN(bedtemp, 40, BED_MAX_TARGET)) { SERIAL_ECHOLNPAIR("?Specified bed temperature not plausible (40-", int(BED_MAX_TARGET), "C)."); return; } + g26_bed_temp = bedtemp; } - #endif + + #endif // HAS_HEATED_BED if (parser.seenval('L')) { g26_layer_height = parser.value_linear_units(); @@ -580,20 +602,34 @@ void GcodeSuite::G26() { g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size - if (parser.seenval('H')) { - g26_hotend_temp = parser.value_celsius(); - if (!WITHIN(g26_hotend_temp, 165, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT))) { + // Get a temperature from 'I' or 'H' + int16_t noztemp = 0; + + // Accept 'I' if temperature presets are defined + #if PREHEAT_COUNT + if (preset_index) noztemp = ui.material_preset[preset_index - 1].hotend_temp; + #endif + + // Look for 'H' Hotend Temperature + if (parser.seenval('H')) noztemp = parser.value_celsius(); + + // If any preset or temperature was specified + if (noztemp) { + if (!WITHIN(noztemp, 165, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT))) { SERIAL_ECHOLNPGM("?Specified nozzle temperature not plausible."); return; } + g26_hotend_temp = noztemp; } + // 'U' to Randomize and optionally set circle deviation if (parser.seen('U')) { randomSeed(millis()); // This setting will persist for the next G26 - random_deviation = parser.has_value() ? parser.value_float() : 50.0; + g26_random_deviation = parser.has_value() ? parser.value_float() : 50.0; } + // Get repeat from 'R', otherwise do one full circuit int16_t g26_repeats; #if HAS_LCD_MENU g26_repeats = parser.intval('R', GRID_MAX_POINTS + 1); @@ -610,6 +646,7 @@ void GcodeSuite::G26() { return; } + // Set a position with 'X' and/or 'Y'. Default: current_position g26_xy_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x, parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position.y); if (!position_is_reachable(g26_xy_pos)) { diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index bb453412d7a6..f8eca4bc028f 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -50,7 +50,12 @@ #endif /** - * M104: Set hot end temperature + * M104: Set Hotend Temperature target and return immediately + * + * Parameters: + * I : Material Preset index (if material presets are defined) + * T : Tool index. If omitted, applies to the active tool + * S : The target temperature in current units */ void GcodeSuite::M104() { @@ -63,8 +68,25 @@ void GcodeSuite::M104() { if (target_extruder < 0) return; #endif - if (parser.seenval('S')) { - const int16_t temp = parser.value_celsius(); + bool got_temp = false; + int16_t temp = 0; + + // Accept 'I' if temperature presets are defined + #if PREHEAT_COUNT + got_temp = parser.seenval('I'); + if (got_temp) { + const uint8_t index = parser.value_byte(); + temp = ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].hotend_temp; + } + #endif + + // If no 'I' get the temperature from 'S' + if (!got_temp) { + got_temp = parser.seenval('S'); + if (got_temp) temp = parser.value_celsius(); + } + + if (got_temp) { #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) singlenozzle_temp[target_extruder] = temp; if (target_extruder != active_extruder) return; @@ -91,10 +113,25 @@ void GcodeSuite::M104() { } /** - * M109: Sxxx Wait for hotend(s) to reach temperature. Waits only when heating. - * Rxxx Wait for hotend(s) to reach temperature. Waits when heating and cooling. + * M109: Set Hotend Temperature target and wait + * + * Parameters + * I : Material Preset index (if material presets are defined) + * T : Tool index. If omitted, applies to the active tool + * S : The target temperature in current units. Wait for heating only. + * R : The target temperature in current units. Wait for heating and cooling. * - * With PRINTJOB_TIMER_AUTOSTART also start the job timer on heating and stop it if turned off. + * With AUTOTEMP... + * F : Autotemp Scaling Factor. Set non-zero to enable Auto-temp. + * S : Minimum temperature, in current units. + * B : Maximum temperature, in current units. + * + * Examples + * M109 S100 : Set target to 100°. Wait until the hotend is at or above 100°. + * M109 R150 : Set target to 150°. Wait until the hotend gets close to 150°. + * + * With PRINTJOB_TIMER_AUTOSTART turning on heaters will start the print job timer + * (used by printingIsActive, etc.) and turning off heaters will stop the timer. */ void GcodeSuite::M109() { @@ -107,10 +144,27 @@ void GcodeSuite::M109() { if (target_extruder < 0) return; #endif - const bool no_wait_for_cooling = parser.seenval('S'), - set_temp = no_wait_for_cooling || parser.seenval('R'); - if (set_temp) { - const int16_t temp = parser.value_celsius(); + bool got_temp = false; + int16_t temp = 0; + + // Accept 'I' if temperature presets are defined + #if PREHEAT_COUNT + got_temp = parser.seenval('I'); + if (got_temp) { + const uint8_t index = parser.value_byte(); + temp = ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].hotend_temp; + } + #endif + + // Get the temperature from 'S' or 'R' + bool no_wait_for_cooling = false; + if (!got_temp) { + no_wait_for_cooling = parser.seenval('S'); + got_temp = no_wait_for_cooling || parser.seenval('R'); + if (got_temp) temp = int16_t(parser.value_celsius()); + } + + if (got_temp) { #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) singlenozzle_temp[target_extruder] = temp; if (target_extruder != active_extruder) return; @@ -139,7 +193,7 @@ void GcodeSuite::M109() { TERN_(AUTOTEMP, planner.autotemp_M104_M109()); - if (set_temp) + if (got_temp) (void)thermalManager.wait_for_hotend(target_extruder, no_wait_for_cooling); } diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index 7fbc53297e8c..ffc00eafa32a 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -28,6 +28,10 @@ #include "../../module/motion.h" #include "../../module/temperature.h" +#if PREHEAT_COUNT + #include "../../lcd/ultralcd.h" +#endif + #if ENABLED(SINGLENOZZLE) #define _ALT_P active_extruder #define _CNT_P EXTRUDERS @@ -39,6 +43,7 @@ /** * M106: Set Fan Speed * + * I Material Preset index (if material presets are defined) * S Speed between 0-255 * P Fan index, if more than one fan * @@ -50,19 +55,32 @@ * 3-255 = Set the speed for use with T2 */ void GcodeSuite::M106() { - const uint8_t p = parser.byteval('P', _ALT_P); + const uint8_t pfan = parser.byteval('P', _ALT_P); - if (p < _CNT_P) { + if (pfan < _CNT_P) { #if ENABLED(EXTRA_FAN_SPEED) const uint16_t t = parser.intval('T'); - if (t > 0) return thermalManager.set_temp_fan_speed(p, t); + if (t > 0) return thermalManager.set_temp_fan_speed(pfan, t); + #endif + + const uint16_t dspeed = parser.seen('A') ? thermalManager.fan_speed[active_extruder] : 255; + + uint16_t speed = dspeed; + + // Accept 'I' if temperature presets are defined + #if PREHEAT_COUNT + const bool got_preset = parser.seenval('I'); + if (got_preset) speed = ui.material_preset[_MIN(parser.value_byte(), PREHEAT_COUNT - 1)].fan_speed; + #else + constexpr bool got_preset = false; #endif - uint16_t d = parser.seen('A') ? thermalManager.fan_speed[active_extruder] : 255; - uint16_t s = parser.ushortval('S', d); - NOMORE(s, 255U); - thermalManager.set_fan_speed(p, s); + if (!got_preset && parser.seenval('S')) + speed = parser.value_ushort(); + + // Set speed, with constraint + thermalManager.set_fan_speed(pfan, speed); } } diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index 394ce2de1796..4af09bdfe038 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -47,11 +47,33 @@ /** * M140: Set bed temperature + * + * I : Preset index (if material presets are defined) + * S : The target temperature in current units */ void GcodeSuite::M140() { if (DEBUGGING(DRYRUN)) return; - if (parser.seenval('S')) { - thermalManager.setTargetBed(parser.value_celsius()); + + bool got_temp = false; + int16_t temp = 0; + + // Accept 'I' if temperature presets are defined + #if PREHEAT_COUNT + got_temp = parser.seenval('I'); + if (got_temp) { + const uint8_t index = parser.value_byte(); + temp = ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].bed_temp; + } + #endif + + // If no 'I' get the temperature from 'S' + if (!got_temp) { + got_temp = parser.seenval('S'); + if (got_temp) temp = parser.value_celsius(); + } + + if (got_temp) { + thermalManager.setTargetBed(temp); #if ENABLED(PRINTJOB_TIMER_AUTOSTART) /** @@ -65,20 +87,48 @@ void GcodeSuite::M140() { } /** - * M190: Sxxx Wait for bed current temp to reach target temp. Waits only when heating - * Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling + * M190 - Set Bed Temperature target and wait + * + * Parameters: + * I : Preset index (if material presets are defined) + * S : The target temperature in current units. Wait for heating only. + * R : The target temperature in current units. Wait for heating and cooling. * - * With PRINTJOB_TIMER_AUTOSTART also start the job timer on heating. + * Examples: + * M190 S60 : Set target to 60°. Wait until the bed is at or above 60°. + * M190 R40 : Set target to 40°. Wait until the bed gets close to 40°. + * + * With PRINTJOB_TIMER_AUTOSTART turning on heaters will start the print job timer + * (used by printingIsActive, etc.) and turning off heaters will stop the timer. */ void GcodeSuite::M190() { if (DEBUGGING(DRYRUN)) return; - const bool no_wait_for_cooling = parser.seenval('S'); - if (no_wait_for_cooling || parser.seenval('R')) { - thermalManager.setTargetBed(parser.value_celsius()); - TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.check_timer_autostart(true, false)); + bool got_temp = false; + int16_t temp = 0; + + // Accept 'I' if temperature presets are defined + #if PREHEAT_COUNT + got_temp = parser.seenval('I'); + if (got_temp) { + const uint8_t index = parser.value_byte(); + temp = ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].bed_temp; + } + #endif + + // Get the temperature from 'S' or 'R' + bool no_wait_for_cooling = false; + if (!got_temp) { + no_wait_for_cooling = parser.seenval('S'); + got_temp = no_wait_for_cooling || parser.seenval('R'); + if (got_temp) temp = int16_t(parser.value_celsius()); } - else return; + + if (!got_temp) return; + + thermalManager.setTargetBed(temp); + + TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.check_timer_autostart(true, false)); ui.set_status_P(thermalManager.isHeatingBed() ? GET_TEXT(MSG_BED_HEATING) : GET_TEXT(MSG_BED_COOLING)); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 877518c89764..10755c180ea0 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -589,14 +589,6 @@ #define NUM_SERVOS 0 #endif -#ifndef PREHEAT_1_LABEL - #define PREHEAT_1_LABEL "PLA" -#endif - -#ifndef PREHEAT_2_LABEL - #define PREHEAT_2_LABEL "ABS" -#endif - /** * Set a flag for a servo probe (or BLTouch) */ diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 04af5e40c94f..6d9998b69290 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2129,9 +2129,17 @@ #endif #if HAS_TEMPERATURE && EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD) - #define PREHEAT_COUNT 2 -#else - #undef PREHEAT_COUNT + #ifdef PREHEAT_5_LABEL + #define PREHEAT_COUNT 5 + #elif defined(PREHEAT_4_LABEL) + #define PREHEAT_COUNT 4 + #elif defined(PREHEAT_3_LABEL) + #define PREHEAT_COUNT 3 + #elif defined(PREHEAT_2_LABEL) + #define PREHEAT_COUNT 2 + #elif defined(PREHEAT_1_LABEL) + #define PREHEAT_COUNT 1 + #endif #endif /** diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 21e8130850ca..5b1de8008aab 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -1004,7 +1004,7 @@ void MarlinUI::draw_status_screen() { int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; while (--pad >= 0) { lcd_put_wchar(' '); n--; } } - n = lcd_put_u8str_ind_P(pstr, itemIndex, n); + n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); if (valstr) n -= lcd_put_u8str_max(valstr, n); for (; n > 0; --n) lcd_put_wchar(' '); } @@ -1012,20 +1012,20 @@ void MarlinUI::draw_status_screen() { // Draw a generic menu item with pre_char (if selected) and post_char void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { lcd_put_wchar(0, row, sel ? pre_char : ' '); - uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH - 2); + uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2); for (; n; --n) lcd_put_wchar(' '); lcd_put_wchar(post_char); } // Draw a menu item with a (potentially) editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { - const uint8_t vlen = data ? (pgm ? utf8_strlen_P(data) : utf8_strlen(data)) : 0; + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm) { + const uint8_t vlen = inStr ? (pgm ? utf8_strlen_P(inStr) : utf8_strlen(inStr)) : 0; lcd_put_wchar(0, row, sel ? LCD_STR_ARROW_RIGHT[0] : ' '); - uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH - 2 - vlen); + uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vlen); if (vlen) { lcd_put_wchar(':'); for (; n; --n) lcd_put_wchar(' '); - if (pgm) lcd_put_u8str_P(data); else lcd_put_u8str(data); + if (pgm) lcd_put_u8str_P(inStr); else lcd_put_u8str(inStr); } } @@ -1033,7 +1033,7 @@ void MarlinUI::draw_status_screen() { void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { ui.encoder_direction_normal(); - uint8_t n = lcd_put_u8str_ind_P(0, 1, pstr, itemIndex, LCD_WIDTH - 1); + uint8_t n = lcd_put_u8str_ind_P(0, 1, pstr, itemIndex, itemString, LCD_WIDTH - 1); if (value != nullptr) { lcd_put_wchar(':'); int len = utf8_strlen(value); diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index e26b990a2474..728d028deb70 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -359,7 +359,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop n -= MENU_FONT_WIDTH; } - n = lcd_put_u8str_ind_P(pstr, itemIndex, n / (MENU_FONT_WIDTH)) * (MENU_FONT_WIDTH); + n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n / (MENU_FONT_WIDTH)) * (MENU_FONT_WIDTH); if (valstr) n -= lcd_put_u8str_max(valstr, n); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); } @@ -368,7 +368,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Draw a generic menu item void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char, const char post_char) { if (mark_as_selected(row, sel)) { - pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH - 1) * (MENU_FONT_WIDTH); + pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 1) * (MENU_FONT_WIDTH); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); lcd_put_wchar(LCD_PIXEL_WIDTH - (MENU_FONT_WIDTH), row_y2, post_char); lcd_put_wchar(' '); @@ -376,17 +376,17 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } // Draw a menu item with an editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm) { if (mark_as_selected(row, sel)) { - const uint8_t vallen = (pgm ? utf8_strlen_P(data) : utf8_strlen((char*)data)), - pixelwidth = (pgm ? uxg_GetUtf8StrPixelWidthP(u8g.getU8g(), data) : uxg_GetUtf8StrPixelWidth(u8g.getU8g(), (char*)data)); + const uint8_t vallen = (pgm ? utf8_strlen_P(inStr) : utf8_strlen((char*)inStr)), + pixelwidth = (pgm ? uxg_GetUtf8StrPixelWidthP(u8g.getU8g(), inStr) : uxg_GetUtf8StrPixelWidth(u8g.getU8g(), (char*)inStr)); - pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, LCD_WIDTH - 2 - vallen) * (MENU_FONT_WIDTH); + pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vallen) * (MENU_FONT_WIDTH); if (vallen) { lcd_put_wchar(':'); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); lcd_moveto(LCD_PIXEL_WIDTH - _MAX((MENU_FONT_WIDTH) * vallen, pixelwidth + 2), row_y2); - if (pgm) lcd_put_u8str_P(data); else lcd_put_u8str((char*)data); + if (pgm) lcd_put_u8str_P(inStr); else lcd_put_u8str((char*)inStr); } } } @@ -423,7 +423,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Assume the label is alpha-numeric (with a descender) bool onpage = PAGE_CONTAINS(baseline - (EDIT_FONT_ASCENT - 1), baseline + EDIT_FONT_DESCENT); - if (onpage) lcd_put_u8str_ind_P(0, baseline, pstr, itemIndex); + if (onpage) lcd_put_u8str_ind_P(0, baseline, pstr, itemIndex, itemString); // If a value is included, print a colon, then print the value right-justified if (value != nullptr) { diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index b83a175589c2..61a0a94abcfe 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -230,42 +230,6 @@ #define PAGE_UNDER(yb) ((yb) >= u8g.getU8g()->current_page.y0) // Does the current page precede a region bottom? #define PAGE_CONTAINS(ya, yb) ((yb) >= u8g.getU8g()->current_page.y0 && (ya) <= u8g.getU8g()->current_page.y1) // Do two vertical regions overlap? -// Only Western languages support big / small fonts -#if DISABLED(DISPLAY_CHARSET_ISO10646_1) - #undef USE_BIG_EDIT_FONT - #undef USE_SMALL_INFOFONT -#endif - -#define MENU_FONT_NAME ISO10646_1_5x7 -#define MENU_FONT_WIDTH 6 -#define MENU_FONT_ASCENT 10 -#define MENU_FONT_DESCENT 2 -#define MENU_FONT_HEIGHT (MENU_FONT_ASCENT + MENU_FONT_DESCENT) - -#if ENABLED(USE_BIG_EDIT_FONT) - #define EDIT_FONT_NAME u8g_font_9x18 - #define EDIT_FONT_WIDTH 9 - #define EDIT_FONT_ASCENT 10 - #define EDIT_FONT_DESCENT 3 -#else - #define EDIT_FONT_NAME MENU_FONT_NAME - #define EDIT_FONT_WIDTH MENU_FONT_WIDTH - #define EDIT_FONT_ASCENT MENU_FONT_ASCENT - #define EDIT_FONT_DESCENT MENU_FONT_DESCENT -#endif -#define EDIT_FONT_HEIGHT (EDIT_FONT_ASCENT + EDIT_FONT_DESCENT) - -// Get the Ascent, Descent, and total Height for the Info Screen font -#if ENABLED(USE_SMALL_INFOFONT) - extern const u8g_fntpgm_uint8_t u8g_font_6x9[]; - #define INFO_FONT_ASCENT 7 -#else - #define INFO_FONT_ASCENT 8 -#endif -#define INFO_FONT_DESCENT 2 -#define INFO_FONT_HEIGHT (INFO_FONT_ASCENT + INFO_FONT_DESCENT) -#define INFO_FONT_WIDTH 6 - #ifndef FSMC_UPSCALE #define FSMC_UPSCALE 2 #endif diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index 89c36f754ffb..324c5b2c0109 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -56,20 +56,23 @@ namespace Language_an { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Achustar desfases"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicau"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Establir orichen"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precalentar ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Precalentar ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Base"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Conf"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Precalentar ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Precalentar ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Boquilla ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Base"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Precalentar ") PREHEAT_2_LABEL _UxGT(" Conf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precalentar ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Precalentar ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Base"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Conf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Precalentar $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Precalentar $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Precal. $ Boquilla"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Precal. $ Boquilla ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Precalentar $ Tot"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Precalentar $ Base"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Precalentar $ Conf"); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Enfriar"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Enchegar Fuent"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Amortar Fuent"); diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index aa7875e44bf9..e7c497e7eb3c 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -46,20 +46,23 @@ namespace Language_bg { PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Паркиране"); PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Задай Ðачало"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Изходна точка"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ПодгрÑване ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ПодгрÑване ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("ПодгрÑване ") PREHEAT_1_LABEL _UxGT(" Дюза"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("ПодгрÑване ") PREHEAT_1_LABEL _UxGT(" Дюза ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Ð’Ñички"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Легло"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("ÐаÑтройки ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("ПодгрÑване ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("ПодгрÑване ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("ПодгрÑване ") PREHEAT_2_LABEL _UxGT(" Дюза"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("ПодгрÑване ") PREHEAT_2_LABEL _UxGT(" Дюза ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Подгр. ") PREHEAT_2_LABEL _UxGT(" Ð’Ñички"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Подгр. ") PREHEAT_2_LABEL _UxGT(" Легло"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("ÐаÑтройки ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ПодгрÑване ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ПодгрÑване ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("ПодгрÑване ") PREHEAT_1_LABEL _UxGT(" Дюза"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("ПодгрÑване ") PREHEAT_1_LABEL _UxGT(" Дюза ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Ð’Ñички"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Легло"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("ÐаÑтройки ") PREHEAT_1_LABEL; + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("ПодгрÑване $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("ПодгрÑване $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("ПодгрÑване $ Дюза"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("ПодгрÑване $ Дюза ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Подгр. $ Ð’Ñички"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Подгр. $ Легло"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("ÐаÑтройки $"); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждане"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Вкл. захранване"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Изкл. захранване"); diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index 93a0af243ec1..3eed7933c55d 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -54,20 +54,23 @@ namespace Language_ca { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ajusta decalatge"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Decalatge aplicat"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Estableix origen"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preescalfa ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preescalfa ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Llit"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Conf."); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Preescalfa ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Preescalfa ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preescalfa ") PREHEAT_2_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Preescalfa ") PREHEAT_2_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preescalfa ") PREHEAT_2_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preescalfa ") PREHEAT_2_LABEL _UxGT(" Llit"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preescalfa ") PREHEAT_2_LABEL _UxGT(" Conf."); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preescalfa ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preescalfa ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Llit"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Conf."); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Preescalfa $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Preescalfa $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preescalfa $ End"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preescalfa $ End ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preescalfa $ Tot"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preescalfa $ Llit"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preescalfa $ Conf."); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Refreda"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudeix"); diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index a46b4affda8e..3796284f4ee5 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -79,20 +79,23 @@ namespace Language_cz { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Nastavit ofsety"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastaveny"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nastavit poÄátek"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Zahřát ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Zahřát ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" vÅ¡e"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" podlož"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" nast"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Zahřát ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Zahřát ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" end ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" vÅ¡e"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" podlož"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Zahřát ") PREHEAT_2_LABEL _UxGT(" nast"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Zahřát ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Zahřát ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" vÅ¡e"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" podlož"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" nast"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Zahřát $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Zahřát $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Zahřát $ end"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Zahřát $ end ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Zahřát $ vÅ¡e"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Zahřát $ podlož"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Zahřát $ nast"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Zahřát vlastní"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Zchladit"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Ovládání laseru"); @@ -156,14 +159,14 @@ namespace Language_cz { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Konec úprav sítÄ›"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastní síť"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("VytvoÅ™it síť"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Síť bodů ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Síť bodů ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Síť bodů $"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola sítÄ› $"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená síť bodů"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Upravit výšku sítÄ›"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Zkontrolovat síť"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Kontrola sítÄ› ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Kontrola sítÄ› ") PREHEAT_2_LABEL; PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast. sítÄ›"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 zahřívání podl."); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 zařívání trysky"); diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index d8c63447d82d..fc69aa55c334 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -49,20 +49,23 @@ namespace Language_da { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Sæt forsk. af home"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Forsk. er nu aktiv"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Sæt origin"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Forvarm ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Forvarm ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end") - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Alle"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" conf"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Forvarm ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Forvarm ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end") - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" end ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" Alle"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Forvarm ") PREHEAT_2_LABEL _UxGT(" conf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Forvarm ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Forvarm ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end") + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Alle"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" conf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Forvarm $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Forvarm $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Forvarm $ end") + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Forvarm $ end ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Forvarm $ Alle"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Forvarm $ Bed"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Forvarm $ conf"); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Afkøl"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("SlÃ¥ strøm til"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("SlÃ¥ strøm fra"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index f2cb0cf3f3e2..2d14f47b16db 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -64,20 +64,23 @@ namespace Language_de { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Setze Homeversatz"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Homeversatz aktiv"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Setze Nullpunkte"); //"G92 X0 Y0 Z0" commented out in ultralcd.cpp - PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" Vorwärmen") " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" Alles Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" Bett Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" Einstellungen"); - PROGMEM Language_Str MSG_PREHEAT_2 = PREHEAT_2_LABEL _UxGT(" Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_2_H = PREHEAT_2_LABEL _UxGT(" Vorwärmen") " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = PREHEAT_2_LABEL _UxGT(" Extr. Vorwärm. ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = PREHEAT_2_LABEL _UxGT(" Alles Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = PREHEAT_2_LABEL _UxGT(" Bett Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = PREHEAT_2_LABEL _UxGT(" Einstellungen"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" Vorwärmen ~"); + PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" Alles Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" Bett Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" Einstellungen"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("$ Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("$ Vorwärmen") " ~"; + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("$ Extr. Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("$ Extr. Vorwärm. ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("$ Alles Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("$ Bett Vorwärmen"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("$ Einstellungen"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("benutzerdef. Heizen"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Abkühlen"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequenz"); @@ -140,14 +143,14 @@ namespace Language_de { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Bearbeitung beendet"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Eigenes Netz erst."); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Netz erstellen"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = PREHEAT_1_LABEL _UxGT(" Netz erstellen"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = PREHEAT_2_LABEL _UxGT(" Netz erstellen"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("$ Netz erstellen"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("$ Netz validieren"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Netz erstellen kalt"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Netzhöhe einst."); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Höhe"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Netz validieren"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = PREHEAT_1_LABEL _UxGT(" Netz validieren"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = PREHEAT_2_LABEL _UxGT(" Netz validieren"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Eig. Netz validieren"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 heizt Bett"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Düse aufheizen"); diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index 17e4e819c12e..eb288ba8ab4b 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -54,20 +54,23 @@ namespace Language_el { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("ΟÏισμός βασικών μετατοπίσεων"); //SHORTEN PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("ΕφαÏμόστηκαν οι μετατοπίσεις"); //SHORTEN PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("ΟÏισμός Ï€Ïοέλευσης"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" bed"); //SHORTEN - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); //SHORTEN - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H0 = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" όλα"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" bed"); //SHORTEN - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" επιβεβαίωση"); //SHORTEN + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" End ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" bed"); //SHORTEN + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); //SHORTEN + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("ΠÏοθέÏμανση $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("ΠÏοθέÏμανση $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("ΠÏοθέÏμανση $ End"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("ΠÏοθέÏμανση $ End ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("ΠÏοθέÏμανση $ όλα"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("ΠÏοθέÏμανση $ bed"); //SHORTEN + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("ΠÏοθέÏμανση $ επιβεβαίωση"); //SHORTEN + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Μειωση θεÏμοκÏασιας"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("ΕνεÏγοποίηση"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("ΑπενεÏγοποίηση"); diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index d107f42f7b73..c79bca37d429 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -55,20 +55,23 @@ namespace Language_el_gr { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("ΟÏισμός βασικών μετατοπίσεων"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("ΕφαÏμόστηκαν οι μετατοπίσεις"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("ΟÏισμός Ï€Ïοέλευσης"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" κλίνη"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" όλα"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" κλίνη"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("ΠÏοθέÏμανση ") PREHEAT_2_LABEL _UxGT(" επιβεβαίωση"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" End ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" κλίνη"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("ΠÏοθέÏμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("ΠÏοθέÏμανση $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("ΠÏοθέÏμανση $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("ΠÏοθέÏμανση $ End"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("ΠÏοθέÏμανση $ End ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("ΠÏοθέÏμανση $ όλα"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("ΠÏοθέÏμανση $ κλίνη"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("ΠÏοθέÏμανση $ επιβεβαίωση"); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Μειωση θεÏμοκÏασιας"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("ΕνεÏγοποίηση"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("ΑπενεÏγοποίηση"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 788bc230bfb8..d70b007c6e9e 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -74,20 +74,23 @@ namespace Language_en { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Set Home Offsets"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets Applied"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Set Origin"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preheat ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preheat ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" All"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Conf"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Preheat ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Preheat ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" All"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" Conf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preheat ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preheat ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" All"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Conf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Preheat $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Preheat $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preheat $ End"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preheat $ End ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preheat $ All"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preheat $ Bed"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Conf"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preheat Custom"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Cooldown"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequency"); @@ -150,14 +153,12 @@ namespace Language_en { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Build Mesh (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Build Mesh (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Build Mesh ($)"); PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Build Cold Mesh"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Adjust Mesh Height"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Height Amount"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validate Mesh"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Validate Mesh (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Validate Mesh (") PREHEAT_2_LABEL _UxGT(")"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Validate Mesh ($)"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validate Custom Mesh"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Heating Bed"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index e1d7562d000d..bd63e6479e52 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -69,20 +69,23 @@ namespace Language_es { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ajustar desfases"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicada"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Establecer origen"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precal. ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Precal. ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Todo"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Cama"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Ajuste"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Precal. ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Precal. ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Fusor"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Fusor ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Todo"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Cama"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Precal. ") PREHEAT_2_LABEL _UxGT(" Ajuste"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precal. $"); + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Precal. $ ~"); + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. $ Fusor"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Precal. $ Fusor ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precal. $ Todo"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precal. $ Cama"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precal. $ Ajuste"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Precal. ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Precal. ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Todo"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Cama"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Ajuste"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Precal. manual"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Enfriar"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia"); @@ -145,14 +148,14 @@ namespace Language_es { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Term. edici. Mallado"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Mallado Pers."); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Mallado"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Crear Mallado (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Crear Mallado (") PREHEAT_2_LABEL _UxGT(")"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Crear Mallado ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Valid. Mall. ($)"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Crear Mallado Frío"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajustar alt. Mallado"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Cantidad de altura"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valid. Mallado"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Valid. Mall. (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Valid. Mall. (") PREHEAT_2_LABEL _UxGT(")"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valid. Mall. perso."); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Calentando Cama"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Calent. Boquilla"); diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 428d282d38d3..35c4717a4057 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -58,20 +58,23 @@ namespace Language_eu { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Etxe. offset eza."); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsetak ezarrita"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Hasiera ipini"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Berotu ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Berotu ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Guztia"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ohea"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ezarp."); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Berotu ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Berotu ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Amaia ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Guztia"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Ohea"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Berotu ") PREHEAT_2_LABEL _UxGT(" Ezarp."); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Berotu ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Berotu ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Guztia"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ohea"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ezarp."); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Berotu $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Berotu $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Berotu $ Amaia"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Berotu $ Amaia ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Berotu $ Guztia"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Berotu $ Ohea"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Berotu $ Ezarp."); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Hoztu"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Energia piztu"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Energia itzali"); @@ -98,13 +101,13 @@ namespace Language_eu { PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Sarea editatu"); PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Sarea editatzea eginda"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Sarea sortu"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = PREHEAT_1_LABEL _UxGT(" sarea sortu"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = PREHEAT_2_LABEL _UxGT(" sarea sortu"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("$ sarea sortu"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("$ sarea balioetsi"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Sare hotza sortu"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Sarearen altuera doitu"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Sarea balioetsi"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = PREHEAT_1_LABEL _UxGT(" sarea balioetsi"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = PREHEAT_2_LABEL _UxGT(" sarea balioetsi"); PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ohe sarea balioetsi"); PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Sare berdinketa"); PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3 puntuko berdinketa"); diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index 59bdf8d6d6f6..8166fa3136bd 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -45,20 +45,23 @@ namespace Language_fi { PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Vapauta moottorit"); PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Aja referenssiin"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Aseta origo"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Kaikki"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Alusta"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Esilämm. ") PREHEAT_1_LABEL _UxGT(" konf"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Esilämmitä ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Esilämmitä ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT("Suutin ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT(" Kaikki"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Esilä. ") PREHEAT_2_LABEL _UxGT(" Alusta"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Esilämm. ") PREHEAT_2_LABEL _UxGT(" konf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Kaikki"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Alusta"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Esilämm. ") PREHEAT_1_LABEL _UxGT(" konf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Esilämmitä $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Esilämmitä $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Esilä. $Suutin"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Esilä. $Suutin ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Esilä. $ Kaikki"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Esilä. $ Alusta"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Esilämm. $ konf"); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Jäähdytä"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Virta päälle"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Virta pois"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index bb6c9269e2ca..72cbfcf3c137 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -70,20 +70,23 @@ namespace Language_fr { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Régl. décal origine"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Décalages appliqués"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Régler origine"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Préchauffage ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Préchauffage ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" Tout"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" lit"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Régler préch. ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Préchauffage ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Préchauffage ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" buse ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" Tout"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Préch. ") PREHEAT_2_LABEL _UxGT(" lit"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Régler préch. ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Préchauffage ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Préchauffage ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" Tout"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" lit"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Régler préch. ") PREHEAT_1_LABEL; + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Préchauffage $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Préchauffage $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Préch. $ buse"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Préch. $ buse ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Préch. $ Tout"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Préch. $ lit"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Régler préch. $"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Préchauf. perso"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Refroidir"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Contrôle Laser"); @@ -146,15 +149,15 @@ namespace Language_fr { PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Réglage fin"); PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Terminer"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Créer la grille"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Créer grille ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Créer grille ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Créer grille $"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Impr. grille $"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Créer grille ..."); PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Mesure à froid"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajuster haut. couche"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Hauteur (x0.1mm)"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Vérifier grille"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Impr. grille ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Impr. grille ") PREHEAT_2_LABEL; PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Impr. grille ..."); PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continuer grille"); PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Niveau par mailles"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 097efeb35ad1..66187e8a6b72 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -72,20 +72,23 @@ namespace Language_gl { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Axustar Desfases"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfases aplicados"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Fixar orixe"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Prequentar ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Prequentar ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Todo"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Cama"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" conf"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Prequentar ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Prequentar ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Bico ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Todo"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" Cama"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preque. ") PREHEAT_2_LABEL _UxGT(" conf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Prequentar ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Prequentar ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Todo"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Cama"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" conf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Prequentar $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Prequentar $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preque. $ Bico"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preque. $ Bico ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preque. $ Todo"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preque. $ Cama"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preque. $ conf"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preque. Personali."); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Arrefriar"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia"); @@ -148,14 +151,14 @@ namespace Language_gl { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Fin Edición da Malla"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Malla Person."); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Malla"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Crear Malla (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Crear Malla (") PREHEAT_2_LABEL _UxGT(")"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Crear Malla ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Validar Malla ($)"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Crear Malla Fría"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Axustar Altura Malla"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Altura"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validar Malla"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Validar Malla (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Validar Malla (") PREHEAT_2_LABEL _UxGT(")"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validar Malla perso."); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Quentando Cama"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Quentando Bico"); diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index e50d4b8d775f..24a1f1dcc701 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -55,20 +55,23 @@ namespace Language_hr { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Postavi home offsete"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets postavljeni"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Postavi ishodiÅ¡te"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Predgrij ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Predgrij ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Sve"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" conf"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Predgrij ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Predgrij ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Dizna ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Sve"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Predgrij ") PREHEAT_2_LABEL _UxGT(" conf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Predgrij ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Predgrij ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Sve"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Bed"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" conf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Predgrij $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Predgrij $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Predgrij $ Dizna"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Predgrij $ Dizna ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Predgrij $ Sve"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Predgrij $ Bed"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Predgrij $ conf"); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("HlaÄ‘enje"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("UkljuÄi napajanje"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("IskljuÄi napajanje"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 3d2101b824f7..de38cb52dae6 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -74,20 +74,23 @@ namespace Language_hu { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Kezdöpont eltolás"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Eltolás beállítva."); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Eredeti Be"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Fütés ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Fütés ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Mind"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Ãgy"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Beáll"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Fütés ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Fütés ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Fütés ") PREHEAT_2_LABEL _UxGT(" Fej"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Fütés ") PREHEAT_2_LABEL _UxGT(" Fej ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Fütés ") PREHEAT_2_LABEL _UxGT(" Mind"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Fütés ") PREHEAT_2_LABEL _UxGT(" Ãgy"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Fütés ") PREHEAT_2_LABEL _UxGT(" Beáll"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Fütés ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Fütés ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Mind"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Ãgy"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Beáll"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Fütés $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Fütés $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Fütés $ Fej"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Fütés $ Fej ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Fütés $ Mind"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Fütés $ Ãgy"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Fütés $ Beáll"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Egyedi Elömelegítés"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Visszahütés"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); @@ -150,14 +153,14 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló Kész"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni Háló Építés"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló Építés"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Háló Építés (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Háló Építés (") PREHEAT_2_LABEL _UxGT(")"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló Építés ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló Elfogadás ($)"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg Háló Építés"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("AHáló Magasság Ãllítása"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Összmagasság"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló Elfogadás"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Háló Elfogadás (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Háló Elfogadás (") PREHEAT_2_LABEL _UxGT(")"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi Háló Elfogadása"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ãgy Fűtés"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka Fűtés"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 76e76355fda4..264e7bd0531b 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -72,20 +72,23 @@ namespace Language_it { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Imp. offset home"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset applicato"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Imposta Origine"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preriscalda ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preriscalda ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Tutto"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Piatto"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" conf"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Preriscalda ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Preriscalda ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Ugello ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Tutto"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" Piatto"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" conf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preriscalda ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preriscalda ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Tutto"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Piatto"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" conf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Preriscalda $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Preriscalda $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preris.$ Ugello"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preris.$ Ugello ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preris.$ Tutto"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.$ Piatto"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preris.$ conf"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Prerisc.personal."); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Raffredda"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequenza"); @@ -148,14 +151,14 @@ namespace Language_it { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Modif.Mesh fatta"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crea Mesh personal."); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Crea Mesh"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Crea Mesh ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Crea Mesh ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Crea Mesh ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Valida Mesh ($)"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Crea Mesh a freddo"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Aggiusta Alt. Mesh"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Altezza"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valida Mesh"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Valida Mesh ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Valida Mesh ") PREHEAT_2_LABEL; PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 riscald.letto"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 riscald.ugello"); PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Priming manuale..."); diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index 084d8b4831ee..8a74dcabba8d 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -63,20 +63,23 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("キジュンオフセットセッテイ"); // "Set home offsets" PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("オフセットガテキヨウサレマシタ"); // "Offsets applied" PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("キジュンセット"); // "Set origin" - PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„"); // "Preheat " PREHEAT_1_LABEL - PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„ ~"); // "Preheat " PREHEAT_1_LABEL - PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„ノズル"); // " Nozzle" - PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„ノズル ~"); // " Nozzle" - PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" スベテヨãƒãƒ„"); // " All" - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" ベッドヨãƒãƒ„"); // " Bed" - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„セッテイ"); // " conf" - PROGMEM Language_Str MSG_PREHEAT_2 = PREHEAT_2_LABEL _UxGT(" ヨãƒãƒ„"); // "Preheat " PREHEAT_1_LABEL - PROGMEM Language_Str MSG_PREHEAT_2_H = PREHEAT_2_LABEL _UxGT(" ヨãƒãƒ„ ~"); // "Preheat " PREHEAT_1_LABEL - PROGMEM Language_Str MSG_PREHEAT_2_END = PREHEAT_2_LABEL _UxGT(" ヨãƒãƒ„ノズル"); // " Nozzle" - PROGMEM Language_Str MSG_PREHEAT_2_END_E = PREHEAT_2_LABEL _UxGT(" ヨãƒãƒ„ノズル ~"); // " Nozzle" - PROGMEM Language_Str MSG_PREHEAT_2_ALL = PREHEAT_2_LABEL _UxGT(" スベテヨãƒãƒ„"); // " All" - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = PREHEAT_2_LABEL _UxGT(" ベッドヨãƒãƒ„"); // " Bed" - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = PREHEAT_2_LABEL _UxGT(" ヨãƒãƒ„セッテイ"); // " conf" + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„"); // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„ ~"); // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„ノズル"); // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„ノズル ~"); // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" スベテヨãƒãƒ„"); // " All" + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" ベッドヨãƒãƒ„"); // " Bed" + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" ヨãƒãƒ„セッテイ"); // " conf" + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("$ ヨãƒãƒ„"); // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("$ ヨãƒãƒ„ ~"); // "Preheat " PREHEAT_1_LABEL + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("$ ヨãƒãƒ„ノズル"); // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("$ ヨãƒãƒ„ノズル ~"); // " Nozzle" + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("$ スベテヨãƒãƒ„"); // " All" + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("$ ベッドヨãƒãƒ„"); // " Bed" + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("$ ヨãƒãƒ„セッテイ"); // " conf" + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("ã‚«ãƒãƒ„テイシ"); // "Cooldown" PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("デンゲン オン"); // "Switch power on" PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("デンゲン オフ"); // "Switch power off" diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h index 8d022e99c0fe..7627a7d15565 100644 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ b/Marlin/src/lcd/language/language_ko_KR.h @@ -55,14 +55,17 @@ namespace Language_ko_KR { PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("누르면 시작합니다"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("ë‹¤ìŒ Point"); PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("ë ˆë²¨ë§ ì™„ë£Œ!"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("예열하기 - ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("예열하기 - ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" ë…¸ì¦"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" ë…¸ì¦ ~"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("예열하기 - ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("예열하기 - ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" ë…¸ì¦"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("예열하기 - ") PREHEAT_2_LABEL _UxGT(" ë…¸ì¦ ~"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("예열하기 - ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("예열하기 - ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" ë…¸ì¦"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" ë…¸ì¦ ~"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("예열하기 - $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("예열하기 - $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("예열하기 - $ ë…¸ì¦"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("예열하기 - $ ë…¸ì¦ ~"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Custom 예열"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("ì‹ížˆê¸°"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("스위치 ì „ì› ì¼œê¸°"); diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index 9911f73eadf0..701f861217a6 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -55,20 +55,23 @@ namespace Language_nl { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Zet home offsets"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("H offset toegep."); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nulpunt instellen"); - PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" voorverwarmen"); - PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" voorverw. ~"); - PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" voorverw. Einde"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" voorverw. aan"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" voorverw. Bed"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" verw. conf"); - PROGMEM Language_Str MSG_PREHEAT_2 = PREHEAT_2_LABEL _UxGT(" voorverwarmen"); - PROGMEM Language_Str MSG_PREHEAT_2_H = PREHEAT_2_LABEL _UxGT(" voorverw. ~"); - PROGMEM Language_Str MSG_PREHEAT_2_END = PREHEAT_2_LABEL _UxGT(" voorverw. Einde"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = PREHEAT_2_LABEL _UxGT(" voorverw. Einde ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = PREHEAT_2_LABEL _UxGT(" voorverw. aan"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = PREHEAT_2_LABEL _UxGT(" voorverw. Bed"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = PREHEAT_2_LABEL _UxGT(" verw. conf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" voorverwarmen"); + PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" voorverw. ~"); + PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" voorverw. Einde"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" voorverw. aan"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" voorverw. Bed"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" verw. conf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("$ voorverwarmen"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("$ voorverw. ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("$ voorverw. Einde"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("$ voorverw. Einde ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("$ voorverw. aan"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("$ voorverw. Bed"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("$ verw. conf"); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Afkoelen"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Stroom aan"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Stroom uit"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index b1da41bc6169..9e77eb92d1c5 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -70,20 +70,23 @@ namespace Language_pl { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ust. poz. zer."); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Poz. zerowa ust."); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ustaw punkt zero"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" wsz."); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" stół"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" ustaw."); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Rozgrzej ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Rozgrzej ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" Dysza ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" wsz."); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" stół"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Rozgrzej ") PREHEAT_2_LABEL _UxGT(" ustaw."); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" wsz."); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" stół"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" ustaw."); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Rozgrzej $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Rozgrzej $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Rozgrzej $ Dysza"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Rozgrzej $ Dysza ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Rozgrzej $ wsz."); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Rozgrzej $ stół"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Rozgrzej $ ustaw."); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Rozgrzej wÅ‚asne ust."); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("ChÅ‚odzenie"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Sterowanie Lasera"); @@ -145,14 +148,14 @@ namespace Language_pl { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec edycji siati"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Buduj wÅ‚asna siatkÄ™"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Buduj siatkÄ™"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Buduj siatkÄ™ (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Buduj siatkÄ™ (") PREHEAT_2_LABEL _UxGT(")"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Buduj siatkÄ™ ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Sprawdzenie siatki ($)"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Buduj siatkÄ™ na zimno"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Dostrojenie wysokoÅ›ci siatki"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Wartość wysokoÅ›ci"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Sprawdzenie siatki"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Sprawdzenie siatki (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Sprawdzenie siatki (") PREHEAT_2_LABEL _UxGT(")"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Sprawdzenie wÅ‚asnej siatki"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Nagrzewanie stoÅ‚u"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Nagrzewanie dyszy"); diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index bc7465716ce5..41bfdc741494 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -54,20 +54,23 @@ namespace Language_pt { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Definir desvio"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets aplicados"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Definir origem"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" Tudo"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" ") LCD_STR_THERMOMETER _UxGT("Base"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Definições ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL _UxGT(" Bico ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Pre-aq. ") PREHEAT_2_LABEL _UxGT(" Tudo"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Pre-aq. ") PREHEAT_2_LABEL _UxGT(" ") LCD_STR_THERMOMETER _UxGT("Base"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Definições ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" Tudo"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" ") LCD_STR_THERMOMETER _UxGT("Base"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Definições ") PREHEAT_1_LABEL; + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Pre-aquecer $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Pre-aquecer $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Pre-aquecer $ Bico"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Pre-aquecer $ Bico ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Pre-aq. $ Tudo"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Pre-aq. $ ") LCD_STR_THERMOMETER _UxGT("Base"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Definições $"); + #endif PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Arrefecer"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ligar"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Desligar"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index bf4b8343035f..49a336ce3ff1 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -69,20 +69,23 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Compensar origem"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Alteração aplicada"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ajustar Origem"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Extrusora ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Extrusora ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Pre-aq.Todo ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq.Mesa ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ajustar ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Pre-aquecer ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Extrusora ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Extrusora ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Pre-aq.Todo ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Pre-aq.Mesa ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ajustar ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Extrusora ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Extrusora ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Pre-aq.Todo ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq.Mesa ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ajustar ") PREHEAT_1_LABEL; + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Pre-aquecer $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Pre-aquecer $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Extrusora $"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Extrusora $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Pre-aq.Todo $"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Pre-aq.Mesa $"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Ajustar $"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Customizar Pre-aq."); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Esfriar"); PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ligar"); @@ -132,14 +135,14 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Fim da Edição"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Montar Malha Custom"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Montar "); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Montar ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Montar ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Montar $"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Checar $"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Montar Malha fria"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajustar Altura"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Quant. de Altura"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validar Malha"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Checar ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Checar ") PREHEAT_2_LABEL; PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validar Malha Custom"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Aquecendo Mesa"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Aquecendo Ext."); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index da9a159a3f87..51f1a00101f1 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -70,20 +70,23 @@ namespace Language_ro { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Seteaza Offseturile Acasa"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offseturi Aplicate"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Seteaza Originea"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preincalzeste ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preincalzeste ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Patul"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Conf"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Preincalzeste ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Preincalzeste ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Capatul"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Capatul ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Patul"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Preincalzeste ") PREHEAT_2_LABEL _UxGT(" Conf"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preincalzeste ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preincalzeste ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Tot"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Patul"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Conf"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Preincalzeste $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Preincalzeste $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preincalzeste $ Capatul"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preincalzeste $ Capatul ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preincalzeste $ Tot"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preincalzeste $ Patul"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preincalzeste $ Conf"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preincalzeste Personalizat"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Racire"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecventa"); @@ -146,14 +149,14 @@ namespace Language_ro { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Build Mesh (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Build Mesh (") PREHEAT_2_LABEL _UxGT(")"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Build Mesh ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Validate Mesh ($)"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Build Cold Mesh"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Adjust Mesh Height"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Height Amount"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validate Mesh"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Validate Mesh (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Validate Mesh (") PREHEAT_2_LABEL _UxGT(")"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validate Custom Mesh"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Heating Bed"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 77e309fdaedd..15d23e1326ed 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -78,20 +78,23 @@ namespace Language_ru { #endif PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ð¡Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ñ‹"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("УÑтановить ноль"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ðагрев ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" Ñопло"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" Ñопло ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" вÑÑ‘"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" Ñтол"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" правка"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Преднагрев ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Ðагрев ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Ðагрев ") PREHEAT_2_LABEL _UxGT(" Ñопло"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Ðагрев ") PREHEAT_2_LABEL _UxGT(" Ñопло ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Ðагрев ") PREHEAT_2_LABEL _UxGT(" вÑÑ‘"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Ðагрев ") PREHEAT_2_LABEL _UxGT(" Ñтол"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ðагрев ") PREHEAT_2_LABEL _UxGT(" правка"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ðагрев ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" Ñопло"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" Ñопло ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" вÑÑ‘"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" Ñтол"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ðагрев ") PREHEAT_1_LABEL _UxGT(" правка"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Преднагрев $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Ðагрев $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Ðагрев $ Ñопло"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Ðагрев $ Ñопло ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Ðагрев $ вÑÑ‘"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Ðагрев $ Ñтол"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Ðагрев $ правка"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Ðагрев Свой"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждение"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); @@ -184,8 +187,9 @@ namespace Language_ru { #endif PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ð¢Ð¾Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° Ñетки"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("ПоÑтроить Ñетку"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("ПоÑтроить Ñетку ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("ПоÑтроить Ñетку ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("ПоÑтроить Ñетку $"); + #endif #if LCD_WIDTH > 21 PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("ПоÑтроить холодную Ñетку"); #else @@ -195,12 +199,14 @@ namespace Language_ru { PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Ð’Ñ‹Ñота"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Проверить Ñетку"); #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Проверить Ñетку ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Проверить Ñетку ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Проверить Ñетку $"); + #endif PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Проверить Ñвою Ñетку"); #else - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Провер. Ñетку ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Провер. Ñетку ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Провер. Ñетку $"); + #endif PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Провер. Ñвою Ñетку"); #endif PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрев Ñтола"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 0a251f1548a5..a4c47951f1b5 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -74,20 +74,23 @@ namespace Language_sk { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("NastaviÅ¥ ofsety"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastavené"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("NastaviÅ¥ zaÄiatok"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" hotend"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" hotend ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" vÅ¡etko"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" podlož"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" nast."); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("ZahriaÅ¥ ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("ZahriaÅ¥ ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("ZahriaÅ¥ ") PREHEAT_2_LABEL _UxGT(" hotend"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("ZahriaÅ¥ ") PREHEAT_2_LABEL _UxGT(" hotend ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("ZahriaÅ¥ ") PREHEAT_2_LABEL _UxGT(" vÅ¡etko"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("ZahriaÅ¥ ") PREHEAT_2_LABEL _UxGT(" podlož"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("ZahriaÅ¥ ") PREHEAT_2_LABEL _UxGT(" nast."); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" hotend"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" hotend ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" vÅ¡etko"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" podlož"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("ZahriaÅ¥ ") PREHEAT_1_LABEL _UxGT(" nast."); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("ZahriaÅ¥ $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("ZahriaÅ¥ $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("ZahriaÅ¥ $ hotend"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("ZahriaÅ¥ $ hotend ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("ZahriaÅ¥ $ vÅ¡etko"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("ZahriaÅ¥ $ podlož"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("ZahriaÅ¥ $ nast."); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Vlastná teplota"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("SchladiÅ¥"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); @@ -150,14 +153,14 @@ namespace Language_sk { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec úprav siete"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastná sieÅ¥"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("VytvoriÅ¥ sieÅ¥"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("SieÅ¥ bodov ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("SieÅ¥ bodov ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("SieÅ¥ bodov $"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola siete $"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená sieÅ¥ bodov"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("UpraviÅ¥ výšku siete"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("SkontrolovaÅ¥ sieÅ¥"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Kontrola siete ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Kontrola siete ") PREHEAT_2_LABEL; PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast.siete"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 ohrev podlž."); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 ohrev trysky"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 8776eee8f40a..9ff62d70d636 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -75,20 +75,23 @@ namespace Language_tr { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ofset Ayarla"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofset Tamam"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Sıfır Belirle"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tüm"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tabla"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Ayarlar"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Ön Isınma ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Ön Isınma ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Nozul ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Tüm"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Tabla"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ön Isınma ") PREHEAT_2_LABEL _UxGT(" Ayarlar"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tüm"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tabla"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Ayarlar"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Ön Isınma $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Ön Isınma $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Ön Isınma $ Nozul"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Ön Isınma $ Nozul ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Ön Isınma $ Tüm"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Ön Isınma $ Tabla"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Ön Isınma $ Ayarlar"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Özel Ön Isınma"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("SoÄŸut/(Durdur)"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lazer Kontrolü"); @@ -150,14 +153,14 @@ namespace Language_tr { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Mesh Düzenleme Tamam"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Özel Mesh OluÅŸtur"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Mesh OluÅŸtur"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Mesh OluÅŸtur (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Mesh OluÅŸtur (") PREHEAT_2_LABEL _UxGT(")"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Mesh OluÅŸtur ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("DoÄŸrulama Mesh ($)"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("SoÄŸuk Mesh OluÅŸtur"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Mesh Yükseklik Ayarı"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Yükseklik miktarı"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("DoÄŸrulama Mesh"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("DoÄŸrulama Mesh (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("DoÄŸrulama Mesh (") PREHEAT_2_LABEL _UxGT(")"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Özel Mesh DoÄŸrulama"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Isıtma Tablası"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Isıtma Memesi"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 2751a640bbf7..55e0eb4d3f9c 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -80,20 +80,23 @@ namespace Language_uk { #endif PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ð—Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¹Ð½ÑÑ‚Ñ–"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ð’Ñтановити ноль"); - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Ðагрів ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ðагрів ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñопло"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñопло ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" вÑе"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñтіл"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" налашт"); - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Ðагрів ") PREHEAT_2_LABEL; - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Ðагрів ") PREHEAT_2_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Ñопло"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Ñопло ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" вÑе"); - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" Ñтіл"); - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Ðагрів ") PREHEAT_2_LABEL _UxGT(" налашт"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Ðагрів ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ðагрів ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñопло"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñопло ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" вÑе"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" Ñтіл"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ðагрів ") PREHEAT_1_LABEL _UxGT(" налашт"); + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Ðагрів $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Ðагрів $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Ðагрів $ Ñопло"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Ðагрів $ Ñопло ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Ðагрів $ вÑе"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Ðагрів $ Ñтіл"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Ðагрів $ налашт"); + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Ðагрів Свій"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Вимкнути нагрів"); PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("ЧаÑтота"); @@ -185,14 +188,14 @@ namespace Language_uk { PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñітки"); PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Сітка побудована"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Будувати Ñітку"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Будувати Ñітку ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Будувати Ñітку ") PREHEAT_2_LABEL; + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Будувати Ñітку $"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Підтвердити $"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Буд. холодну Ñітку"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ð’Ñтан.виÑоту Ñітки"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("ВиÑота"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Підтвердити Ñітку"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Підтвердити ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Підтвердити ") PREHEAT_2_LABEL; PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Підтвердити Ñвою"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрів Ñтолу"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрів Ñопла"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 4450e9852023..9d0ba7e21346 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -65,20 +65,23 @@ namespace Language_vi { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Äặt bù đắp nhà"); // Set home offsets PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Bù đắp được áp dụng"); // Offsets applied PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Äặt nguồn gốc"); // Set origin - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trÆ°á»›c"); // Preheat - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trÆ°á»›c ~"); // Preheat - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Äầu"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Äầu ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Tất cả"); // all - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Bàn"); // bed -- using vietnamese term for 'table' instead - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Cấu hình"); // conf - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trÆ°á»›c"); // Preheat - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" trÆ°á»›c ~"); // Preheat - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Äầu"); - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Äầu ~"); - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Tất cả"); // all - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Bàn"); // bed -- using vietnamese term for 'table' instead - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("Làm nóng ") PREHEAT_2_LABEL _UxGT(" Cấu hình"); // conf + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trÆ°á»›c"); // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trÆ°á»›c ~"); // Preheat + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Äầu"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Äầu ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Tất cả"); // all + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Bàn"); // bed -- using vietnamese term for 'table' instead + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Cấu hình"); // conf + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Làm nóng $ trÆ°á»›c"); // Preheat + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Làm nóng $ trÆ°á»›c ~"); // Preheat + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Làm nóng $ Äầu"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Làm nóng $ Äầu ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Làm nóng $ Tất cả"); // all + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Làm nóng $ Bàn"); // bed -- using vietnamese term for 'table' instead + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Làm nóng $ Cấu hình"); // conf + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("SÆ°Ì£ nóng trÆ°á»›c tá»± chá»n"); // Preheat Custom PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Nguá»™i xuống"); // Cooldown PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bật nguồn"); // Switch power on @@ -124,14 +127,14 @@ namespace Language_vi { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Chỉnh sá»­a xong lÆ°á»›i"); // Done Editing Mesh PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Xây dá»±ng lÆ°á»›i tá»± chá»n"); // Build Custom Mesh PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Xây dá»±ng lÆ°á»›i"); // Build Mesh - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("Xây dá»±ng lÆ°á»›i (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("Xây dá»±ng lÆ°á»›i (") PREHEAT_2_LABEL _UxGT(")"); + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Xây dá»±ng lÆ°á»›i ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Thẩm tra lÆ°á»›i ($)"); + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Xây dá»±ng lÆ°á»›i lạnh"); // Build cold mesh PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Äiá»u chỉnh chiá»u cao lÆ°á»›i"); // Adjust Mesh Height PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Số lượng chiá»u cao"); // Height Amount PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Thẩm tra lÆ°á»›i"); // Validate Mesh - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("Thẩm tra lÆ°á»›i (") PREHEAT_1_LABEL _UxGT(")"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("Thẩm tra lÆ°á»›i (") PREHEAT_2_LABEL _UxGT(")"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Thẩm tra lÆ°á»›i tá»± chá»n"); // validate custom mesh PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Tiếp tục xây lÆ°á»›i bàn"); // Continue Bed Mesh PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Äang san lấp lÆ°á»›i"); // Mesh Leveling diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 7aaf57d3b579..512d77aa2211 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -69,20 +69,23 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("设置原点å移"); //"Set home offsets" PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("å移已å¯ç”¨"); //"Offsets applied" PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("设置原点"); //"Set origin" - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("预热 ") PREHEAT_1_LABEL; //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("预热 ") PREHEAT_1_LABEL " ~"; //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ~"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 热床"); //MSG_PREHEAT_1 " Bed" - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 设置"); //MSG_PREHEAT_1 " conf" - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("预热 ") PREHEAT_2_LABEL; //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("预热 ") PREHEAT_2_LABEL " ~"; //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_2 " " - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 喷嘴 ~"); //MSG_PREHEAT_2 " " - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 全部"); //MSG_PREHEAT_2 " All" - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 热床"); //MSG_PREHEAT_2 " Bed" - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("预热 ") PREHEAT_2_LABEL _UxGT(" 设置"); //MSG_PREHEAT_2 " conf" + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("预热 ") PREHEAT_1_LABEL; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("预热 ") PREHEAT_1_LABEL " ~"; //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ~"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 热床"); //MSG_PREHEAT_1 " Bed" + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 设置"); //MSG_PREHEAT_1 " conf" + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("预热 $"); //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("预热 $ ~"); //"Preheat PREHEAT_2_LABEL" + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("预热 $ 喷嘴"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("预热 $ 喷嘴 ~"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("预热 $ 全部"); //MSG_PREHEAT_1 " All" + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("预热 $ 热床"); //MSG_PREHEAT_1 " Bed" + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("预热 $ 设置"); //MSG_PREHEAT_1 " conf" + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("预热自定义"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("é™æ¸©"); //"Cooldown" PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("切割频率"); @@ -145,14 +148,14 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("完æˆç¼–辑网格"); // "Done Editing Mesh" PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("创设客户网格"); // "Build Custom Mesh" PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("创设网格"); // "Build Mesh" - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("创设 ") PREHEAT_1_LABEL _UxGT(" 网格"); // "Build PREHEAT_1_LABEL Mesh" - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("创设 ") PREHEAT_2_LABEL _UxGT(" 网格"); // "Build PREHEAT_2_LABEL Mesh" + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("创设 $ 网格"); // "Build PREHEAT_1_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 网格"); // "Validate PREHEAT_1_LABEL Mesh" + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("创设冷网格"); // "Build Cold Mesh" PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("调整网格高度"); // "Adjust Mesh Height" PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度åˆè®¡"); // "Height Amount" PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准网格"); // "Validate Mesh" - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("批准 ") PREHEAT_1_LABEL _UxGT(" 网格"); // "Validate PREHEAT_1_LABEL Mesh" - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("批准 ") PREHEAT_2_LABEL _UxGT(" 网格"); // "Validate PREHEAT_2_LABEL Mesh" PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客户网格"); // "Validate Custom Mesh" PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26加热热床"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26加热喷嘴"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 793890e3001b..efc9b570bbcb 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -68,20 +68,23 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("設置原點å移"); //"Set home offsets" PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("å移已啟用"); //"Offsets applied" PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("設置原點"); //"Set origin" - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("é ç†± ") PREHEAT_1_LABEL; //"Preheat PREHEAT_1_LABEL" - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("é ç†± ") PREHEAT_1_LABEL " ~"; //"Preheat PREHEAT_1_LABEL" - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ~"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_1 " Bed" - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 設置"); //MSG_PREHEAT_1 " conf" - PROGMEM Language_Str MSG_PREHEAT_2 = _UxGT("é ç†± ") PREHEAT_2_LABEL; //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_2_H = _UxGT("é ç†± ") PREHEAT_2_LABEL " ~"; //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_2_END = _UxGT("é ç†± ") PREHEAT_2_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_2 " " - PROGMEM Language_Str MSG_PREHEAT_2_END_E = _UxGT("é ç†± ") PREHEAT_2_LABEL _UxGT(" 噴嘴 ~"); //MSG_PREHEAT_2 " " - PROGMEM Language_Str MSG_PREHEAT_2_ALL = _UxGT("é ç†± ") PREHEAT_2_LABEL _UxGT(" 全部"); //MSG_PREHEAT_2 " All" - PROGMEM Language_Str MSG_PREHEAT_2_BEDONLY = _UxGT("é ç†± ") PREHEAT_2_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_2 " Bed" - PROGMEM Language_Str MSG_PREHEAT_2_SETTINGS = _UxGT("é ç†± ") PREHEAT_2_LABEL _UxGT(" 設置"); //MSG_PREHEAT_2 " conf" + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("é ç†± ") PREHEAT_1_LABEL; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("é ç†± ") PREHEAT_1_LABEL " ~"; //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ~"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_1 " Bed" + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("é ç†± ") PREHEAT_1_LABEL _UxGT(" 設置"); //MSG_PREHEAT_1 " conf" + + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("é ç†± $"); //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("é ç†± $ ~"); //"Preheat PREHEAT_1_LABEL" + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("é ç†± $ 噴嘴"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("é ç†± $ 噴嘴 ~"); //MSG_PREHEAT_1 " " + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("é ç†± $ 全部"); //MSG_PREHEAT_1 " All" + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("é ç†± $ 熱床"); //MSG_PREHEAT_1 " Bed" + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("é ç†± $ 設置"); //MSG_PREHEAT_1 " conf" + #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("自定é ç†±"); //"Preheat Custom" PROGMEM Language_Str MSG_COOLDOWN = _UxGT("é™æº«"); //"Cooldown" PROGMEM Language_Str MSG_LASER_MENU = _UxGT("激光控制"); //"Laser Control" @@ -143,14 +146,14 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("完æˆç·¨è¼¯ç¶²æ ¼"); // "Done Editing Mesh" PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("創設客戶網格"); // "Build Custom Mesh" PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("創設網格"); // "Build Mesh" - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M1 = _UxGT("創設 ") PREHEAT_1_LABEL _UxGT(" 網格"); // "Build PREHEAT_1_LABEL Mesh" - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M2 = _UxGT("創設 ") PREHEAT_2_LABEL _UxGT(" 網格"); // "Build PREHEAT_2_LABEL Mesh" + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("創設 $ 網格"); // "Build PREHEAT_1_LABEL Mesh" + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 網格"); // "Validate PREHEAT_1_LABEL Mesh" + #endif PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("創設冷網格"); // "Build Cold Mesh" PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("調整網格高度"); // "Adjust Mesh Height" PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度åˆè¨ˆ"); // "Height Amount" PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准網格"); // "Validate Mesh" - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M1 = _UxGT("批准 ") PREHEAT_1_LABEL _UxGT(" 網格"); // "Validate PREHEAT_1_LABEL Mesh" - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M2 = _UxGT("批准 ") PREHEAT_2_LABEL _UxGT(" 網格"); // "Validate PREHEAT_2_LABEL Mesh" PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客戶網格"); // "Validate Custom Mesh" PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 加熱熱床"); //"G26 Heating Bed" PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 加熱噴嘴"); //"G26 Heating Nozzle" diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index d1c0c02cdb75..4290bcbb1256 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -28,17 +28,16 @@ #if HAS_SPI_LCD -#include "../inc/MarlinConfig.h" #include "lcdprint.h" /** * lcd_put_u8str_ind_P * Print a string with an index substituted within it */ -lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { +lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const inStr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { uint8_t *p = (uint8_t*)pstr; - lcd_uint_t n = maxlen; - for (; n; n--) { + int8_t n = maxlen; + for (; n > 0; n--) { wchar_t ch; p = get_utf8_value_cb(p, read_byte_rom, &ch); if (!ch) break; @@ -46,17 +45,21 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, const lcd_uin // lcd_put_int(ind); n--; if (ind >= 10) n--; if (ind >= 0) { if (ch == '*') { lcd_put_wchar('E'); n--; } - lcd_put_wchar(ind + ((ch == '=') ? '0' : LCD_FIRST_TOOL)); - n--; + if (n) { lcd_put_wchar(ind + ((ch == '=') ? '0' : LCD_FIRST_TOOL)); n--; } } else { PGM_P const b = ind == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED); lcd_put_u8str_P(b); n -= utf8_strlen_P(b); } - if (n) n -= lcd_put_u8str_max_P((PGM_P)p, n); - break; + if (n) n -= lcd_put_u8str_max_P((PGM_P)p, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); + continue; } + else if (ch == '$' && inStr) { + n -= lcd_put_u8str_max_P(inStr, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); + continue; + } + lcd_put_wchar(ch); } return n; diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index ba938b52d752..341cc4f5c21c 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -13,11 +13,68 @@ #include "../inc/MarlinConfig.h" #if HAS_GRAPHICAL_LCD + #include "dogm/u8g_fontutf8.h" typedef u8g_uint_t lcd_uint_t; + typedef u8g_int_t lcd_int_t; + + // Only Western languages support big / small fonts + #if DISABLED(DISPLAY_CHARSET_ISO10646_1) + #undef USE_BIG_EDIT_FONT + #undef USE_SMALL_INFOFONT + #endif + + #define MENU_FONT_NAME ISO10646_1_5x7 + #define MENU_FONT_WIDTH 6 + #define MENU_FONT_ASCENT 10 + #define MENU_FONT_DESCENT 2 + #define MENU_FONT_HEIGHT (MENU_FONT_ASCENT + MENU_FONT_DESCENT) + + #if ENABLED(USE_BIG_EDIT_FONT) + #define EDIT_FONT_NAME u8g_font_9x18 + #define EDIT_FONT_WIDTH 9 + #define EDIT_FONT_ASCENT 10 + #define EDIT_FONT_DESCENT 3 + #else + #define EDIT_FONT_NAME MENU_FONT_NAME + #define EDIT_FONT_WIDTH MENU_FONT_WIDTH + #define EDIT_FONT_ASCENT MENU_FONT_ASCENT + #define EDIT_FONT_DESCENT MENU_FONT_DESCENT + #endif + #define EDIT_FONT_HEIGHT (EDIT_FONT_ASCENT + EDIT_FONT_DESCENT) + + // Get the Ascent, Descent, and total Height for the Info Screen font + #if ENABLED(USE_SMALL_INFOFONT) + extern const u8g_fntpgm_uint8_t u8g_font_6x9[]; + #define INFO_FONT_ASCENT 7 + #else + #define INFO_FONT_ASCENT 8 + #endif + #define INFO_FONT_DESCENT 2 + #define INFO_FONT_HEIGHT (INFO_FONT_ASCENT + INFO_FONT_DESCENT) + #define INFO_FONT_WIDTH 6 + + #define SETCURSOR(col, row) lcd_moveto(col * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) + #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) + #else + #define _UxGT(a) a typedef uint8_t lcd_uint_t; + typedef int8_t lcd_int_t; + + #define MENU_FONT_WIDTH 1 + #define MENU_FONT_HEIGHT 1 + #define EDIT_FONT_WIDTH 1 + #define EDIT_FONT_HEIGHT 1 + #define INFO_FONT_WIDTH 1 + #define INFO_FONT_HEIGHT 1 + #define LCD_PIXEL_WIDTH LCD_WIDTH + #define LCD_PIXEL_HEIGHT LCD_HEIGHT + + #define SETCURSOR(col, row) lcd_moveto(col, row) + #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_WIDTH - (len), row) + #endif #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) @@ -71,10 +128,10 @@ inline int lcd_put_u8str_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P con return lcd_put_u8str_P(pstr); } -lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, const lcd_uint_t maxlen=LCD_WIDTH); -inline lcd_uint_t lcd_put_u8str_ind_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P const pstr, const int8_t ind, const lcd_uint_t maxlen=LCD_WIDTH) { +lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const inStr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH); +inline lcd_uint_t lcd_put_u8str_ind_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P const pstr, const int8_t ind, PGM_P const inStr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH) { lcd_moveto(col, row); - return lcd_put_u8str_ind_P(pstr, ind, maxlen); + return lcd_put_u8str_ind_P(pstr, ind, inStr, maxlen); } inline int lcd_put_u8str(const char* str) { return lcd_put_u8str_max(str, PIXEL_LEN_NOLIMIT); } diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 7c384f161847..676b2d0a430b 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -62,6 +62,7 @@ menuPosition screen_history[6]; uint8_t screen_history_depth = 0; int8_t MenuItemBase::itemIndex; // Index number for draw and action +PGM_P MenuItemBase::itemString; // A PSTR for substitution chimera_t editable; // Value Editing // Menu Edit Items diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 6e916898b999..699324d2668e 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -63,12 +63,14 @@ typedef void (*selectFunc_t)(); class MenuItemBase { public: - // An index to interject in the item label and for - // use by the action + // Index to interject in the item label and/or for use by its action. static int8_t itemIndex; + // An optional pointer for use in display or by the action + static PGM_P itemString; + // Store the index of the item ahead of use by indexed items - FORCE_INLINE static void init(const int8_t ind) { itemIndex = ind; } + FORCE_INLINE static void init(const int8_t ind=0, PGM_P const pstr=nullptr) { itemIndex = ind; itemString = pstr; } // Draw an item either selected (pre_char) or not (space) with post_char static void _draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char); @@ -221,7 +223,7 @@ class MenuEditItemBase : public MenuItemBase { public: // Implemented for HD44780 and DOGM // Draw the current item at specified row with edit data - static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm=false); + static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm=false); // Implemented for HD44780 and DOGM // This low-level method is good to draw from anywhere @@ -403,15 +405,15 @@ class MenuItem_bool : public MenuEditItemBase { */ #define _MENU_INNER_P(TYPE, USE_MULTIPLIER, PLABEL, V...) do { \ - PGM_P const plabel = PLABEL; \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ - MenuItem_##TYPE::action(plabel, ##V); \ - if (ui.screen_changed) return; \ - } \ - if (ui.should_draw()) \ - MenuItem_##TYPE::draw \ - (encoderLine == _thisItemNr, _lcdLineNr, plabel, ##V); \ + PGM_P const plabel = PLABEL; \ + if (encoderLine == _thisItemNr && ui.use_click()) { \ + _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ + MenuItem_##TYPE::action(plabel, ##V); \ + if (ui.screen_changed) return; \ + } \ + if (ui.should_draw()) \ + MenuItem_##TYPE::draw \ + (encoderLine == _thisItemNr, _lcdLineNr, plabel, ##V); \ }while(0) #define _MENU_ITEM_P(TYPE, V...) do { \ @@ -421,11 +423,31 @@ class MenuItem_bool : public MenuEditItemBase { NEXT_ITEM(); \ }while(0) +// Indexed items set a global index value and optional data +#define _MENU_ITEM_N_S_P(TYPE, N, S, V...) do{ \ + _skipStatic = false; \ + if (_menuLineNr == _thisItemNr) { \ + MenuItemBase::init(N, S); \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + // Indexed items set a global index value #define _MENU_ITEM_N_P(TYPE, N, V...) do{ \ _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ - MenuItemBase::init(N); \ + MenuItemBase::itemIndex = N; \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Items with a unique string +#define _MENU_ITEM_S_P(TYPE, S, V...) do{ \ + _skipStatic = false; \ + if (_menuLineNr == _thisItemNr) { \ + MenuItemBase::itemString = S; \ _MENU_INNER_P(TYPE, ##V); \ } \ NEXT_ITEM(); \ @@ -457,72 +479,94 @@ class MenuItem_bool : public MenuEditItemBase { NEXT_ITEM(); \ }while(0) -#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P( GET_TEXT(LABEL), ##V) -#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) - -#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) -#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) - -#define MENU_ITEM_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, false, PLABEL, ##V) -#define MENU_ITEM_N(TYPE, N, LABEL, V...) MENU_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) - -#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) - -#define ACTION_ITEM_P(PLABEL, ACTION) MENU_ITEM_P(function, PLABEL, ACTION) -#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_P(GET_TEXT(LABEL), ACTION) - -#define ACTION_ITEM_N_P(N, PLABEL, ACTION) MENU_ITEM_N_P(function, N, PLABEL, ACTION) -#define ACTION_ITEM_N(N, LABEL, ACTION) ACTION_ITEM_N_P(N, GET_TEXT(LABEL), ACTION) - -#define GCODES_ITEM_P(PLABEL, GCODES) MENU_ITEM_P(gcode, PLABEL, GCODES) -#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_P(GET_TEXT(LABEL), GCODES) - -#define GCODES_ITEM_N_P(N, PLABEL, GCODES) MENU_ITEM_N_P(gcode, N, PLABEL, GCODES) -#define GCODES_ITEM_N(N, LABEL, GCODES) GCODES_ITEM_N_P(N, GET_TEXT(LABEL), GCODES) - -#define SUBMENU_P(PLABEL, DEST) MENU_ITEM_P(submenu, PLABEL, DEST) -#define SUBMENU(LABEL, DEST) SUBMENU_P(GET_TEXT(LABEL), DEST) - -#define SUBMENU_N_P(N, PLABEL, DEST) MENU_ITEM_N_P(submenu, N, PLABEL, DEST) -#define SUBMENU_N(N, LABEL, DEST) SUBMENU_N_P(N, GET_TEXT(LABEL), DEST) - -#define EDIT_ITEM_P(TYPE, PLABEL, V...) MENU_ITEM_P(TYPE, PLABEL, ##V) -#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) - -#define EDIT_ITEM_N_P(TYPE, N, PLABEL, V...) MENU_ITEM_N_P(TYPE, N, PLABEL, ##V) -#define EDIT_ITEM_N(TYPE, N, LABEL, V...) EDIT_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) - -#define EDIT_ITEM_FAST_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, true, PLABEL, ##V) -#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_P(TYPE, GET_TEXT(LABEL), ##V) - -#define EDIT_ITEM_FAST_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_N(TYPE, N, LABEL, V...) EDIT_ITEM_FAST_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) +#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) + +#define MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, false, PLABEL, ##V) +#define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, false, PLABEL, ##V) +#define MENU_ITEM_S(TYPE, S, LABEL, V...) MENU_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, false, PLABEL, ##V) +#define MENU_ITEM_N(TYPE, N, LABEL, V...) MENU_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) +#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) + +#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) + +#define ACTION_ITEM_N_S_P(N, S, PLABEL, ACTION) MENU_ITEM_N_S_P(function, N, S, PLABEL, ACTION) +#define ACTION_ITEM_N_S(N, S, LABEL, ACTION) ACTION_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_S_P(S, PLABEL, ACTION) MENU_ITEM_S_P(function, S, PLABEL, ACTION) +#define ACTION_ITEM_S(S, LABEL, ACTION) ACTION_ITEM_S_P(S, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_N_P(N, PLABEL, ACTION) MENU_ITEM_N_P(function, N, PLABEL, ACTION) +#define ACTION_ITEM_N(N, LABEL, ACTION) ACTION_ITEM_N_P(N, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_P(PLABEL, ACTION) MENU_ITEM_P(function, PLABEL, ACTION) +#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_P(GET_TEXT(LABEL), ACTION) + +#define GCODES_ITEM_N_S_P(N, S, PLABEL, GCODES) MENU_ITEM_N_S_P(gcode, N, S, PLABEL, GCODES) +#define GCODES_ITEM_N_S(N, S, LABEL, GCODES) GCODES_ITEM_N_S_P(N, S, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_S_P(S, PLABEL, GCODES) MENU_ITEM_S_P(gcode, S, PLABEL, GCODES) +#define GCODES_ITEM_S(S, LABEL, GCODES) GCODES_ITEM_S_P(S, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_N_P(N, PLABEL, GCODES) MENU_ITEM_N_P(gcode, N, PLABEL, GCODES) +#define GCODES_ITEM_N(N, LABEL, GCODES) GCODES_ITEM_N_P(N, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_P(PLABEL, GCODES) MENU_ITEM_P(gcode, PLABEL, GCODES) +#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_P(GET_TEXT(LABEL), GCODES) + +#define SUBMENU_N_S_P(N, S, PLABEL, DEST) MENU_ITEM_N_S_P(submenu, N, S, PLABEL, DEST) +#define SUBMENU_N_S(N, S, LABEL, DEST) SUBMENU_N_S_P(N, S, GET_TEXT(LABEL), DEST) +#define SUBMENU_S_P(S, PLABEL, DEST) MENU_ITEM_S_P(submenu, S, PLABEL, DEST) +#define SUBMENU_S(S, LABEL, DEST) SUBMENU_S_P(S, GET_TEXT(LABEL), DEST) +#define SUBMENU_N_P(N, PLABEL, DEST) MENU_ITEM_N_P(submenu, N, PLABEL, DEST) +#define SUBMENU_N(N, LABEL, DEST) SUBMENU_N_P(N, GET_TEXT(LABEL), DEST) +#define SUBMENU_P(PLABEL, DEST) MENU_ITEM_P(submenu, PLABEL, DEST) +#define SUBMENU(LABEL, DEST) SUBMENU_P(GET_TEXT(LABEL), DEST) + +#define EDIT_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, ##V) +#define EDIT_ITEM_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_S_P(TYPE, S, PLABEL, V...) MENU_ITEM_S_P(TYPE, S, PLABEL, ##V) +#define EDIT_ITEM_S(TYPE, S, LABEL, V...) EDIT_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_N_P(TYPE, N, PLABEL, V...) MENU_ITEM_N_P(TYPE, N, PLABEL, ##V) +#define EDIT_ITEM_N(TYPE, N, LABEL, V...) EDIT_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_P(TYPE, PLABEL, V...) MENU_ITEM_P(TYPE, PLABEL, ##V) +#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) + +#define EDIT_ITEM_FAST_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_FAST_N_S_P(TYPE, N, S, true, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_S(TYPE, S, LABEL, V...) EDIT_ITEM_FAST_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_N(TYPE, N, LABEL, V...) EDIT_ITEM_FAST_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, true, PLABEL, ##V) +#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_P(TYPE, GET_TEXT(LABEL), ##V) + +#define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ + if (encoderLine == _thisItemNr && ui.use_click()) { \ + ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ + return; \ + } \ + if (ui.should_draw()) MenuItem_confirm::draw \ + (encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ##V); \ +}while(0) -#define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ - return; \ - } \ - if (ui.should_draw()) MenuItem_confirm::draw \ - (encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ##V); \ +// Indexed items set a global index value and optional data +#define _CONFIRM_ITEM_P(PLABEL, V...) do { \ + _skipStatic = false; \ + if (_menuLineNr == _thisItemNr) \ + _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ + NEXT_ITEM(); \ }while(0) -#define _CONFIRM_ITEM_P(PLABEL, V...) do { \ +// Indexed items set a global index value +#define _CONFIRM_ITEM_N_S_P(N, S, V...) do{ \ _skipStatic = false; \ - if (_menuLineNr == _thisItemNr) \ - _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ + if (_menuLineNr == _thisItemNr) { \ + MenuItemBase::init(N, S); \ + _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ + } \ NEXT_ITEM(); \ }while(0) // Indexed items set a global index value -#define _CONFIRM_ITEM_N_P(N, V...) do{ \ - _skipStatic = false; \ - if (_menuLineNr == _thisItemNr) { \ - MenuItemBase::init(N); \ - _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) +#define _CONFIRM_ITEM_N_P(N, V...) _CONFIRM_ITEM_N_S_P(N, nullptr, V) #define CONFIRM_ITEM_P(PLABEL,A,B,V...) _CONFIRM_ITEM_P(PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) #define CONFIRM_ITEM(LABEL, V...) CONFIRM_ITEM_P(GET_TEXT(LABEL), ##V) @@ -530,11 +574,15 @@ class MenuItem_bool : public MenuEditItemBase { #define YESNO_ITEM_P(PLABEL, V...) _CONFIRM_ITEM_P(PLABEL, ##V) #define YESNO_ITEM(LABEL, V...) YESNO_ITEM_P(GET_TEXT(LABEL), ##V) -#define CONFIRM_ITEM_N_P(N,PLABEL,A,B,V...) _CONFIRM_ITEM_N_P(N, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM_N(N,LABEL, V...) CONFIRM_ITEM_N_P(N, GET_TEXT(LABEL), ##V) +#define CONFIRM_ITEM_N_S_P(N,S,PLABEL,A,B,V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) +#define CONFIRM_ITEM_N_S(N,S,LABEL,V...) CONFIRM_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) +#define CONFIRM_ITEM_N_P(N,PLABEL,A,B,V...) _CONFIRM_ITEM_N_P(N, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) +#define CONFIRM_ITEM_N(N,LABEL, V...) CONFIRM_ITEM_N_P(N, GET_TEXT(LABEL), ##V) -#define YESNO_ITEM_N_P(N,PLABEL, V...) _CONFIRM_ITEM_N_P(N, PLABEL, ##V) -#define YESNO_ITEM_N(N,LABEL, V...) YESNO_ITEM_N_P(N, GET_TEXT(LABEL), ##V) +#define YESNO_ITEM_N_S_P(N,S,PLABEL, V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, ##V) +#define YESNO_ITEM_N_S(N,S,LABEL, V...) YESNO_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) +#define YESNO_ITEM_N_P(N,PLABEL, V...) _CONFIRM_ITEM_N_P(N, PLABEL, ##V) +#define YESNO_ITEM_N(N,LABEL, V...) YESNO_ITEM_N_P(N, GET_TEXT(LABEL), ##V) //////////////////////////////////////////// /////////////// Menu Screens /////////////// diff --git a/Marlin/src/lcd/menu/menu_addon.h b/Marlin/src/lcd/menu/menu_addon.h index 5f338c571abf..e66a19409f1e 100644 --- a/Marlin/src/lcd/menu/menu_addon.h +++ b/Marlin/src/lcd/menu/menu_addon.h @@ -22,9 +22,6 @@ #pragma once #include "../lcdprint.h" -#if HAS_GRAPHICAL_LCD - #include "../dogm/ultralcd_DOGM.h" -#endif #define MENU_ITEM_ADDON_START(X) do{ \ if (ui.should_draw() && _menuLineNr == _thisItemNr - 1) { \ diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 0bd1c1e65511..e87158fbd08c 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -300,11 +300,12 @@ void menu_advanced_settings(); #if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) - void _menu_configuration_preheat_settings(const uint8_t m) { + void _menu_configuration_preheat_settings() { #define _MINTEMP_ITEM(N) HEATER_##N##_MINTEMP, #define _MAXTEMP_ITEM(N) HEATER_##N##_MAXTEMP, #define MINTEMP_ALL _MIN(REPEAT(HOTENDS, _MINTEMP_ITEM) 999) #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0) + const uint8_t m = MenuItemBase::itemIndex; START_MENU(); BACK_ITEM(MSG_CONFIGURATION); #if HAS_FAN @@ -323,18 +324,6 @@ void menu_advanced_settings(); END_MENU(); } - void menu_preheat_material1_settings() { _menu_configuration_preheat_settings(0); } - void menu_preheat_material2_settings() { _menu_configuration_preheat_settings(1); } - #if PREHEAT_COUNT >= 3 - void menu_preheat_material3_settings() { _menu_configuration_preheat_settings(3); } - #if PREHEAT_COUNT >= 4 - void menu_preheat_material4_settings() { _menu_configuration_preheat_settings(4); } - #if PREHEAT_COUNT >= 5 - void menu_preheat_material5_settings() { _menu_configuration_preheat_settings(5); } - #endif - #endif - #endif - #endif void menu_configuration() { @@ -414,17 +403,8 @@ void menu_configuration() { // Preheat configurations #if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) - SUBMENU(MSG_PREHEAT_1_SETTINGS, menu_preheat_material1_settings); - SUBMENU(MSG_PREHEAT_2_SETTINGS, menu_preheat_material2_settings); - #if PREHEAT_COUNT >= 3 - SUBMENU(MSG_PREHEAT_3_SETTINGS, menu_preheat_material3_settings); - #if PREHEAT_COUNT >= 4 - SUBMENU(MSG_PREHEAT_4_SETTINGS, menu_preheat_material4_settings); - #if PREHEAT_COUNT >= 5 - SUBMENU(MSG_PREHEAT_5_SETTINGS, menu_preheat_material5_settings); - #endif - #endif - #endif + LOOP_L_N(m, PREHEAT_COUNT) + SUBMENU_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M_SETTINGS, _menu_configuration_preheat_settings); #endif #if ENABLED(EEPROM_SETTINGS) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 1c7abba6d4ce..90639c3af521 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -55,13 +55,21 @@ inline PGM_P _change_filament_command() { } // Initiate Filament Load/Unload/Change at the specified temperature -static void _change_filament(const uint16_t celsius) { +static void _change_filament_with_temp(const uint16_t celsius) { char cmd[11]; sprintf_P(cmd, _change_filament_command(), _change_filament_extruder); thermalManager.setTargetHotend(celsius, _change_filament_extruder); queue.inject(cmd); } +static void _change_filament_with_preset() { + _change_filament_with_temp(ui.material_preset[MenuItemBase::itemIndex].hotend_temp); +} + +static void _change_filament_with_custom() { + _change_filament_with_temp(thermalManager.temp_hotend[MenuItemBase::itemIndex].target); +} + // // Menu to choose the temperature and start Filament Change // @@ -81,11 +89,14 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { START_MENU(); if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_CENTER|SS_INVERT); BACK_ITEM(MSG_BACK); - ACTION_ITEM(MSG_PREHEAT_1, []{ _change_filament(ui.material_preset[0].hotend_temp); }); - ACTION_ITEM(MSG_PREHEAT_2, []{ _change_filament(ui.material_preset[1].hotend_temp); }); - EDIT_ITEM_FAST(int3, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[_change_filament_extruder].target, EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, []{ - _change_filament(thermalManager.temp_hotend[_change_filament_extruder].target); - }); + #if PREHEAT_COUNT + LOOP_L_N(m, PREHEAT_COUNT) + ACTION_ITEM_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); + #endif + EDIT_ITEM_FAST_N(int3, extruder, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[extruder].target, + EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, + _change_filament_with_custom + ); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index a94e79062793..46f48e22fa52 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -66,95 +66,76 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i ui.return_to_status(); } -#if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } +#if PREHEAT_COUNT + + #if HAS_TEMP_HOTEND + inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } + #if HAS_HEATED_BED + inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } + #endif + #endif #if HAS_HEATED_BED - inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } + inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } #endif -#endif -#if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } -#endif - -#if HAS_TEMP_HOTEND || HAS_HEATED_BED #if HAS_TEMP_HOTEND && HAS_HEATED_BED // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ - ACTION_ITEM_N_P(E, msg_preheat_h[M], []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ - ACTION_ITEM_N_P(E, msg_preheat_end_e[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ + ACTION_ITEM_N_S(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ + ACTION_ITEM_N_S(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ }while(0) #elif HAS_MULTI_HOTEND // No heated bed, so just indexed "Preheat ABC" items - #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_P(E, msg_preheat_h[M], []{ _preheat_end(M, MenuItemBase::itemIndex); }) + #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_S(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(M, MenuItemBase::itemIndex); }) #endif - void menu_preheat_m(const uint8_t m) { + void do_preheat_end_m() { _preheat_end(editable.int8, 0); } - #if HOTENDS == 1 - PGM_P msg_preheat[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1), GET_TEXT(MSG_PREHEAT_2), GET_TEXT(MSG_PREHEAT_3), GET_TEXT(MSG_PREHEAT_4), GET_TEXT(MSG_PREHEAT_5)); - #if HAS_HEATED_BED - PGM_P msg_preheat_end[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END), GET_TEXT(MSG_PREHEAT_2_END), GET_TEXT(MSG_PREHEAT_3_END), GET_TEXT(MSG_PREHEAT_4_END), GET_TEXT(MSG_PREHEAT_5_END)); - #endif - #elif HAS_MULTI_HOTEND - PGM_P msg_preheat_all[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_ALL), GET_TEXT(MSG_PREHEAT_2_ALL), GET_TEXT(MSG_PREHEAT_3_ALL), GET_TEXT(MSG_PREHEAT_4_ALL), GET_TEXT(MSG_PREHEAT_5_ALL)); - #endif + #if HAS_MULTI_HOTEND || HAS_HEATED_BED - #if HAS_TEMP_HOTEND && HAS_HEATED_BED && HAS_MULTI_HOTEND - PGM_P msg_preheat_end_e[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_END_E), GET_TEXT(MSG_PREHEAT_2_END_E), GET_TEXT(MSG_PREHEAT_3_END_E), GET_TEXT(MSG_PREHEAT_4_END_E), GET_TEXT(MSG_PREHEAT_5_END_E)); - #endif + // Set editable.int8 to the Material index before entering this menu + // because MenuItemBase::itemIndex will be re-used by PREHEAT_ITEMS + void menu_preheat_m() { + const uint8_t m = editable.int8; // Don't re-use 'editable' in this menu - #if HAS_MULTI_HOTEND - PGM_P msg_preheat_h[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_H), GET_TEXT(MSG_PREHEAT_2_H), GET_TEXT(MSG_PREHEAT_3_H), GET_TEXT(MSG_PREHEAT_4_H), GET_TEXT(MSG_PREHEAT_5_H)); - #endif + START_MENU(); + BACK_ITEM(MSG_TEMPERATURE); - MenuItemBase::itemIndex = m; + #if HOTENDS == 1 - START_MENU(); - BACK_ITEM(MSG_TEMPERATURE); + #if HAS_HEATED_BED + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_both(editable.int8, 0); }); + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_END, do_preheat_end_m); + #else + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); + #endif - #if HOTENDS == 1 + #elif HAS_MULTI_HOTEND - #if HAS_HEATED_BED - ACTION_ITEM_P(msg_preheat[m], []{ _preheat_both(MenuItemBase::itemIndex, 0); }); - ACTION_ITEM_P(msg_preheat_end[m], []{ _preheat_end(MenuItemBase::itemIndex, 0); }); - #else - ACTION_ITEM_P(msg_preheat[m], []{ _preheat_end(MenuItemBase::itemIndex, 0); }); - #endif + HOTEND_LOOP() PREHEAT_ITEMS(editable.int8, e); + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_ALL, []() { + TERN_(HAS_HEATED_BED, []{ _preheat_bed(editable.int8); }); + HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[editable.int8].hotend_temp, e); + }); - #elif HAS_MULTI_HOTEND + #endif - LOOP_S_L_N(n, 0, HOTENDS) PREHEAT_ITEMS(MenuItemBase::itemIndex, n); - ACTION_ITEM_P(msg_preheat_all[m], []() { - TERN_(HAS_HEATED_BED, _preheat_bed(MenuItemBase::itemIndex)); - HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[MenuItemBase::itemIndex].hotend_temp, e); - }); + #if HAS_HEATED_BED + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_BEDONLY, []{ _preheat_bed(editable.int8); }); + #endif - #endif + END_MENU(); + } - #if HAS_HEATED_BED - PGM_P msg_preheat_bed[] = ARRAY_N(PREHEAT_COUNT, GET_TEXT(MSG_PREHEAT_1_BEDONLY), GET_TEXT(MSG_PREHEAT_2_BEDONLY), GET_TEXT(MSG_PREHEAT_3_BEDONLY), GET_TEXT(MSG_PREHEAT_4_BEDONLY), GET_TEXT(MSG_PREHEAT_5_BEDONLY)); - ACTION_ITEM_P(msg_preheat_bed[m], []{ _preheat_bed(MenuItemBase::itemIndex); }); - #endif + #endif // HAS_MULTI_HOTEND || HAS_HEATED_BED - END_MENU(); - } +#endif // PREHEAT_COUNT - void menu_preheat_m1() { menu_preheat_m(0); } - void menu_preheat_m2() { menu_preheat_m(1); } - #if PREHEAT_COUNT >= 3 - void menu_preheat_m3() { menu_preheat_m(2); } - #if PREHEAT_COUNT >= 4 - void menu_preheat_m4() { menu_preheat_m(3); } - #if PREHEAT_COUNT >= 5 - void menu_preheat_m5() { menu_preheat_m(4); } - #endif - #endif - #endif +#if HAS_TEMP_HOTEND || HAS_HEATED_BED void lcd_cooldown() { thermalManager.zero_fan_speeds(); @@ -165,9 +146,11 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #endif // HAS_TEMP_HOTEND || HAS_HEATED_BED void menu_temperature() { - #if HAS_TEMP_HOTEND + #if HAS_TEMP_HOTEND || HAS_HEATED_BED bool has_heat = false; - HOTEND_LOOP() if (thermalManager.temp_hotend[HOTEND_INDEX].target) { has_heat = true; break; } + #if HAS_TEMP_HOTEND + HOTEND_LOOP() if (thermalManager.temp_hotend[HOTEND_INDEX].target) { has_heat = true; break; } + #endif #endif START_MENU(); @@ -279,44 +262,27 @@ void menu_temperature() { #endif // HAS_FAN - #if HAS_TEMP_HOTEND - + #if PREHEAT_COUNT // - // Preheat for Material 1 and 2 + // Preheat for Materials 1 to 5 // - #if HOTENDS > 1 || HAS_HEATED_BED - SUBMENU(MSG_PREHEAT_1, menu_preheat_m1); - SUBMENU(MSG_PREHEAT_2, menu_preheat_m2); - #if PREHEAT_COUNT >= 3 - SUBMENU(MSG_PREHEAT_3, menu_preheat_m3); - #if PREHEAT_COUNT >= 4 - SUBMENU(MSG_PREHEAT_4, menu_preheat_m4); - #if PREHEAT_COUNT >= 5 - SUBMENU(MSG_PREHEAT_5, menu_preheat_m5); - #endif - #endif - #endif - #else - ACTION_ITEM(MSG_PREHEAT_1, []{ _preheat_end(0, 0); }); - ACTION_ITEM(MSG_PREHEAT_2, []{ _preheat_end(1, 0); }); - #if PREHEAT_COUNT >= 3 - ACTION_ITEM(MSG_PREHEAT_3, []{ _preheat_end(2, 0); }); - #if PREHEAT_COUNT >= 3 - ACTION_ITEM(MSG_PREHEAT_4, []{ _preheat_end(3, 0); }); - #if PREHEAT_COUNT >= 3 - ACTION_ITEM(MSG_PREHEAT_5, []{ _preheat_end(4, 0); }); - #endif - #endif + LOOP_L_N(m, PREHEAT_COUNT) { + editable.int8 = m; + #if HOTENDS > 1 || HAS_HEATED_BED + SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); + #else + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); #endif - #endif + } + #endif + #if HAS_TEMP_HOTEND || HAS_HEATED_BED // // Cooldown // if (TERN0(HAS_HEATED_BED, thermalManager.temp_bed.target)) has_heat = true; if (has_heat) ACTION_ITEM(MSG_COOLDOWN, lcd_cooldown); - - #endif // HAS_TEMP_HOTEND + #endif END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 3722b53cb9be..3eeee14d4de9 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -196,21 +196,36 @@ void _lcd_ubl_edit_mesh() { * UBL Validate Mesh submenu * * << UBL Tools - * Mesh Validation with Material 1 - * Mesh Validation with Material 2 + * Mesh Validation with Material 1 up to 5 * Validate Custom Mesh * << Info Screen */ void _lcd_ubl_validate_mesh() { START_MENU(); BACK_ITEM(MSG_UBL_TOOLS); - #if HAS_HEATED_BED - GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); - GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); - #else - GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M1, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); - GCODES_ITEM(MSG_UBL_VALIDATE_MESH_M2, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); - #endif + #if PREHEAT_COUNT + #if HAS_HEATED_BED + #define VALIDATE_MESH_GCODE_ITEM(M) \ + GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26 C P I" STRINGIFY(M))) + #else + #define VALIDATE_MESH_GCODE_ITEM(M) \ + GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26 C P B0 I" STRINGIFY(M))) + #endif + + VALIDATE_MESH_GCODE_ITEM(0); + #if PREHEAT_COUNT > 1 + VALIDATE_MESH_GCODE_ITEM(1); + #if PREHEAT_COUNT > 2 + VALIDATE_MESH_GCODE_ITEM(2); + #if PREHEAT_COUNT > 3 + VALIDATE_MESH_GCODE_ITEM(3); + #if PREHEAT_COUNT > 4 + VALIDATE_MESH_GCODE_ITEM(4); + #endif + #endif + #endif + #endif + #endif // PREHEAT_COUNT ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh); ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); END_MENU(); @@ -292,8 +307,7 @@ void _lcd_ubl_invalidate() { * UBL Build Mesh submenu * * << UBL Tools - * Build Mesh with Material 1 - * Build Mesh with Material 2 + * Build Mesh with Material 1 up to 5 * - Build Custom Mesh >> * Build Cold Mesh * - Fill-in Mesh >> @@ -305,37 +319,36 @@ void _lcd_ubl_invalidate() { void _lcd_ubl_build_mesh() { START_MENU(); BACK_ITEM(MSG_UBL_TOOLS); - #if HAS_HEATED_BED - GCODES_ITEM(MSG_UBL_BUILD_MESH_M1, PSTR( - "G28\n" - "M190 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\n" - "M109 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) "\n" - "G29 P1\n" - "M104 S0\n" - "M140 S0" - )); - GCODES_ITEM(MSG_UBL_BUILD_MESH_M2, PSTR( - "G28\n" - "M190 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\n" - "M109 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) "\n" - "G29 P1\n" - "M104 S0\n" - "M140 S0" - )); - #else - GCODES_ITEM(MSG_UBL_BUILD_MESH_M1, PSTR( - "G28\n" - "M109 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) "\n" - "G29 P1\n" - "M104 S0" - )); - GCODES_ITEM(MSG_UBL_BUILD_MESH_M2, PSTR( - "G28\n" - "M109 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) "\n" - "G29 P1\n" - "M104 S0" - )); - #endif + #if PREHEAT_COUNT + #if HAS_HEATED_BED + #define PREHEAT_BED_GCODE(M) "M190 I" STRINGIFY(M) "\n" + #else + #define PREHEAT_BED_GCODE(M) "" + #endif + #define BUILD_MESH_GCODE_ITEM(M) GCODES_ITEM_S(ui.get_preheat_label(M), MSG_UBL_BUILD_MESH_M, \ + PSTR( \ + "G28\n" \ + PREHEAT_BED_GCODE(M) \ + "M109 I" STRINGIFY(M) "\n" \ + "G29 P1\n" \ + "M104 S0\n" \ + "M140 S0" \ + ) ) + BUILD_MESH_GCODE_ITEM(0); + #if PREHEAT_COUNT > 1 + BUILD_MESH_GCODE_ITEM(1); + #if PREHEAT_COUNT > 2 + BUILD_MESH_GCODE_ITEM(2); + #if PREHEAT_COUNT > 3 + BUILD_MESH_GCODE_ITEM(3); + #if PREHEAT_COUNT > 4 + BUILD_MESH_GCODE_ITEM(4); + #endif + #endif + #endif + #endif + #endif // PREHEAT_COUNT + SUBMENU(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh); GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); SUBMENU(MSG_UBL_FILLIN_MESH, _menu_ubl_fillin); diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index d2033018a627..1848a56d2cc7 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -86,10 +86,6 @@ MarlinUI ui; } #endif -#if PREHEAT_COUNT - preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() -#endif - #if HAS_SPI_LCD #if HAS_GRAPHICAL_LCD @@ -153,6 +149,33 @@ millis_t MarlinUI::next_button_update_ms; // = 0 volatile int8_t encoderDiff; // Updated in update_buttons, added to encoderPosition every LCD update #endif +#if PREHEAT_COUNT + preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() + + PGM_P MarlinUI::get_preheat_label(const uint8_t m) { + #ifdef PREHEAT_1_LABEL + static PGMSTR(preheat_0_label, PREHEAT_1_LABEL); + #endif + #ifdef PREHEAT_2_LABEL + static PGMSTR(preheat_1_label, PREHEAT_2_LABEL); + #endif + #ifdef PREHEAT_3_LABEL + static PGMSTR(preheat_2_label, PREHEAT_3_LABEL); + #endif + #ifdef PREHEAT_4_LABEL + static PGMSTR(preheat_3_label, PREHEAT_4_LABEL); + #endif + #ifdef PREHEAT_5_LABEL + static PGMSTR(preheat_4_label, PREHEAT_5_LABEL); + #endif + + #define _PLBL(N) preheat_##N##_label, + static PGM_P const preheat_labels[PREHEAT_COUNT] PROGMEM = { REPEAT(PREHEAT_COUNT, _PLBL) }; + + return (PGM_P)pgm_read_ptr(&preheat_labels[m]); + } +#endif + #if ENABLED(SDSUPPORT) #include "../sd/cardreader.h" diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 6ebd43a37dd3..2b9efab359e1 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -78,14 +78,6 @@ #if HAS_LCD_MENU - #if HAS_GRAPHICAL_LCD - #define SETCURSOR(col, row) lcd_moveto(col * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) - #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) - #else - #define SETCURSOR(col, row) lcd_moveto(col, row) - #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_WIDTH - (len), row) - #endif - #include "lcdprint.h" void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, const bool wordwrap=false); @@ -505,6 +497,7 @@ class MarlinUI { #if PREHEAT_COUNT static preheat_t material_preset[PREHEAT_COUNT]; + static PGM_P get_preheat_label(const uint8_t m); #endif #if HAS_LCD_MENU From d884d1eda819dd37521013eec8e1a74e77b09038 Mon Sep 17 00:00:00 2001 From: ManuelMcLure Date: Thu, 9 Jul 2020 15:48:06 -0700 Subject: [PATCH 126/483] "M122 I" to reinitialize TMC (#18571) --- Marlin/src/gcode/feature/trinamic/M122.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/gcode/feature/trinamic/M122.cpp b/Marlin/src/gcode/feature/trinamic/M122.cpp index b051877a7e42..2669b323cec6 100644 --- a/Marlin/src/gcode/feature/trinamic/M122.cpp +++ b/Marlin/src/gcode/feature/trinamic/M122.cpp @@ -26,6 +26,7 @@ #include "../../gcode.h" #include "../../../feature/tmc_util.h" +#include "../../../module/stepper/indirection.h" /** * M122: Debug TMC drivers @@ -37,6 +38,8 @@ void GcodeSuite::M122() { if (print_all) LOOP_XYZE(i) print_axis[i] = true; + if (parser.boolval('I')) restore_stepper_drivers(); + #if ENABLED(TMC_DEBUG) #if ENABLED(MONITOR_DRIVER_STATUS) uint16_t interval = MONITOR_DRIVER_STATUS_INTERVAL_MS; From 0f64e7912f950c617d1cff2b3270c70c338e4a9a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 10 Jul 2020 00:08:58 +0000 Subject: [PATCH 127/483] [cron] Bump distribution date (2020-07-10) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index fca6ab3c198d..42f6fd2300b7 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-09" + #define STRING_DISTRIBUTION_DATE "2020-07-10" #endif /** From b64113411c83d6f6f6947d9ae94faa65406d32dd Mon Sep 17 00:00:00 2001 From: cccc Date: Fri, 10 Jul 2020 11:43:04 +0800 Subject: [PATCH 128/483] Add current offset for POWER_MONITOR sensor (#18600) --- Marlin/Configuration_adv.h | 1 + Marlin/src/feature/power_monitor.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f1c52a0ee8bc..e102cb411332 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3029,6 +3029,7 @@ //#define POWER_MONITOR_VOLTAGE // Monitor the system voltage #if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) #define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF! + #define POWER_MONITOR_CURRENT_OFFSET -1 // Offset value for current sensors with linear function output #define POWER_MONITOR_VOLTS_PER_VOLT 0.11786 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF! #define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display) #endif diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index 00b45b0f9a82..9db356d7b7e5 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -35,7 +35,7 @@ struct pm_lpf_t { filter_buf = filter_buf - (filter_buf >> K_VALUE) + (uint32_t(sample) << K_SCALE); } void capture() { - value = filter_buf * (SCALE * (1.0f / (1UL << (PM_K_VALUE + PM_K_SCALE)))); + value = filter_buf * (SCALE * (1.0f / (1UL << (PM_K_VALUE + PM_K_SCALE)))) + (POWER_MONITOR_CURRENT_OFFSET); } void reset(uint16_t reset_value = 0) { filter_buf = uint32_t(reset_value) << (K_VALUE + K_SCALE); From 69490e112240362c004e192e3becbcca3c2292fa Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 10 Jul 2020 15:45:06 +1200 Subject: [PATCH 129/483] Fix CMSIS / USB-FD regression (#18602) --- Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp | 12 ++++---- .../usb_flashdrive/lib-uhs2/confdescparser.h | 14 ++++----- .../sd/usb_flashdrive/lib-uhs2/masstorage.cpp | 8 ++--- .../sd/usb_flashdrive/lib-uhs2/masstorage.h | 4 +-- .../sd/usb_flashdrive/lib-uhs2/message.cpp | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h | 8 ++--- .../UHS_BULK_STORAGE/UHS_BULK_STORAGE.h | 2 +- .../UHS_BULK_STORAGE_INLINE.h | 2 +- .../lib-uhs3/UHS_host/UHS_host_INLINE.h | 30 +++++++++---------- .../lib-uhs3/UHS_host/UHS_usb_ch9.h | 8 ++--- .../lib-uhs3/UHS_host/UHS_usbhost.h | 4 +-- 11 files changed, 47 insertions(+), 47 deletions(-) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp index 9092633b844f..5601446f8108 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp @@ -428,7 +428,7 @@ void USB::Task() { //USB state machine uint8_t rcode; uint8_t tmpdata; static uint32_t delay = 0; - //USB_DEVICE_DESCRIPTOR buf; + //USB_FD_DEVICE_DESCRIPTOR buf; bool lowspeed = false; MAX3421E::Task(); @@ -647,8 +647,8 @@ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { //printf("Configuring: parent = %i, port = %i\r\n", parent, port); uint8_t devConfigIndex; uint8_t rcode = 0; - uint8_t buf[sizeof (USB_DEVICE_DESCRIPTOR)]; - USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); + uint8_t buf[sizeof (USB_FD_DEVICE_DESCRIPTOR)]; + USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); UsbDevice *p = nullptr; EpInfo *oldep_ptr = nullptr; EpInfo epInfo; @@ -678,13 +678,13 @@ uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { p->lowspeed = lowspeed; // Get device descriptor - rcode = getDevDescr(0, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*)buf); + rcode = getDevDescr(0, 0, sizeof (USB_FD_DEVICE_DESCRIPTOR), (uint8_t*)buf); // Restore p->epinfo p->epinfo = oldep_ptr; if (rcode) { - //printf("Configuring error: Can't get USB_DEVICE_DESCRIPTOR\r\n"); + //printf("Configuring error: Can't get USB_FD_DEVICE_DESCRIPTOR\r\n"); return rcode; } @@ -762,7 +762,7 @@ uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t con uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) { const uint8_t bufSize = 64; uint8_t buf[bufSize]; - USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); + USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); uint8_t ret = getConfDescr(addr, ep, 9, conf, buf); if (ret) return ret; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h index 5d4ddaf175c9..10478eb6441d 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h @@ -30,10 +30,10 @@ class UsbConfigXtracter { public: - //virtual void ConfigXtract(const USB_CONFIGURATION_DESCRIPTOR *conf) = 0; - //virtual void InterfaceXtract(uint8_t conf, const USB_INTERFACE_DESCRIPTOR *iface) = 0; + //virtual void ConfigXtract(const USB_FD_CONFIGURATION_DESCRIPTOR *conf) = 0; + //virtual void InterfaceXtract(uint8_t conf, const USB_FD_INTERFACE_DESCRIPTOR *iface) = 0; - virtual void EndpointXtract(uint8_t conf __attribute__((unused)), uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR *ep __attribute__((unused))) { + virtual void EndpointXtract(uint8_t conf __attribute__((unused)), uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_FD_ENDPOINT_DESCRIPTOR *ep __attribute__((unused))) { } }; @@ -50,7 +50,7 @@ class ConfigDescParser : public USBReadParser { MultiValueBuffer theBuffer; MultiByteValueParser valParser; ByteSkipper theSkipper; - uint8_t varBuffer[16 /*sizeof(USB_CONFIGURATION_DESCRIPTOR)*/]; + uint8_t varBuffer[16 /*sizeof(USB_FD_CONFIGURATION_DESCRIPTOR)*/]; uint8_t stateParseDescr; // ParseDescriptor state @@ -97,8 +97,8 @@ void ConfigDescParser::Parse(const uin compare masks for them. When the match is found, calls EndpointXtract passing buffer containing endpoint descriptor */ template bool ConfigDescParser::ParseDescriptor(uint8_t **pp, uint16_t *pcntdn) { - USB_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast(varBuffer); - USB_INTERFACE_DESCRIPTOR* uid = reinterpret_cast(varBuffer); + USB_FD_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast(varBuffer); + USB_FD_INTERFACE_DESCRIPTOR* uid = reinterpret_cast(varBuffer); switch (stateParseDescr) { case 0: theBuffer.valueSize = 2; @@ -155,7 +155,7 @@ bool ConfigDescParser::ParseDescriptor case USB_DESCRIPTOR_ENDPOINT: if (!valParser.Parse(pp, pcntdn)) return false; if (isGoodInterface && theXtractor) - theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_ENDPOINT_DESCRIPTOR*)varBuffer); + theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_FD_ENDPOINT_DESCRIPTOR*)varBuffer); break; //case HID_DESCRIPTOR_HID: // if (!valParser.Parse(pp, pcntdn)) return false; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp index a57245f78a70..2512e3846c63 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp @@ -250,10 +250,10 @@ bLastUsbError(0) { */ uint8_t BulkOnly::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) { - const uint8_t constBufSize = sizeof (USB_DEVICE_DESCRIPTOR); + const uint8_t constBufSize = sizeof (USB_FD_DEVICE_DESCRIPTOR); uint8_t buf[constBufSize]; - USB_DEVICE_DESCRIPTOR * udd = reinterpret_cast(buf); + USB_FD_DEVICE_DESCRIPTOR * udd = reinterpret_cast(buf); uint8_t rcode; UsbDevice *p = nullptr; EpInfo *oldep_ptr = nullptr; @@ -529,7 +529,7 @@ uint8_t BulkOnly::Init(uint8_t parent __attribute__((unused)), uint8_t port __at * @param proto * @param pep */ -void BulkOnly::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto __attribute__((unused)), const USB_ENDPOINT_DESCRIPTOR * pep) { +void BulkOnly::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto __attribute__((unused)), const USB_FD_ENDPOINT_DESCRIPTOR * pep) { ErrorMessage (PSTR("Conf.Val"), conf); ErrorMessage (PSTR("Iface Num"), iface); ErrorMessage (PSTR("Alt.Set"), alt); @@ -1166,7 +1166,7 @@ uint8_t BulkOnly::HandleSCSIError(uint8_t status) { * * @param ep_ptr */ -void BulkOnly::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR * ep_ptr) { +void BulkOnly::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) { Notify(PSTR("Endpoint descriptor:"), 0x80); Notify(PSTR("\r\nLength:\t\t"), 0x80); D_PrintHex (ep_ptr->bLength, 0x80); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h index 09b82fdb92d4..960651ff2fc2 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h @@ -491,7 +491,7 @@ class BulkOnly : public USBDeviceConfig, public UsbConfigXtracter { uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]; // Sector size, clipped to 16 bits bool LUNOk[MASS_MAX_SUPPORTED_LUN]; // use this to check for media changes. bool WriteOk[MASS_MAX_SUPPORTED_LUN]; - void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr); + void PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR* ep_ptr); // Additional Initialization Method for Subclasses @@ -526,7 +526,7 @@ class BulkOnly : public USBDeviceConfig, public UsbConfigXtracter { virtual uint8_t GetAddress() { return bAddress; } // UsbConfigXtracter implementation - void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep); + void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_FD_ENDPOINT_DESCRIPTOR *ep); virtual bool DEVCLASSOK(uint8_t klass) { return klass == USB_CLASS_MASS_STORAGE; } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp index 78a9ba1fd71d..0ab58b91f3ed 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp @@ -37,7 +37,7 @@ int UsbDEBUGlvl = 0x80; void E_Notifyc(char c, int lvl) { if (UsbDEBUGlvl < lvl) return; USB_HOST_SERIAL.print(c - #if !defined(ARDUINO) || ARDUINO < 100 + #if !defined(ARDUINO) && !defined(ARDUINO_ARCH_LPC176X) , BYTE #endif ); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h index 039215b1bbcf..a08d58b23169 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h @@ -116,7 +116,7 @@ typedef struct { uint8_t iProduct; // Index of String Descriptor describing the product. uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number. uint8_t bNumConfigurations; // Number of possible configurations. -} __attribute__((packed)) USB_DEVICE_DESCRIPTOR; +} __attribute__((packed)) USB_FD_DEVICE_DESCRIPTOR; /* Configuration descriptor structure */ typedef struct { @@ -128,7 +128,7 @@ typedef struct { uint8_t iConfiguration; // Index of String Descriptor describing the configuration. uint8_t bmAttributes; // Configuration characteristics. uint8_t bMaxPower; // Maximum power consumed by this configuration. -} __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR; +} __attribute__((packed)) USB_FD_CONFIGURATION_DESCRIPTOR; /* Interface descriptor structure */ typedef struct { @@ -141,7 +141,7 @@ typedef struct { uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF). uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. uint8_t iInterface; // Index of String Descriptor describing the interface. -} __attribute__((packed)) USB_INTERFACE_DESCRIPTOR; +} __attribute__((packed)) USB_FD_INTERFACE_DESCRIPTOR; /* Endpoint descriptor structure */ typedef struct { @@ -151,7 +151,7 @@ typedef struct { uint8_t bmAttributes; // Endpoint transfer type. uint16_t wMaxPacketSize; // Maximum packet size. uint8_t bInterval; // Polling interval in frames. -} __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR; +} __attribute__((packed)) USB_FD_ENDPOINT_DESCRIPTOR; /* HID descriptor */ typedef struct { diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h index 6ad9cb5c8dc3..26ed852a279e 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h @@ -174,7 +174,7 @@ class UHS_Bulk_Storage : public UHS_USBInterface { volatile uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]; // Sector size, clipped to 16 bits volatile bool LUNOk[MASS_MAX_SUPPORTED_LUN]; // use this to check for media changes. volatile bool WriteOk[MASS_MAX_SUPPORTED_LUN]; - void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr); + void PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR* ep_ptr); public: UHS_Bulk_Storage(UHS_USB_HOST_BASE *p); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h index a171b13818ca..6ad9cff7f086 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h @@ -1188,7 +1188,7 @@ uint8_t UHS_NI UHS_Bulk_Storage::HandleSCSIError(uint8_t status) { * * @param ep_ptr */ -void UHS_NI UHS_Bulk_Storage::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR * ep_ptr) { +void UHS_NI UHS_Bulk_Storage::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) { Notify(PSTR("Endpoint descriptor:"), 0x80); Notify(PSTR("\r\nLength:\t\t"), 0x80); D_PrintHex (ep_ptr->bLength, 0x80); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index 908391a157f1..eb96c7eb5d5d 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -239,12 +239,12 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe // wrap in {} to throw away the 64 byte buffer when we are done with it { uint8_t buf[biggest]; - USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); + USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); #else const uint8_t biggest = 18; uint8_t buf[biggest]; - USB_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); - USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); + USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); + USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); #endif //for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { @@ -309,7 +309,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe sof_delay(200); goto again; } - HOST_DEBUG("Configuring error: 0x%2.2x Can't get USB_DEVICE_DESCRIPTOR\r\n", rcode); + HOST_DEBUG("Configuring error: 0x%2.2x Can't get USB_FD_DEVICE_DESCRIPTOR\r\n", rcode); return rcode; } @@ -378,7 +378,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe } // unwrapped, old large buf now invalid and discarded. uint8_t buf[18]; - USB_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); + USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); #endif ei.address = addrPool.AllocAddress(parent, IsHub(ei.klass), port); @@ -415,9 +415,9 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe HOST_DEBUG("configs: %i\r\n", configs); for(uint8_t conf = 0; (!rcode) && (conf < configs); conf++) { // read the config descriptor into a buffer. - rcode = getConfDescr(ei.address, sizeof (USB_CONFIGURATION_DESCRIPTOR), conf, buf); + rcode = getConfDescr(ei.address, sizeof (USB_FD_CONFIGURATION_DESCRIPTOR), conf, buf); if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR\r\n", rcode); rcode = UHS_HOST_ERROR_FailGetConfDescr; continue; } @@ -438,7 +438,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe uint8_t offset; rcode = initDescrStream(&ei, ucd, pep, data, &left, &read, &offset); if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); break; } for(; (numinf) && (!rcode); inf++) { @@ -451,7 +451,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe break; } if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't close USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't close USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); continue; } rcode = TestInterface(&ei); @@ -471,9 +471,9 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe if(!bestsuccess) rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED; } if(!rcode) { - rcode = getConfDescr(ei.address, sizeof (USB_CONFIGURATION_DESCRIPTOR), bestconf, buf); + rcode = getConfDescr(ei.address, sizeof (USB_FD_CONFIGURATION_DESCRIPTOR), bestconf, buf); if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR\r\n", rcode); rcode = UHS_HOST_ERROR_FailGetConfDescr; } } @@ -497,7 +497,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe uint8_t offset; rcode = initDescrStream(&ei, ucd, pep, data, &left, &read, &offset); if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); } else { for(; (numinf) && (!rcode); inf++) { // iterate for each interface on this config @@ -508,7 +508,7 @@ uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t spe break; } if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't close USB_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + HOST_DEBUG("Configuring error: %2.2x Can't close USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); continue; } @@ -721,7 +721,7 @@ uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytes * @param offset * @return zero for success or error code */ -uint8_t UHS_USB_HOST_BASE::initDescrStream(ENUMERATION_INFO *ei, USB_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset) { +uint8_t UHS_USB_HOST_BASE::initDescrStream(ENUMERATION_INFO *ei, USB_FD_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset) { if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT; if(!pep) return UHS_HOST_ERROR_NULL_EPINFO; *left = ucd->wTotalLength; @@ -837,7 +837,7 @@ uint8_t UHS_USB_HOST_BASE::getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pe return rcode; } -uint8_t UHS_USB_HOST_BASE::seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_CONFIGURATION_DESCRIPTOR *ucd) { +uint8_t UHS_USB_HOST_BASE::seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_FD_CONFIGURATION_DESCRIPTOR *ucd) { if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT; uint8_t data[ei->bMaxPacketSize0]; UHS_EpInfo *pep; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h index 34b8ad72e7ef..9d945d69c52b 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h @@ -164,7 +164,7 @@ typedef struct { uint8_t iProduct; // Index of String Descriptor describing the product. uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number. uint8_t bNumConfigurations; // Number of possible configurations. -} __attribute__((packed)) USB_DEVICE_DESCRIPTOR; +} __attribute__((packed)) USB_FD_DEVICE_DESCRIPTOR; /* Configuration descriptor structure */ typedef struct { @@ -176,7 +176,7 @@ typedef struct { uint8_t iConfiguration; // Index of String Descriptor describing the configuration. uint8_t bmAttributes; // Configuration characteristics. uint8_t bMaxPower; // Maximum power consumed by this configuration. -} __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR; +} __attribute__((packed)) USB_FD_CONFIGURATION_DESCRIPTOR; /* Interface descriptor structure */ typedef struct { @@ -189,7 +189,7 @@ typedef struct { uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF). uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. uint8_t iInterface; // Index of String Descriptor describing the interface. -} __attribute__((packed)) USB_INTERFACE_DESCRIPTOR; +} __attribute__((packed)) USB_FD_INTERFACE_DESCRIPTOR; /* Endpoint descriptor structure */ typedef struct { @@ -199,7 +199,7 @@ typedef struct { uint8_t bmAttributes; // Endpoint transfer type. uint16_t wMaxPacketSize; // Maximum packet size. uint8_t bInterval; // Polling interval in frames. -} __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR; +} __attribute__((packed)) USB_FD_ENDPOINT_DESCRIPTOR; /* HID descriptor */ /* diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h index 9a6b110a156b..c19574b4af1c 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h @@ -207,7 +207,7 @@ class UHS_USB_HOST_BASE { interrupts(); } - uint8_t UHS_NI seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_CONFIGURATION_DESCRIPTOR *ucd); + uint8_t UHS_NI seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_FD_CONFIGURATION_DESCRIPTOR *ucd); uint8_t UHS_NI setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t epcount, volatile UHS_EpInfo* eprecord_ptr); @@ -261,7 +261,7 @@ class UHS_USB_HOST_BASE { uint8_t TestInterface(ENUMERATION_INFO *ei); uint8_t enumerateInterface(ENUMERATION_INFO *ei); uint8_t getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset); - uint8_t initDescrStream(ENUMERATION_INFO *ei, USB_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset); + uint8_t initDescrStream(ENUMERATION_INFO *ei, USB_FD_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset); uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data); uint8_t doSoftReset(uint8_t parent, uint8_t port, uint8_t address); From e35a1d396f28a859dc07783a702311eb8d9fd772 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 10 Jul 2020 00:49:08 -0300 Subject: [PATCH 130/483] Fix Chitu V6 with LVGL UI (#18608) --- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 6d668bf0c58a..f8c1375cb477 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -112,9 +112,6 @@ // // TronXY TFT Support // -#define FSMC_GRAPHICAL_TFT -#define TOUCH_BUTTONS - #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 #define LCD_FULL_PIXEL_WIDTH 480 From 8f725e25b5242121662248a66d96ecb69ea59d72 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 10 Jul 2020 15:51:04 +1200 Subject: [PATCH 131/483] Fix CHITU_F103 pio.board name (#18486) --- .../PlatformIO/boards/{chitu_f103.json => CHITU_F103.json} | 0 platformio.ini | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename buildroot/share/PlatformIO/boards/{chitu_f103.json => CHITU_F103.json} (100%) diff --git a/buildroot/share/PlatformIO/boards/chitu_f103.json b/buildroot/share/PlatformIO/boards/CHITU_F103.json similarity index 100% rename from buildroot/share/PlatformIO/boards/chitu_f103.json rename to buildroot/share/PlatformIO/boards/CHITU_F103.json diff --git a/platformio.ini b/platformio.ini index ae08ee9335f6..eac46b660fda 100644 --- a/platformio.ini +++ b/platformio.ini @@ -672,7 +672,7 @@ lib_ignore = LiquidCrystal, LiquidTWI2, Adafruit NeoPixel, TMCStepper, U8glib-H [env:chitu_f103] platform = ${common_stm32f1.platform} extends = common_stm32f1 -board = chitu_f103 +board = CHITU_F103 extra_scripts = pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/chitu_crypt.py build_flags = ${common_stm32f1.build_flags} From b6051efe5b13052aa7654269c8bf8c4f5fed03d5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 10 Jul 2020 01:27:10 -0500 Subject: [PATCH 132/483] Capitalize "G-code" --- Marlin/Configuration.h | 2 +- Marlin/Configuration_adv.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2d50a9f8b218..11484586169e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2213,7 +2213,7 @@ // then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) //#define TEMP_STAT_LEDS -// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +// SkeinForge sends the wrong arc G-codes when using Arc Point as fillet procedure //#define SF_ARC_FIX // Support for the BariCUDA Paste Extruder diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e102cb411332..b58749505848 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1186,7 +1186,7 @@ #if ENABLED(SDCARD_SORT_ALPHA) #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. #define FOLDER_SORTING -1 // -1=above 0=none 1=below - #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 G-code. #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. @@ -2424,7 +2424,7 @@ * for error conditions like overtemperature and short to ground. * To manage over-temp Marlin can decrease the driver current until the error condition clears. * Other detected conditions can be used to stop the current print. - * Relevant g-codes: + * Relevant G-codes: * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. * M911 - Report stepper driver overtemperature pre-warn condition. * M912 - Clear stepper driver overtemperature pre-warn condition flag. @@ -2715,7 +2715,7 @@ * Monitor L6470 drivers for error conditions like over temperature and over current. * In the case of over temperature Marlin can decrease the drive until the error condition clears. * Other detected conditions can be used to stop the current print. - * Relevant g-codes: + * Relevant G-codes: * M906 - I1/2/3/4/5 Set or get motor drive level using axis codes X, Y, Z, E. Report values if no axis codes given. * I not present or I0 or I1 - X, Y, Z or E0 * I2 - X2, Y2, Z2 or E1 @@ -3029,7 +3029,7 @@ //#define POWER_MONITOR_VOLTAGE // Monitor the system voltage #if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) #define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF! - #define POWER_MONITOR_CURRENT_OFFSET -1 // Offset value for current sensors with linear function output + #define POWER_MONITOR_CURRENT_OFFSET -1 // Offset value for current sensors with linear function output #define POWER_MONITOR_VOLTS_PER_VOLT 0.11786 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF! #define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display) #endif From c765bb05d78ca26be6a924f5455a185c8cb759d8 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 11 Jul 2020 00:11:31 +0000 Subject: [PATCH 133/483] [cron] Bump distribution date (2020-07-11) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 42f6fd2300b7..f0dba43d8ffd 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-10" + #define STRING_DISTRIBUTION_DATE "2020-07-11" #endif /** From c4dd0082a1a24a6f457488fef3fbf8161e761b46 Mon Sep 17 00:00:00 2001 From: Axel Date: Sat, 11 Jul 2020 01:23:48 -0400 Subject: [PATCH 134/483] Option to assist thermocouple debug (#18621) --- Marlin/src/module/temperature.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 4d081f39c122..48cf38867093 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -24,6 +24,9 @@ * temperature.cpp - temperature control */ +// Useful when debugging thermocouples +//#define IGNORE_THERMOCOUPLE_ERRORS + #include "temperature.h" #include "endstops.h" @@ -1011,14 +1014,15 @@ void Temperature::manage_heater() { updateTemperaturesFromRawValues(); // also resets the watchdog - #if ENABLED(HEATER_0_USES_MAX6675) - if (temp_hotend[0].celsius > _MIN(HEATER_0_MAXTEMP, HEATER_0_MAX6675_TMAX - 1.0)) max_temp_error(H_E0); - if (temp_hotend[0].celsius < _MAX(HEATER_0_MINTEMP, HEATER_0_MAX6675_TMIN + .01)) min_temp_error(H_E0); - #endif - - #if ENABLED(HEATER_1_USES_MAX6675) - if (temp_hotend[1].celsius > _MIN(HEATER_1_MAXTEMP, HEATER_1_MAX6675_TMAX - 1.0)) max_temp_error(H_E1); - if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(H_E1); + #if DISABLED(IGNORE_THERMOCOUPLE_ERRORS) + #if ENABLED(HEATER_0_USES_MAX6675) + if (temp_hotend[0].celsius > _MIN(HEATER_0_MAXTEMP, HEATER_0_MAX6675_TMAX - 1.0)) max_temp_error(H_E0); + if (temp_hotend[0].celsius < _MAX(HEATER_0_MINTEMP, HEATER_0_MAX6675_TMIN + .01)) min_temp_error(H_E0); + #endif + #if ENABLED(HEATER_1_USES_MAX6675) + if (temp_hotend[1].celsius > _MIN(HEATER_1_MAXTEMP, HEATER_1_MAX6675_TMAX - 1.0)) max_temp_error(H_E1); + if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(H_E1); + #endif #endif millis_t ms = millis(); @@ -2180,7 +2184,7 @@ void Temperature::disable_all_heaters() { WRITE_MAX6675(HIGH); // disable TT_MAX6675 - if (max6675_temp & MAX6675_ERROR_MASK) { + if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK)) { max6675_errors[hindex] += 1; if (max6675_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) { SERIAL_ERROR_START(); @@ -2201,16 +2205,13 @@ void Temperature::disable_all_heaters() { max6675_temp = 4 * ( #if COUNT_6675 > 1 hindex ? HEATER_1_MAX6675_TMAX : HEATER_0_MAX6675_TMAX - #elif ENABLED(HEATER_1_USES_MAX6675) - HEATER_1_MAX6675_TMAX #else - HEATER_0_MAX6675_TMAX + TERN(HEATER_1_USES_MAX6675, HEATER_1_MAX6675_TMAX, HEATER_0_MAX6675_TMAX) #endif ); } - else { + else max6675_temp >>= MAX6675_DISCARD_BITS; - } } else { max6675_temp >>= MAX6675_DISCARD_BITS; From d09347d603e506fe014e16e3102797296d0e1559 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 12 Jul 2020 00:09:12 +0000 Subject: [PATCH 135/483] [cron] Bump distribution date (2020-07-12) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f0dba43d8ffd..33c2c1478657 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-11" + #define STRING_DISTRIBUTION_DATE "2020-07-12" #endif /** From 4457b9d5d2569eaae99e70ba5030be73402a5ef3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 12 Jul 2020 03:20:01 -0500 Subject: [PATCH 136/483] Clarify MICROSTEP_MODES --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b58749505848..b4a37b7002a0 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -953,7 +953,7 @@ //#define MICROSTEP16 LOW,LOW,HIGH //#define MICROSTEP32 HIGH,LOW,HIGH -// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +// Microstep settings (Requires a board with pins named X_MS1, X_MS2, etc.) #define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** From 2c238e4fc2f18da08d7cb171bb7236beccdd6f83 Mon Sep 17 00:00:00 2001 From: Speaka <48431623+Speaka@users.noreply.github.com> Date: Sun, 12 Jul 2020 20:16:56 +0200 Subject: [PATCH 137/483] Option for extra endstop check (#18424) --- Marlin/Configuration.h | 3 +++ Marlin/src/module/endstops.cpp | 16 ++++++---------- Marlin/src/module/endstops.h | 4 ++++ Marlin/src/module/motion.cpp | 15 +++++++++++++++ buildroot/tests/mega2560-tests | 2 +- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 11484586169e..af98be4d1bad 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -719,6 +719,9 @@ */ //#define ENDSTOP_NOISE_THRESHOLD 2 +// Check for stuck or disconnected endstops during homing moves. +//#define DETECT_BROKEN_ENDSTOP + //============================================================================= //============================== Movement Settings ============================ //============================================================================= diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 9cf283ccba4c..a9a0a7e9bf67 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -861,10 +861,6 @@ void Endstops::update() { #if ENABLED(SPI_ENDSTOPS) - #define X_STOP (X_HOME_DIR < 0 ? X_MIN : X_MAX) - #define Y_STOP (Y_HOME_DIR < 0 ? Y_MIN : Y_MAX) - #define Z_STOP (Z_HOME_DIR < 0 ? Z_MIN : Z_MAX) - bool Endstops::tmc_spi_homing_check() { bool hit = false; #if X_SPI_SENSORLESS @@ -875,7 +871,7 @@ void Endstops::update() { || stepperZ.test_stall_status() #endif )) { - SBI(live_state, X_STOP); + SBI(live_state, X_ENDSTOP); hit = true; } #endif @@ -887,7 +883,7 @@ void Endstops::update() { || stepperZ.test_stall_status() #endif )) { - SBI(live_state, Y_STOP); + SBI(live_state, Y_ENDSTOP); hit = true; } #endif @@ -899,7 +895,7 @@ void Endstops::update() { || stepperY.test_stall_status() #endif )) { - SBI(live_state, Z_STOP); + SBI(live_state, Z_ENDSTOP); hit = true; } #endif @@ -907,9 +903,9 @@ void Endstops::update() { } void Endstops::clear_endstop_state() { - TERN_(X_SPI_SENSORLESS, CBI(live_state, X_STOP)); - TERN_(Y_SPI_SENSORLESS, CBI(live_state, Y_STOP)); - TERN_(Z_SPI_SENSORLESS, CBI(live_state, Z_STOP)); + TERN_(X_SPI_SENSORLESS, CBI(live_state, X_ENDSTOP)); + TERN_(Y_SPI_SENSORLESS, CBI(live_state, Y_ENDSTOP)); + TERN_(Z_SPI_SENSORLESS, CBI(live_state, Z_ENDSTOP)); } #endif // SPI_ENDSTOPS diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 0121492bd643..a5ae8d2f92ef 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -38,6 +38,10 @@ enum EndstopEnum : char { Z4_MIN, Z4_MAX }; +#define X_ENDSTOP (X_HOME_DIR < 0 ? X_MIN : X_MAX) +#define Y_ENDSTOP (Y_HOME_DIR < 0 ? Y_MIN : Y_MAX) +#define Z_ENDSTOP (Z_HOME_DIR < 0 ? TERN(HOMING_Z_WITH_PROBE, Z_MIN, Z_MIN_PROBE) : Z_MAX) + class Endstops { public: #if HAS_EXTRA_ENDSTOPS diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 5b7845e45b4b..539ceac78784 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1606,6 +1606,21 @@ void homeaxis(const AxisEnum axis) { #endif ); + #if ENABLED(DETECT_BROKEN_ENDSTOP) + // Check for a broken endstop + EndstopEnum es; + switch (axis) { + default: + case X_AXIS: es = X_ENDSTOP; break; + case Y_AXIS: es = Y_ENDSTOP; break; + case Z_AXIS: es = Z_ENDSTOP; break; + } + if (TEST(endstops.state(), es)) { + SERIAL_ECHO_MSG("Bad ", axis_codes[axis], " Endstop?"); + kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); + } + #endif + // Slow move towards endstop until triggered if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Home 2 Slow:"); diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 1c299ad30755..3a969c9cf72a 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -71,7 +71,7 @@ opt_set NUM_SERVOS 1 opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ - PRUSA_MMU2 MMU2_MENUS PRUSA_MMU2_S_MODE DIRECT_STEPPING \ + PRUSA_MMU2 MMU2_MENUS PRUSA_MMU2_S_MODE DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2 | Servo | 3-Point + Debug | G38 ..." From 56c3deb423e15a6257f246d13591f71438e5ec14 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 12 Jul 2020 11:43:52 -0700 Subject: [PATCH 138/483] Fix G35 output formatting (#18631) --- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 2d0ad3f64d7f..b4e4c6edfe8f 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -154,7 +154,7 @@ void GcodeSuite::G35() { SERIAL_ECHOPAIR("Turn ", tramming_point_name[i], " ", (screw_thread & 1) == (adjust > 0) ? "Counter-Clockwise" : "Clockwise", - "by ", abs(full_turns), " turns"); + " by ", abs(full_turns), " turns"); if (minutes) SERIAL_ECHOPAIR(" and ", abs(minutes), " minutes"); SERIAL_EOL(); } From 0f6826ffc0423aa4485c759c89acc467f4a8d784 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 13 Jul 2020 00:09:18 +0000 Subject: [PATCH 139/483] [cron] Bump distribution date (2020-07-13) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 33c2c1478657..20fef4bfbbc1 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-12" + #define STRING_DISTRIBUTION_DATE "2020-07-13" #endif /** From 7a0af01e692ddcf2ee55800a035c2276c40bee7c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 13 Jul 2020 15:57:26 -0500 Subject: [PATCH 140/483] Creality V4 cleanup --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 46 ++++++++++++---------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index b50be3307935..2a7a212501b2 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -38,27 +38,31 @@ // // EEPROM // - -/* I2C */ -#define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 -//#define E2END 0x3FFF // 16Kb (24c16) -#define IIC_EEPROM_SDA PA11 -#define IIC_EEPROM_SCL PA12 - -// SD EEPROM was in your original build, so... -#define SDCARD_EEPROM_EMULATION - -/* SPI */ -//#define SPI_EEPROM // EEPROM on SPI-0 -//#define SPI_CHAN_EEPROM1 ? -//#define SPI_EEPROM1_CS ? -// 2K EEPROM -//#define SPI_EEPROM2_CS ? -// 32Mb FLASH -//#define SPI_FLASH_CS ? - -/* FLASH */ -//#define FLASH_EEPROM_EMULATION +#if NO_EEPROM_SELECTED + // FLASH + //#define FLASH_EEPROM_EMULATION + + // I2C + //#define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 + #if ENABLED(IIC_BL24CXX_EEPROM) + #define IIC_EEPROM_SDA PA11 + #define IIC_EEPROM_SCL PA12 + #define MARLIN_EEPROM_SIZE 0x4000 // 16Kb (24c16) + #else + #define SDCARD_EEPROM_EMULATION // SD EEPROM was in the original build, so... + #endif + + // SPI + //#define SPI_EEPROM // EEPROM on SPI-0 + //#define SPI_CHAN_EEPROM1 ? + //#define SPI_EEPROM1_CS ? + + // 2K EEPROM + //#define SPI_EEPROM2_CS ? + + // 32Mb FLASH + //#define SPI_FLASH_CS ? +#endif // // Servos From b67000126984718e559e984da92ee99bedcb04db Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 14 Jul 2020 00:09:09 +0000 Subject: [PATCH 141/483] [cron] Bump distribution date (2020-07-14) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 20fef4bfbbc1..55e74947617d 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-13" + #define STRING_DISTRIBUTION_DATE "2020-07-14" #endif /** From 0e1cb10909b47d939d0766c35cdd3cbbd1d37def Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 13 Jul 2020 19:59:32 -0500 Subject: [PATCH 142/483] Fix / improve menu items (#18644) --- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 9 ++-- Marlin/src/lcd/language/language_en.h | 10 ++--- Marlin/src/lcd/lcdprint.cpp | 7 ++- Marlin/src/lcd/menu/menu.cpp | 1 + Marlin/src/lcd/menu/menu.h | 1 + Marlin/src/lcd/menu/menu_advanced.cpp | 47 ++++++++++++--------- Marlin/src/lcd/menu/menu_configuration.cpp | 1 + Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/libs/numtostr.cpp | 47 +++++++++++++-------- Marlin/src/libs/numtostr.h | 3 ++ Marlin/src/module/configuration_store.cpp | 2 +- 11 files changed, 78 insertions(+), 52 deletions(-) diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 5b1de8008aab..7804914d6698 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -1032,13 +1032,12 @@ void MarlinUI::draw_status_screen() { // Low-level draw_edit_screen can be used to draw an edit screen from anyplace void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { ui.encoder_direction_normal(); - uint8_t n = lcd_put_u8str_ind_P(0, 1, pstr, itemIndex, itemString, LCD_WIDTH - 1); if (value != nullptr) { - lcd_put_wchar(':'); - int len = utf8_strlen(value); - const lcd_uint_t valrow = (n < len + 1) ? 2 : 1; // Value on the next row if it won't fit - lcd_put_wchar((LCD_WIDTH - 1) - (len + 1), valrow, ' '); // Right-justified, padded, leading space + lcd_put_wchar(':'); n--; + const uint8_t len = utf8_strlen(value) + 1; // Plus one for a leading space + const lcd_uint_t valrow = n < len ? 2 : 1; // Value on the next row if it won't fit + lcd_put_wchar(LCD_WIDTH - len, valrow, ' '); // Right-justified, padded, leading space lcd_put_u8str(value); } } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index d70b007c6e9e..d7701f4ae9e0 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -309,11 +309,11 @@ namespace Language_en { PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequency max"); PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min"); PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("steps/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("steps/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("steps/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Esteps/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*steps/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E steps/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* Steps/mm"); PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); PROGMEM Language_Str MSG_MOTION = _UxGT("Motion"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index 4290bcbb1256..653e6d10cece 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -37,20 +37,18 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const inStr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { uint8_t *p = (uint8_t*)pstr; int8_t n = maxlen; - for (; n > 0; n--) { + while (n > 0) { wchar_t ch; p = get_utf8_value_cb(p, read_byte_rom, &ch); if (!ch) break; if (ch == '=' || ch == '~' || ch == '*') { - // lcd_put_int(ind); n--; if (ind >= 10) n--; if (ind >= 0) { if (ch == '*') { lcd_put_wchar('E'); n--; } if (n) { lcd_put_wchar(ind + ((ch == '=') ? '0' : LCD_FIRST_TOOL)); n--; } } else { PGM_P const b = ind == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED); - lcd_put_u8str_P(b); - n -= utf8_strlen_P(b); + n -= lcd_put_u8str_max_P(b, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); } if (n) n -= lcd_put_u8str_max_P((PGM_P)p, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); continue; @@ -61,6 +59,7 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const i } lcd_put_wchar(ch); + n--; } return n; } diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 676b2d0a430b..e858b5d5375a 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -186,6 +186,7 @@ DEFINE_MENU_EDIT_ITEM(float43); // 1.234 DEFINE_MENU_EDIT_ITEM(float5); // 12345 right-justified DEFINE_MENU_EDIT_ITEM(float5_25); // 12345 right-justified (25 increment) DEFINE_MENU_EDIT_ITEM(float51); // 1234.5 right-justified +DEFINE_MENU_EDIT_ITEM(float31sign); // +12.3 DEFINE_MENU_EDIT_ITEM(float41sign); // +123.4 DEFINE_MENU_EDIT_ITEM(float51sign); // +1234.5 DEFINE_MENU_EDIT_ITEM(float52sign); // +123.45 diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 699324d2668e..55a8c3934ddf 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -296,6 +296,7 @@ DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) DEFINE_MENU_EDIT_ITEM_TYPE(float51 ,float ,ftostr51rj , 10 ); // 1234.5 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 ); // +12.3 DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 ); // +123.4 DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 ); // +1234.5 DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 ); // +123.45 diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index a252f91a33ec..5de5c09d4d6e 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -435,19 +435,20 @@ void menu_cancelobject(); END_MENU(); } - // M205 Jerk - void menu_advanced_jerk() { - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); + #if HAS_CLASSIC_JERK - #if HAS_JUNCTION_DEVIATION - #if ENABLED(LIN_ADVANCE) - EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.3f, planner.recalculate_max_e_jerk); - #else - EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.5f); + void menu_advanced_jerk() { + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + + #if HAS_JUNCTION_DEVIATION + #if ENABLED(LIN_ADVANCE) + EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.3f, planner.recalculate_max_e_jerk); + #else + EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.5f); + #endif #endif - #endif - #if HAS_CLASSIC_JERK + constexpr xyze_float_t max_jerk_edit = #ifdef MAX_JERK_EDIT_VALUES MAX_JERK_EDIT_VALUES @@ -468,10 +469,11 @@ void menu_cancelobject(); #if HAS_CLASSIC_E_JERK EDIT_ITEM_FAST(float52sign, MSG_VE_JERK, &planner.max_jerk.e, 0.1f, max_jerk_edit.e); #endif - #endif - END_MENU(); - } + END_MENU(); + } + + #endif // M851 - Z Probe Offsets #if HAS_BED_PROBE @@ -479,8 +481,8 @@ void menu_cancelobject(); START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); #if HAS_PROBE_XY_OFFSET - EDIT_ITEM(float51sign, MSG_ZPROBE_XOFFSET, &probe.offset.x, -(X_BED_SIZE), X_BED_SIZE); - EDIT_ITEM(float51sign, MSG_ZPROBE_YOFFSET, &probe.offset.y, -(Y_BED_SIZE), Y_BED_SIZE); + EDIT_ITEM(float31sign, MSG_ZPROBE_XOFFSET, &probe.offset.x, -(X_BED_SIZE), X_BED_SIZE); + EDIT_ITEM(float31sign, MSG_ZPROBE_YOFFSET, &probe.offset.y, -(Y_BED_SIZE), Y_BED_SIZE); #endif EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); END_MENU(); @@ -500,7 +502,6 @@ void menu_advanced_steps_per_mm() { EDIT_QSTEPS(C); #if ENABLED(DISTINCT_E_FACTORS) - EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(active_extruder)], 5, 9999, []{ planner.refresh_positioning(); }); LOOP_L_N(n, E_STEPPERS) EDIT_ITEM_FAST_N(float51, n, MSG_EN_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(n)], 5, 9999, []{ _planner_refresh_e_positioning(MenuItemBase::itemIndex); }); #elif E_STEPPERS @@ -535,8 +536,16 @@ void menu_advanced_settings() { // M201 - Acceleration items SUBMENU(MSG_ACCELERATION, menu_advanced_acceleration); - // M205 - Max Jerk - SUBMENU(MSG_JERK, menu_advanced_jerk); + #if HAS_CLASSIC_JERK + // M205 - Max Jerk + SUBMENU(MSG_JERK, menu_advanced_jerk); + #elif HAS_JUNCTION_DEVIATION + EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.3f + #if ENABLED(LIN_ADVANCE) + , planner.recalculate_max_e_jerk + #endif + ); + #endif // M851 - Z Probe Offsets #if HAS_BED_PROBE diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index e87158fbd08c..7845b75ea78b 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -307,6 +307,7 @@ void menu_advanced_settings(); #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0) const uint8_t m = MenuItemBase::itemIndex; START_MENU(); + STATIC_ITEM_P(ui.get_preheat_label(m), SS_CENTER|SS_INVERT); BACK_ITEM(MSG_CONFIGURATION); #if HAS_FAN editable.uint8 = uint8_t(ui.material_preset[m].fan_speed); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index ff99358a8bc7..bc1e10181603 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -114,7 +114,7 @@ static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), axis ); - MenuEditItemBase::draw_edit_screen(name, ui.manual_move.menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr43sign(pos)); + MenuEditItemBase::draw_edit_screen(name, ui.manual_move.menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr63(pos)); } } void lcd_move_x() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_X), X_AXIS); } diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index 2788ec63ac1d..709e58bdc5e2 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -31,6 +31,8 @@ char conv[8] = { 0 }; #define DIGIMOD(n, f) DIGIT((n)/(f) % 10) #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) +#define INTFLOAT(V,N) (((V) * 10 * pow(10, N) + ((V) < 0 ? -5: 5)) / 10) // pow10? +#define UINTFLOAT(V,N) INTFLOAT((V) < 0 ? -(V) : (V), N) // Convert a full-range unsigned 8bit int to a percentage const char* ui8tostr4pctrj(const uint8_t i) { @@ -166,7 +168,7 @@ const char* i16tostr4signrj(const int16_t i) { // Convert unsigned float to string with 1.23 format const char* ftostr12ns(const float &f) { - const long i = ((f < 0 ? -f : f) * 1000 + 5) / 10; + const long i = UINTFLOAT(f, 2); conv[3] = DIGIMOD(i, 100); conv[4] = '.'; conv[5] = DIGIMOD(i, 10); @@ -176,7 +178,7 @@ const char* ftostr12ns(const float &f) { // Convert unsigned float to string with 12.3 format const char* ftostr31ns(const float &f) { - const long i = ((f < 0 ? -f : f) * 100 + 5) / 10; + const long i = UINTFLOAT(f, 1); conv[3] = DIGIMOD(i, 100); conv[4] = DIGIMOD(i, 10); conv[5] = '.'; @@ -186,7 +188,7 @@ const char* ftostr31ns(const float &f) { // Convert unsigned float to string with 123.4 format const char* ftostr41ns(const float &f) { - const long i = ((f < 0 ? -f : f) * 100 + 5) / 10; + const long i = UINTFLOAT(f, 1); conv[2] = DIGIMOD(i, 1000); conv[3] = DIGIMOD(i, 100); conv[4] = DIGIMOD(i, 10); @@ -198,7 +200,7 @@ const char* ftostr41ns(const float &f) { // Convert signed float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format const char* ftostr42_52(const float &f) { if (f <= -10 || f >= 100) return ftostr52(f); // -23.45 / 123.45 - long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 2); conv[2] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 1000)); conv[3] = DIGIMOD(i, 100); conv[4] = '.'; @@ -209,7 +211,7 @@ const char* ftostr42_52(const float &f) { // Convert signed float to fixed-length string with 023.45 / -23.45 format const char* ftostr52(const float &f) { - long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 2); conv[1] = MINUSOR(i, DIGIMOD(i, 10000)); conv[2] = DIGIMOD(i, 1000); conv[3] = DIGIMOD(i, 100); @@ -222,7 +224,7 @@ const char* ftostr52(const float &f) { // Convert signed float to fixed-length string with 12.345 / _2.345 / -2.345 or -23.45 / 123.45 format const char* ftostr53_63(const float &f) { if (f <= -10 || f >= 100) return ftostr63(f); // -23.456 / 123.456 - long i = (f * 10000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 3); conv[1] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 10000)); conv[2] = DIGIMOD(i, 1000); conv[3] = '.'; @@ -234,7 +236,7 @@ const char* ftostr53_63(const float &f) { // Convert signed float to fixed-length string with 023.456 / -23.456 format const char* ftostr63(const float &f) { - long i = (f * 10000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 3); conv[0] = MINUSOR(i, DIGIMOD(i, 100000)); conv[1] = DIGIMOD(i, 10000); conv[2] = DIGIMOD(i, 1000); @@ -249,7 +251,7 @@ const char* ftostr63(const float &f) { // Convert float to rj string with 1234, _123, -123, _-12, 12.3, _1.2, or -1.2 format const char* ftostr4sign(const float &f) { - const int i = (f * 100 + (f < 0 ? -5: 5)) / 10; + const int i = INTFLOAT(f, 1); if (!WITHIN(i, -99, 999)) return i16tostr4signrj((int)f); const bool neg = i < 0; const int ii = neg ? -i : i; @@ -262,9 +264,20 @@ const char* ftostr63(const float &f) { #endif +// Convert float to fixed-length string with +12.3 / -12.3 format +const char* ftostr31sign(const float &f) { + int i = INTFLOAT(f, 1); + conv[2] = MINUSOR(i, '+'); + conv[3] = DIGIMOD(i, 100); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return &conv[2]; +} + // Convert float to fixed-length string with +123.4 / -123.4 format const char* ftostr41sign(const float &f) { - int i = (f * 100 + (f < 0 ? -5: 5)) / 10; + int i = INTFLOAT(f, 1); conv[1] = MINUSOR(i, '+'); conv[2] = DIGIMOD(i, 1000); conv[3] = DIGIMOD(i, 100); @@ -276,7 +289,7 @@ const char* ftostr41sign(const float &f) { // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format const char* ftostr43sign(const float &f, char plus/*=' '*/) { - long i = (f * 10000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 3); conv[1] = i ? MINUSOR(i, plus) : ' '; conv[2] = DIGIMOD(i, 1000); conv[3] = '.'; @@ -288,7 +301,7 @@ const char* ftostr43sign(const float &f, char plus/*=' '*/) { // Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format const char* ftostr54sign(const float &f, char plus/*=' '*/) { - long i = (f * 100000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 4); conv[0] = i ? MINUSOR(i, plus) : ' '; conv[1] = DIGIMOD(i, 10000); conv[2] = '.'; @@ -301,13 +314,13 @@ const char* ftostr54sign(const float &f, char plus/*=' '*/) { // Convert unsigned float to rj string with 12345 format const char* ftostr5rj(const float &f) { - const long i = ((f < 0 ? -f : f) * 10 + 5) / 10; + const long i = UINTFLOAT(f, 0); return ui16tostr5rj(i); } // Convert signed float to string with +1234.5 format const char* ftostr51sign(const float &f) { - long i = (f * 100 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 1); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); conv[2] = DIGIMOD(i, 1000); @@ -320,7 +333,7 @@ const char* ftostr51sign(const float &f) { // Convert signed float to string with +123.45 format const char* ftostr52sign(const float &f) { - long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 2); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); conv[2] = DIGIMOD(i, 1000); @@ -333,7 +346,7 @@ const char* ftostr52sign(const float &f) { // Convert signed float to string with +12.345 format const char* ftostr53sign(const float &f) { - long i = (f * 10000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 3); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); conv[2] = DIGIMOD(i, 1000); @@ -346,7 +359,7 @@ const char* ftostr53sign(const float &f) { // Convert unsigned float to string with ____4.5, __34.5, _234.5, 1234.5 format const char* ftostr51rj(const float &f) { - const long i = ((f < 0 ? -f : f) * 100 + 5) / 10; + const long i = UINTFLOAT(f, 1); conv[0] = ' '; conv[1] = RJDIGIT(i, 10000); conv[2] = RJDIGIT(i, 1000); @@ -359,7 +372,7 @@ const char* ftostr51rj(const float &f) { // Convert signed float to space-padded string with -_23.4_ format const char* ftostr52sp(const float &f) { - long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; + long i = INTFLOAT(f, 2); uint8_t dig; conv[0] = MINUSOR(i, ' '); conv[1] = RJDIGIT(i, 10000); diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index ab340f52cd3b..7943ba0dc3f5 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -76,6 +76,9 @@ const char* ftostr53_63(const float &x); // Convert signed float to fixed-length string with 023.456 / -23.456 format const char* ftostr63(const float &x); +// Convert float to fixed-length string with +12.3 / -12.3 format +const char* ftostr31sign(const float &x); + // Convert float to fixed-length string with +123.4 / -123.4 format const char* ftostr41sign(const float &x); diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 6c4c13f830e0..9a9a805099c9 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -148,7 +148,7 @@ typedef struct { int16_t X, Y, Z, X2, Y2, Z2, Z3, Z4; typedef struct { bool X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_stealth_enabled_t; // Limit an index to an array size -#define ALIM(I,ARR) _MIN(I, COUNT(ARR) - 1) +#define ALIM(I,ARR) _MIN(I, signed(COUNT(ARR) - 1)) // Defaults for reset / fill in on load static const uint32_t _DMA[] PROGMEM = DEFAULT_MAX_ACCELERATION; From c9718504c5f98b09c062f2b56db1ca59e92d27c9 Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 15 Jul 2020 00:02:38 +0200 Subject: [PATCH 143/483] Fix leveling "Point n of 3" message (#18639) --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 9a86118046f9..cc3007c54abb 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -685,8 +685,8 @@ G29_TYPE GcodeSuite::G29() { // Probe at 3 arbitrary points LOOP_L_N(i, 3) { - if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", int(i), "/3."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i))); + if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", int(i + 1), "/3."); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); // Retain the last probe position probePos = points[i]; From 95b76a65c3fa39c265dca000ca75ce5ad7025720 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 14 Jul 2020 17:07:27 -0700 Subject: [PATCH 144/483] Increase STM32F1 Servo Timer Interrupt Priority (#18637) --- Marlin/src/HAL/STM32F1/Servo.cpp | 1 + Marlin/src/HAL/STM32F1/timers.cpp | 16 ++++++++++++---- Marlin/src/HAL/STM32F1/timers.h | 7 +++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/Servo.cpp b/Marlin/src/HAL/STM32F1/Servo.cpp index 3812dc1ab569..bda7ea1aa702 100644 --- a/Marlin/src/HAL/STM32F1/Servo.cpp +++ b/Marlin/src/HAL/STM32F1/Servo.cpp @@ -74,6 +74,7 @@ void libServo::servoWrite(uint8_t inPin, uint16_t duty_cycle) { libServo::libServo() { servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO; + timer_set_interrupt_priority(SERVO0_TIMER_NUM, SERVO0_TIMER_IRQ_PRIO); } bool libServo::attach(const int32_t inPin, const int32_t inMinAngle, const int32_t inMaxAngle) { diff --git a/Marlin/src/HAL/STM32F1/timers.cpp b/Marlin/src/HAL/STM32F1/timers.cpp index b3a9ce4f75b8..bb466cc16fc1 100644 --- a/Marlin/src/HAL/STM32F1/timers.cpp +++ b/Marlin/src/HAL/STM32F1/timers.cpp @@ -47,7 +47,10 @@ * TODO: Calculate Timer prescale value, so we get the 32bit to adjust */ -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + + + +void timer_set_interrupt_priority(uint_fast8_t timer_num, uint_fast8_t priority) { nvic_irq_num irq_num; switch (timer_num) { case 1: irq_num = NVIC_TIMER1_CC; break; @@ -64,9 +67,14 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { * This should never happen. Add a Sanitycheck for timer number. * Should be a general timer since basic timers have no CC channels. */ - break; + return; } + nvic_irq_set_priority(irq_num, priority); +} + + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { /** * Give the Stepper ISR a higher priority (lower number) * so it automatically preempts the Temperature ISR. @@ -83,7 +91,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (STEPPER_TIMER_RATE) / frequency)); timer_no_ARR_preload_ARPE(STEP_TIMER_DEV); // Need to be sure no preload on ARR register timer_attach_interrupt(STEP_TIMER_DEV, STEP_TIMER_CHAN, stepTC_Handler); - nvic_irq_set_priority(irq_num, STEP_TIMER_IRQ_PRIO); + timer_set_interrupt_priority(STEP_TIMER_NUM, STEP_TIMER_IRQ_PRIO); timer_generate_update(STEP_TIMER_DEV); timer_resume(STEP_TIMER_DEV); break; @@ -95,7 +103,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { timer_set_reload(TEMP_TIMER_DEV, 0xFFFF); timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (F_CPU) / (TEMP_TIMER_PRESCALE) / frequency)); timer_attach_interrupt(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, tempTC_Handler); - nvic_irq_set_priority(irq_num, TEMP_TIMER_IRQ_PRIO); + timer_set_interrupt_priority(TEMP_TIMER_NUM, TEMP_TIMER_IRQ_PRIO); timer_generate_update(TEMP_TIMER_DEV); timer_resume(TEMP_TIMER_DEV); break; diff --git a/Marlin/src/HAL/STM32F1/timers.h b/Marlin/src/HAL/STM32F1/timers.h index 57fd0e3c4c4b..658a4369884d 100644 --- a/Marlin/src/HAL/STM32F1/timers.h +++ b/Marlin/src/HAL/STM32F1/timers.h @@ -91,8 +91,9 @@ typedef uint16_t hal_timer_t; #define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH #endif -#define STEP_TIMER_IRQ_PRIO 1 -#define TEMP_TIMER_IRQ_PRIO 2 +#define STEP_TIMER_IRQ_PRIO 2 +#define TEMP_TIMER_IRQ_PRIO 3 +#define SERVO0_TIMER_IRQ_PRIO 1 #define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz #define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency @@ -193,4 +194,6 @@ FORCE_INLINE static void timer_no_ARR_preload_ARPE(timer_dev *dev) { bb_peri_set_bit(&(dev->regs).gen->CR1, TIMER_CR1_ARPE_BIT, 0); } +void timer_set_interrupt_priority(uint_fast8_t timer_num, uint_fast8_t priority); + #define TIMER_OC_NO_PRELOAD 0 // Need to disable preload also on compare registers. From 0451e43adb2bdd53fd7243f98a41afb413499817 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 15 Jul 2020 00:14:27 +0000 Subject: [PATCH 145/483] [cron] Bump distribution date (2020-07-15) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 55e74947617d..f03b585d96bc 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-14" + #define STRING_DISTRIBUTION_DATE "2020-07-15" #endif /** From 3513ea7ae11efa1c3d54392a4f8a398400e3ca19 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 14 Jul 2020 17:59:31 -0500 Subject: [PATCH 146/483] Specify ststm32 @ 6.1.x --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index eac46b660fda..7cc3adaa90a9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -326,7 +326,7 @@ board = nxp_lpc1769 # HAL/STM32 Base Environment values # [common_stm32] -platform = ststm32@<6.2.0 +platform = ststm32@~6.1.0 platform_packages = framework-arduinoststm32@>=4.10700,<4.10800 lib_deps = ${common.lib_deps} lib_ignore = SoftwareSerial From b40440cf3846bca4a0a10bb43d6d60f725a26cfe Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 14 Jul 2020 17:58:37 -0500 Subject: [PATCH 147/483] Tool-change debug option --- Marlin/src/core/debug_out.h | 3 + Marlin/src/gcode/control/M605.cpp | 4 +- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/motion.h | 2 +- Marlin/src/module/tool_change.cpp | 295 ++++++++++++++---------------- 5 files changed, 145 insertions(+), 161 deletions(-) diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index 73c1ae4b90c2..6a3b34f7ece4 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -52,6 +52,7 @@ #undef DEBUG_POS #undef DEBUG_XYZ #undef DEBUG_DELAY +#undef DEBUG_SYNCHRONIZE #if DEBUG_OUT @@ -83,6 +84,7 @@ #define DEBUG_POS SERIAL_POS #define DEBUG_XYZ SERIAL_XYZ #define DEBUG_DELAY(ms) serial_delay(ms) + #define DEBUG_SYNCHRONIZE() planner.synchronize() #else @@ -112,6 +114,7 @@ #define DEBUG_POS(...) NOOP #define DEBUG_XYZ(...) NOOP #define DEBUG_DELAY(...) NOOP + #define DEBUG_SYNCHRONIZE() NOOP #endif diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index ab5efbbb48bd..7740c013f557 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -92,8 +92,10 @@ case DXC_AUTO_PARK_MODE: break; case DXC_DUPLICATION_MODE: - if (parser.seen('X')) duplicate_extruder_x_offset = _MAX(parser.value_linear_units(), X2_MIN_POS - x_home_pos(0)); + // Set the X offset, but no less than the safety gap + if (parser.seen('X')) duplicate_extruder_x_offset = _MAX(parser.value_linear_units(), (X2_MIN_POS) - (X1_MIN_POS)); if (parser.seen('R')) duplicate_extruder_temp_offset = parser.value_celsius_diff(); + // Always switch back to tool 0 if (active_extruder != 0) tool_change(0); break; default: diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 539ceac78784..346042437d44 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -946,7 +946,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { millis_t delayed_move_time = 0; // used in mode 1 int16_t duplicate_extruder_temp_offset = 0; // used in mode 2 - float x_home_pos(const int extruder) { + float x_home_pos(const uint8_t extruder) { if (extruder == 0) return base_home_pos(X_AXIS); else diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index f51b205b3935..6a984e5ebc53 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -378,7 +378,7 @@ void homeaxis(const AxisEnum axis); FORCE_INLINE bool dxc_is_duplicating() { return dual_x_carriage_mode >= DXC_DUPLICATION_MODE; } - float x_home_pos(const int extruder); + float x_home_pos(const uint8_t extruder); FORCE_INLINE int x_home_dir(const uint8_t extruder) { return extruder ? X2_HOME_DIR : X_HOME_DIR; } diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 3a283f8357da..b5c208495097 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -31,7 +31,9 @@ #include "../MarlinCore.h" -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +//#define DEBUG_TOOL_CHANGE + +#define DEBUG_OUT ENABLED(DEBUG_TOOL_CHANGE) #include "../core/debug_out.h" #if EXTRUDERS > 1 @@ -190,10 +192,8 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("(1) Move extruder ", int(new_tool)); - DEBUG_POS(" to new extruder ParkPos", current_position); - } + DEBUG_ECHOPAIR("(1) Move extruder ", int(new_tool)); + DEBUG_POS(" to new extruder ParkPos", current_position); planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); planner.synchronize(); @@ -202,10 +202,8 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = grabpos + offsetcompensation; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("(2) Couple extruder ", int(new_tool)); - DEBUG_POS(" to new extruder GrabPos", current_position); - } + DEBUG_ECHOPAIR("(2) Couple extruder ", int(new_tool)); + DEBUG_POS(" to new extruder GrabPos", current_position); planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); planner.synchronize(); @@ -216,10 +214,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 3 current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("(3) Move extruder ", int(new_tool)); - DEBUG_POS(" back to new extruder ParkPos", current_position); - } + + DEBUG_ECHOPAIR("(3) Move extruder ", int(new_tool)); + DEBUG_POS(" back to new extruder ParkPos", current_position); planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); planner.synchronize(); @@ -227,10 +224,9 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 4 current_position.x = mpe_settings.parking_xpos[active_extruder] + (active_extruder == 0 ? MPE_TRAVEL_DISTANCE : -MPE_TRAVEL_DISTANCE) + offsetcompensation; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("(4) Move extruder ", int(new_tool)); - DEBUG_POS(" close to old extruder ParkPos", current_position); - } + + DEBUG_ECHOPAIR("(4) Move extruder ", int(new_tool)); + DEBUG_POS(" close to old extruder ParkPos", current_position); planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); planner.synchronize(); @@ -239,10 +235,8 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = mpe_settings.parking_xpos[active_extruder] + offsetcompensation; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("(5) Park extruder ", int(new_tool)); - DEBUG_POS(" at old extruder ParkPos", current_position); - } + DEBUG_ECHOPAIR("(5) Park extruder ", int(new_tool)); + DEBUG_POS(" at old extruder ParkPos", current_position); planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); planner.synchronize(); @@ -251,15 +245,13 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a current_position.x = oldx; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("(6) Move extruder ", int(new_tool)); - DEBUG_POS(" to starting position", current_position); - } + DEBUG_ECHOPAIR("(6) Move extruder ", int(new_tool)); + DEBUG_POS(" to starting position", current_position); planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); planner.synchronize(); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Autopark done."); + DEBUG_ECHOLNPGM("Autopark done."); } #elif ENABLED(PARKING_EXTRUDER) @@ -308,34 +300,35 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // STEP 1 - if (DEBUGGING(LEVELING)) DEBUG_POS("Start PE Tool-Change", current_position); + DEBUG_POS("Start PE Tool-Change", current_position); current_position.x = parkingposx[active_extruder] + x_offset; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder)); - DEBUG_POS("Moving ParkPos", current_position); - } + + DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder)); + DEBUG_POS("Moving ParkPos", current_position); + fast_line_to_current(X_AXIS); // STEP 2 planner.synchronize(); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(2) Disengage magnet"); + DEBUG_ECHOLNPGM("(2) Disengage magnet"); pe_deactivate_solenoid(active_extruder); // STEP 3 current_position.x += active_extruder ? -10 : 10; // move 10mm away from parked extruder - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPGM("(3) Move near new extruder"); - DEBUG_POS("Move away from parked extruder", current_position); - } + + DEBUG_ECHOLNPGM("(3) Move near new extruder"); + DEBUG_POS("Move away from parked extruder", current_position); + fast_line_to_current(X_AXIS); // STEP 4 planner.synchronize(); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Engage magnetic field"); + DEBUG_ECHOLNPGM("(4) Engage magnetic field"); + // Just save power for inverted magnets TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid(active_extruder)); pe_activate_solenoid(new_tool); @@ -346,23 +339,23 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a fast_line_to_current(X_AXIS); current_position.x = grabpos; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("(5) Unpark extruder", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("(5) Unpark extruder", current_position); + slow_line_to_current(X_AXIS); // STEP 6 current_position.x = midpos - TERN0(HAS_HOTEND_OFFSET, hotend_offset[new_tool].x); - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("(6) Move midway between hotends", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("(6) Move midway between hotends", current_position); + fast_line_to_current(X_AXIS); planner.synchronize(); // Always sync the final move - if (DEBUGGING(LEVELING)) DEBUG_POS("PE Tool-Change done.", current_position); + DEBUG_POS("PE Tool-Change done.", current_position); } else { // nomove == true // Only engage magnetic field for new extruder @@ -399,31 +392,31 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // 1. Move to switch position of current toolhead - if (DEBUGGING(LEVELING)) DEBUG_POS("Start ST Tool-Change", current_position); + DEBUG_POS("Start ST Tool-Change", current_position); current_position.x = placexpos; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); - DEBUG_POS("Move X SwitchPos", current_position); - } + + DEBUG_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); + DEBUG_POS("Move X SwitchPos", current_position); + fast_line_to_current(X_AXIS); current_position.y = SWITCHING_TOOLHEAD_Y_POS - (SWITCHING_TOOLHEAD_Y_SECURITY); - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("Move Y SwitchPos + Security", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move Y SwitchPos + Security", current_position); + fast_line_to_current(Y_AXIS); // 2. Unlock tool and drop it in the dock planner.synchronize(); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(2) Unlock and Place Toolhead"); + DEBUG_ECHOLNPGM("(2) Unlock and Place Toolhead"); swt_lock(false); safe_delay(500); current_position.y = SWITCHING_TOOLHEAD_Y_POS; - if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos", current_position); + DEBUG_POS("Move Y SwitchPos", current_position); slow_line_to_current(Y_AXIS); // Wait for move to complete, then another 0.2s @@ -431,34 +424,34 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a safe_delay(200); current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; - if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); + DEBUG_POS("Move back Y clear", current_position); fast_line_to_current(Y_AXIS); // move away from docked toolhead // 3. Move to the new toolhead current_position.x = grabxpos; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); - DEBUG_POS("Move to new toolhead X", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); + DEBUG_POS("Move to new toolhead X", current_position); + fast_line_to_current(X_AXIS); current_position.y = SWITCHING_TOOLHEAD_Y_POS - (SWITCHING_TOOLHEAD_Y_SECURITY); - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("Move Y SwitchPos + Security", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move Y SwitchPos + Security", current_position); + fast_line_to_current(Y_AXIS); // 4. Grab and lock the new toolhead current_position.y = SWITCHING_TOOLHEAD_Y_POS; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_ECHOLNPGM("(4) Grab and lock new toolhead"); - DEBUG_POS("Move Y SwitchPos", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(4) Grab and lock new toolhead"); + DEBUG_POS("Move Y SwitchPos", current_position); + slow_line_to_current(Y_AXIS); // Wait for move to finish, pause 0.2s, move servo, pause 0.5s @@ -468,11 +461,11 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a safe_delay(500); current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; - if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); + DEBUG_POS("Move back Y clear", current_position); fast_line_to_current(Y_AXIS); // Move away from docked toolhead planner.synchronize(); // Always sync the final move - if (DEBUGGING(LEVELING)) DEBUG_POS("ST Tool-Change done.", current_position); + DEBUG_POS("ST Tool-Change done.", current_position); } #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) @@ -495,83 +488,77 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a * 4. Grab the new toolhead and move to security position */ - if (DEBUGGING(LEVELING)) DEBUG_POS("Start MST Tool-Change", current_position); + DEBUG_POS("Start MST Tool-Change", current_position); // 1. Move to switch position current toolhead current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR; - if (DEBUGGING(LEVELING)) { - SERIAL_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); - DEBUG_POS("Move Y SwitchPos + Security", current_position); - } + + SERIAL_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); + DEBUG_POS("Move Y SwitchPos + Security", current_position); + fast_line_to_current(Y_AXIS); current_position.x = placexclear; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("Move X SwitchPos + Security", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move X SwitchPos + Security", current_position); + fast_line_to_current(X_AXIS); current_position.y = SWITCHING_TOOLHEAD_Y_POS; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("Move Y SwitchPos", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move Y SwitchPos", current_position); + fast_line_to_current(Y_AXIS); current_position.x = placexpos; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("Move X SwitchPos", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move X SwitchPos", current_position); + line_to_current_position(planner.settings.max_feedrate_mm_s[X_AXIS] * 0.25f); // 2. Release and place toolhead in the dock - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_ECHOLNPGM("(2) Release and Place Toolhead"); - } + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(2) Release and Place Toolhead"); current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; - if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Release", current_position); + DEBUG_POS("Move Y SwitchPos + Release", current_position); line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS] * 0.1f); current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_SECURITY; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("Move Y SwitchPos + Security", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move Y SwitchPos + Security", current_position); + line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS]); // 3. Move to new toolhead position - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); - } + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); current_position.x = grabxpos; - if (DEBUGGING(LEVELING)) DEBUG_POS("Move to new toolhead X", current_position); + DEBUG_POS("Move to new toolhead X", current_position); fast_line_to_current(X_AXIS); // 4. Grab the new toolhead and move to security position - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_ECHOLNPGM("(4) Grab new toolhead, move to security position"); - } + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(4) Grab new toolhead, move to security position"); current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; - if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Release", current_position); + DEBUG_POS("Move Y SwitchPos + Release", current_position); line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS]); current_position.y = SWITCHING_TOOLHEAD_Y_POS; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_POS("Move Y SwitchPos", current_position); - } + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move Y SwitchPos", current_position); + _line_to_current(Y_AXIS, 0.2f); #if ENABLED(PRIME_BEFORE_REMOVE) && (SWITCHING_TOOLHEAD_PRIME_MM || SWITCHING_TOOLHEAD_RETRACT_MM) @@ -589,17 +576,17 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #endif current_position.x = grabxclear; - if (DEBUGGING(LEVELING)) DEBUG_POS("Move to new toolhead X + Security", current_position); + DEBUG_POS("Move to new toolhead X + Security", current_position); _line_to_current(X_AXIS, 0.1f); planner.synchronize(); safe_delay(100); // Give switch time to settle current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; - if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); + DEBUG_POS("Move back Y clear", current_position); fast_line_to_current(Y_AXIS); // move away from docked toolhead planner.synchronize(); // Always sync last tool-change move - if (DEBUGGING(LEVELING)) DEBUG_POS("MST Tool-Change done.", current_position); + DEBUG_POS("MST Tool-Change done.", current_position); } #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) @@ -628,32 +615,29 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a * 9. Apply Z hotend offset to current position */ - if (DEBUGGING(LEVELING)) DEBUG_POS("Start EMST Tool-Change", current_position); + DEBUG_POS("Start EMST Tool-Change", current_position); // 1. Raise Z-Axis to give enough clearance current_position.z += SWITCHING_TOOLHEAD_Z_HOP; - if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis ", current_position); + DEBUG_POS("(1) Raise Z-Axis ", current_position); fast_line_to_current(Z_AXIS); // 2. Move to position near active extruder parking - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - SERIAL_ECHOLNPAIR("(2) Move near active extruder parking", active_extruder); - DEBUG_POS("Moving ParkPos", current_position); - } + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPAIR("(2) Move near active extruder parking", active_extruder); + DEBUG_POS("Moving ParkPos", current_position); + current_position.set(hoffs.x + placexpos, hoffs.y + SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR); fast_line_to_current(X_AXIS); // 3. Move gently to park position of active extruder - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - SERIAL_ECHOLNPAIR("(3) Move gently to park position of active extruder", active_extruder); - DEBUG_POS("Moving ParkPos", current_position); - } + DEBUG_SYNCHRONIZE(); + SERIAL_ECHOLNPAIR("(3) Move gently to park position of active extruder", active_extruder); + DEBUG_POS("Moving ParkPos", current_position); current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; slow_line_to_current(Y_AXIS); @@ -661,15 +645,13 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // 4. Disengage magnetic field, wait for delay planner.synchronize(); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(4) Disengage magnet"); + DEBUG_ECHOLNPGM("(4) Disengage magnet"); est_deactivate_solenoid(); // 5. Leave extruder and move to position near new extruder parking - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPGM("(5) Move near new extruder parking"); - DEBUG_POS("Moving ParkPos", current_position); - } + DEBUG_ECHOLNPGM("(5) Move near new extruder parking"); + DEBUG_POS("Moving ParkPos", current_position); current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; slow_line_to_current(Y_AXIS); @@ -688,23 +670,23 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // 7. Engage magnetic field for new extruder parking - planner.synchronize(); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(7) Engage magnetic field"); + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(7) Engage magnetic field"); est_activate_solenoid(); // 8. Unpark extruder current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("(8) Unpark extruder"); + DEBUG_ECHOLNPGM("(8) Unpark extruder"); slow_line_to_current(X_AXIS); planner.synchronize(); // Always sync the final move // 9. Apply Z hotend offset to current position - if (DEBUGGING(LEVELING)) DEBUG_POS("(9) Applying Z-offset", current_position); + DEBUG_POS("(9) Applying Z-offset", current_position); current_position.z += hoffs.z - hotend_offset[new_tool].z; - if (DEBUGGING(LEVELING)) DEBUG_POS("EMST Tool-Change done.", current_position); + DEBUG_POS("EMST Tool-Change done.", current_position); } #endif // ELECTROMAGNETIC_SWITCHING_TOOLHEAD @@ -720,14 +702,13 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #if ENABLED(DUAL_X_CARRIAGE) inline void dualx_tool_change(const uint8_t new_tool, bool &no_move) { - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPGM("Dual X Carriage Mode "); - switch (dual_x_carriage_mode) { - case DXC_FULL_CONTROL_MODE: DEBUG_ECHOLNPGM("FULL_CONTROL"); break; - case DXC_AUTO_PARK_MODE: DEBUG_ECHOLNPGM("AUTO_PARK"); break; - case DXC_DUPLICATION_MODE: DEBUG_ECHOLNPGM("DUPLICATION"); break; - case DXC_MIRRORED_MODE: DEBUG_ECHOLNPGM("MIRRORED"); break; - } + + DEBUG_ECHOPGM("Dual X Carriage Mode "); + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: DEBUG_ECHOLNPGM("FULL_CONTROL"); break; + case DXC_AUTO_PARK_MODE: DEBUG_ECHOLNPGM("AUTO_PARK"); break; + case DXC_DUPLICATION_MODE: DEBUG_ECHOLNPGM("DUPLICATION"); break; + case DXC_MIRRORED_MODE: DEBUG_ECHOLNPGM("MIRRORED"); break; } const float xhome = x_home_pos(active_extruder); @@ -736,7 +717,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a && (delayed_move_time || current_position.x != xhome) ) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("MoveX to ", xhome); + DEBUG_ECHOLNPAIR("MoveX to ", xhome); // Park old head current_position.x = xhome; @@ -750,7 +731,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a // This function resets the max/min values - the current position may be overwritten below. set_axis_is_at_home(X_AXIS); - if (DEBUGGING(LEVELING)) DEBUG_POS("New Extruder", current_position); + DEBUG_POS("New Extruder", current_position); switch (dual_x_carriage_mode) { case DXC_FULL_CONTROL_MODE: @@ -769,10 +750,8 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a break; } - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR("Active extruder parked: ", active_extruder_parked ? "yes" : "no"); - DEBUG_POS("New extruder (parked)", current_position); - } + DEBUG_ECHOLNPAIR("Active extruder parked: ", active_extruder_parked ? "yes" : "no"); + DEBUG_POS("New extruder (parked)", current_position); } #endif // DUAL_X_CARRIAGE @@ -905,7 +884,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (!no_move && homing_needed()) { no_move = true; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("No move (not homed)"); + DEBUG_ECHOLNPGM("No move (not homed)"); } TERN_(HAS_LCD_MENU, if (!no_move) ui.return_to_status()); @@ -1058,7 +1037,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (DISABLED(DUAL_X_CARRIAGE)) active_extruder = new_tool; // The newly-selected extruder XYZ is actually at... - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Offset Tool XYZ by { ", diff.x, ", ", diff.y, ", ", diff.z, " }"); + DEBUG_ECHOLNPAIR("Offset Tool XYZ by { ", diff.x, ", ", diff.y, ", ", diff.z, " }"); current_position += diff; // Tell the planner the new "current position" @@ -1139,7 +1118,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (can_move_away) { #if ENABLED(TOOLCHANGE_NO_RETURN) // Just move back down - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Move back Z only"); + DEBUG_ECHOLNPGM("Move back Z only"); #if ENABLED(TOOLCHANGE_PARK) if (toolchange_settings.enable_park) @@ -1148,7 +1127,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #else // Move back to the original (or adjusted) position - if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination); + DEBUG_POS("Move back", destination); #if ENABLED(TOOLCHANGE_PARK) if (toolchange_settings.enable_park) do_blocking_move_to_xy_z(destination, destination.z, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); @@ -1159,7 +1138,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #endif } - else if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Move back skipped"); + else DEBUG_ECHOLNPGM("Move back skipped"); #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) if (should_swap && !too_cold) { From 2d33a9fd7c5485acbcf69c506470a67c870ef113 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 14 Jul 2020 19:30:48 -0500 Subject: [PATCH 148/483] Add REPORT_FAN_CHANGE as an option --- Marlin/Configuration_adv.h | 2 ++ Marlin/src/lcd/menu/menu_temperature.cpp | 6 +++--- Marlin/src/module/temperature.cpp | 21 ++++++++++++--------- Marlin/src/module/temperature.h | 21 +++++++-------------- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b4a37b7002a0..adfdfa0f998c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3104,6 +3104,8 @@ //#define M114_REALTIME // Real current position based on forward kinematics //#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed. +//#define REPORT_FAN_CHANGE // Report the new fan speed when changed by M106 (and others) + /** * Set the number of proportional font spaces required to fill up a typical character space. * This can help to better align the output of commands like `G29 O` Mesh Output. diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 46f48e22fa52..38908b8d8c14 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -161,15 +161,15 @@ void menu_temperature() { // Nozzle [1-5]: // #if HOTENDS == 1 - EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT, []{ thermalManager.start_watching_hotend(0); }); + EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - (HOTEND_OVERSHOOT), []{ thermalManager.start_watching_hotend(0); }); #elif HAS_MULTI_HOTEND HOTEND_LOOP() - EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.heater_maxtemp[e] - (HOTEND_OVERSHOOT), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - HOTEND_OVERSHOOT); + EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - (HOTEND_OVERSHOOT)); #endif // diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 48cf38867093..7c10beceeb8d 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -216,18 +216,21 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, if (target >= FAN_COUNT) return; fan_speed[target] = speed; - report_fan_speed(target); - } - /** - * Report print fan speed for a target extruder - */ - void Temperature::report_fan_speed(const uint8_t target) { - if (target >= FAN_COUNT) return; - PORT_REDIRECT(SERIAL_BOTH); - SERIAL_ECHOLNPAIR("M106 P", target, " S", fan_speed[target]); + TERN_(REPORT_FAN_CHANGE, report_fan_speed(target)); } + #if ENABLED(REPORT_FAN_CHANGE) + /** + * Report print fan speed for a target extruder + */ + void Temperature::report_fan_speed(const uint8_t target) { + if (target >= FAN_COUNT) return; + PORT_REDIRECT(SERIAL_BOTH); + SERIAL_ECHOLNPAIR("M106 P", target, " S", fan_speed[target]); + } + #endif + #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) void Temperature::set_fans_paused(const bool p) { diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 2f8ddbf7be22..cfd9f957c1c4 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -474,7 +474,10 @@ class Temperature { #define FANS_LOOP(I) LOOP_L_N(I, FAN_COUNT) static void set_fan_speed(const uint8_t target, const uint16_t speed); - static void report_fan_speed(const uint8_t target); + + #if ENABLED(REPORT_FAN_CHANGE) + static void report_fan_speed(const uint8_t target); + #endif #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) static bool fans_paused; @@ -487,13 +490,7 @@ class Temperature { static inline uint8_t scaledFanSpeed(const uint8_t target, const uint8_t fs) { UNUSED(target); // Potentially unused! - return (fs * uint16_t( - #if ENABLED(ADAPTIVE_FAN_SLOWING) - fan_speed_scaler[target] - #else - 128 - #endif - )) >> 7; + return (fs * uint16_t(TERN(ADAPTIVE_FAN_SLOWING, fan_speed_scaler[target], 128))) >> 7; } static inline uint8_t scaledFanSpeed(const uint8_t target) { @@ -629,7 +626,7 @@ class Temperature { static void setTargetBed(const int16_t celsius) { TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); temp_bed.target = - #ifdef BED_MAXTEMP + #ifdef BED_MAX_TARGET _MIN(celsius, BED_MAX_TARGET) #else celsius @@ -790,11 +787,7 @@ class Temperature { #define HAS_MAX6675 EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) #if HAS_MAX6675 - #if BOTH(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) - #define COUNT_6675 2 - #else - #define COUNT_6675 1 - #endif + #define COUNT_6675 1 + BOTH(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) #if COUNT_6675 > 1 #define READ_MAX6675(N) read_max6675(N) #else From e78f19bc87a9180148866df1b93beeab083eed17 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 14 Jul 2020 20:01:29 -0500 Subject: [PATCH 149/483] Clean up DWIN code --- Marlin/src/inc/Conditionals_post.h | 5 +- Marlin/src/lcd/dwin/dwin.cpp | 2036 +++++++++++++------------ Marlin/src/lcd/dwin/dwin.h | 156 +- Marlin/src/lcd/dwin/eeprom_BL24CXX.h | 38 +- Marlin/src/lcd/menu/menu_advanced.cpp | 5 +- 5 files changed, 1131 insertions(+), 1109 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 6d9998b69290..eb0155949ec7 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1776,7 +1776,10 @@ // Shorthand for common combinations #if HAS_TEMP_BED && HAS_HEATER_BED #define HAS_HEATED_BED 1 - #define BED_MAX_TARGET (BED_MAXTEMP - 10) + #ifndef BED_OVERSHOOT + #define BED_OVERSHOOT 10 + #endif + #define BED_MAX_TARGET (BED_MAXTEMP - (BED_OVERSHOOT)) #endif #if HAS_HEATED_BED || HAS_TEMP_CHAMBER #define BED_OR_CHAMBER 1 diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index e2312ff8948e..eb804b5e0407 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -63,6 +63,16 @@ #include "../../libs/buzzer.h" +#ifndef MACHINE_SIZE + #define MACHINE_SIZE "220x220x250" +#endif +#ifndef CORP_WEBSITE_C + #define CORP_WEBSITE_C "www.cxsw3d.com" +#endif +#ifndef CORP_WEBSITE_E + #define CORP_WEBSITE_E "www.creality.com" +#endif + #define PAUSE_HEAT true #define USE_STRING_HEADINGS @@ -71,22 +81,57 @@ #define STAT_FONT font10x20 #define HEADER_FONT font10x20 -constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other-than-Back - TITLE_HEIGHT = 30, // Title bar height - MLINE = 53, // Menu line height - LBLX = 60, // Menu item label X +#define MENU_CHAR_LIMIT 24 + +// Fan speed limit +#define FANON 255 +#define FANOFF 0 + +// Print speed limit +#define MAX_PRINT_SPEED 999 +#define MIN_PRINT_SPEED 10 + +// Temp limits +#if HAS_HOTEND + #define MAX_E_TEMP (HEATER_0_MAXTEMP - (HOTEND_OVERSHOOT)) + #define MIN_E_TEMP HEATER_0_MINTEMP +#endif + +#if HAS_HEATED_BED + #define MIN_BED_TEMP BED_MINTEMP +#endif + +// Feedspeed limit (max feedspeed = DEFAULT_MAX_FEEDRATE * 2) +#define MIN_MAXFEEDSPEED 1 +#define MIN_MAXACCELERATION 1 +#define MIN_MAXCORNER 0.1 +#define MIN_STEP 1 + +#define FEEDRATE_E (60) + +// Mininum unit (0.1) : multiple (10) +#define MINUNITMULT 10 + +#define ENCODER_WAIT 20 +#define DWIN_SCROLL_UPDATE_INTERVAL 2000 +#define DWIN_REMAIN_TIME_UPDATE_INTERVAL 20000 + +constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other-than-Back + TITLE_HEIGHT = 30, // Title bar height + MLINE = 53, // Menu line height + LBLX = 60, // Menu item label X MENU_CHR_W = 8, STAT_CHR_W = 10; -#define MBASE(L) (49+(L)*MLINE) +#define MBASE(L) (49 + (L)*MLINE) #define BABY_Z_VAR TERN(HAS_LEVELING, probe.offset.z, zprobe_zoffset) /* Value Init */ HMI_value_t HMI_ValueStruct; -HMI_Flag HMI_flag{0}; +HMI_Flag HMI_flag{0}; -millis_t Encoder_ms = 0; -millis_t Wait_ms = 0; +millis_t Encoder_ms = 0; +millis_t Wait_ms = 0; millis_t dwin_heat_time = 0; int checkkey = 0, last_checkkey = 0; @@ -101,22 +146,22 @@ typedef struct { } select_t; select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0} - , select_control{0}, select_axis{0}, select_temp{0}, select_motion{0}, select_tune{0} - , select_PLA{0}, select_ABS{0} - , select_speed{0} - , select_acc{0} - , select_corner{0} - , select_step{0} - //, select_leveling{0} - ; - -uint8_t index_file = MROWS, - index_prepare = MROWS, - index_control = MROWS, + , select_control{0}, select_axis{0}, select_temp{0}, select_motion{0}, select_tune{0} + , select_PLA{0}, select_ABS{0} + , select_speed{0} + , select_acc{0} + , select_corner{0} + , select_step{0} + // , select_leveling{0} + ; + +uint8_t index_file = MROWS, + index_prepare = MROWS, + index_control = MROWS, index_leveling = MROWS, - index_tune = 5; + index_tune = 5; -//char filebuf[50]; +// char filebuf[50]; uint8_t countbuf = 0; @@ -133,17 +178,12 @@ float last_temp_hotend_target = 0, last_temp_bed_target = 0; float last_temp_hotend_current = 0, last_temp_bed_current = 0; uint8_t last_fan_speed = 0; uint16_t last_speed = 0; - float last_E_scale = 0; - bool DWIN_lcd_sd_status = 0; - bool pause_action_flag = 0; - int temphot = 0, tempbed = 0; - -float zprobe_zoffset = 0.00; -float last_zoffset = 0.00, last_probe_zoffset = 0.00; +float zprobe_zoffset = 0; +float last_zoffset = 0, last_probe_zoffset = 0; #define FONT_EEPROM_OFFSET 0 @@ -168,165 +208,165 @@ void set_chinese_to_eeprom(void) { void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { if (value < 0) { - DWIN_Draw_String(false,true,size,White,bColor, x-6, y, (char*)"-"); - DWIN_Draw_FloatValue(true,true,0,size,White,bColor, iNum, fNum, x, y, -value); + DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, (char*)"-"); + DWIN_Draw_FloatValue(true, true, 0, size, White, bColor, iNum, fNum, x, y, -value); } else { - DWIN_Draw_String(false,true,size,White,bColor, x-6, y, (char*)" "); - DWIN_Draw_FloatValue(true,true,0,size,White,bColor, iNum, fNum, x, y, value); + DWIN_Draw_String(false, true, size, White, bColor, x - 6, y, (char*)" "); + DWIN_Draw_FloatValue(true, true, 0, size, White, bColor, iNum, fNum, x, y, value); } } void ICON_Print() { if (select_page.now == 0) { - DWIN_ICON_Show(ICON,ICON_Print_1, 17, 130); + DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 1, 447, 271-243, 479-19, 58, 201); + DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 58, 201); else - DWIN_Frame_AreaCopy(1, 1, 451, 271-240, 479-16, 72-15, 201); + DWIN_Frame_AreaCopy(1, 1, 451, 271 - 240, 479 - 16, 72 - 15, 201); } else { - DWIN_ICON_Show(ICON,ICON_Print_0, 17, 130); + DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 1, 405, 271-243, 420, 58, 201); + DWIN_Frame_AreaCopy(1, 1, 405, 271 - 243, 420, 58, 201); else - DWIN_Frame_AreaCopy(1, 1, 423, 271-240, 423+12, 72-15, 201); + DWIN_Frame_AreaCopy(1, 1, 423, 271 - 240, 423 + 12, 72 - 15, 201); } } void ICON_Prepare() { if (select_page.now == 1) { - DWIN_ICON_Show(ICON,ICON_Prepare_1, 145, 130); + DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 31, 447, 271-213, 479-19, 186, 201); + DWIN_Frame_AreaCopy(1, 31, 447, 271 - 213, 479 - 19, 186, 201); else - DWIN_Frame_AreaCopy(1, 33, 451, 271-189, 479-13, 200-25, 201); + DWIN_Frame_AreaCopy(1, 33, 451, 271 - 189, 479 - 13, 200 - 25, 201); } else { - DWIN_ICON_Show(ICON,ICON_Prepare_0, 145, 130); + DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 31, 405, 271-213, 420, 186, 201); + DWIN_Frame_AreaCopy(1, 31, 405, 271 - 213, 420, 186, 201); else - DWIN_Frame_AreaCopy(1, 33, 423, 271-189, 423+15, 200-25, 201); + DWIN_Frame_AreaCopy(1, 33, 423, 271 - 189, 423 + 15, 200 - 25, 201); } } void ICON_Control() { if (select_page.now == 2) { - DWIN_ICON_Show(ICON,ICON_Control_1, 17, 246); + DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 61, 447, 271-183, 479-19, 58, 318); + DWIN_Frame_AreaCopy(1, 61, 447, 271 - 183, 479 - 19, 58, 318); else - DWIN_Frame_AreaCopy(1, 85, 451, 271-139, 479-16, 72-24, 318); + DWIN_Frame_AreaCopy(1, 85, 451, 271 - 139, 479 - 16, 72 - 24, 318); } else { - DWIN_ICON_Show(ICON,ICON_Control_0, 17, 246); + DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 61, 405, 271-183, 420, 58, 318); + DWIN_Frame_AreaCopy(1, 61, 405, 271 - 183, 420, 58, 318); else - DWIN_Frame_AreaCopy(1, 85, 423, 271-139, 479-45, 72-24, 318); + DWIN_Frame_AreaCopy(1, 85, 423, 271 - 139, 479 - 45, 72 - 24, 318); } } void ICON_StartInfo(bool show) { if (show) { - DWIN_ICON_Show(ICON,ICON_Info_1, 145, 246); + DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 91, 447, 271-153, 479-19, 186, 318); + DWIN_Frame_AreaCopy(1, 91, 447, 271 - 153, 479 - 19, 186, 318); else - DWIN_Frame_AreaCopy(1, 132, 451, 159, 479-13, 186, 318); + DWIN_Frame_AreaCopy(1, 132, 451, 159, 479 - 13, 186, 318); } else { - DWIN_ICON_Show(ICON,ICON_Info_0, 145, 246); + DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 91, 405, 271-153, 420, 186, 318); + DWIN_Frame_AreaCopy(1, 91, 405, 271 - 153, 420, 186, 318); else - DWIN_Frame_AreaCopy(1, 132, 423, 159, 423+12, 186, 318); + DWIN_Frame_AreaCopy(1, 132, 423, 159, 423 + 12, 186, 318); } } void ICON_Leveling(bool show) { if (show) { - DWIN_ICON_Show(ICON,ICON_Leveling_1, 145, 246); + DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 211, 447, 238, 479-19, 186, 318); + DWIN_Frame_AreaCopy(1, 211, 447, 238, 479 - 19, 186, 318); else - DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 200-18, 318); + DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 200 - 18, 318); } else { - DWIN_ICON_Show(ICON,ICON_Leveling_0, 145, 246); + DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246); if (HMI_flag.language_flag) DWIN_Frame_AreaCopy(1, 211, 405, 238, 420, 186, 318); else - DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 200-18, 318); + DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 200 - 18, 318); } } void ICON_Tune() { if (select_print.now == 0) { - DWIN_ICON_Show(ICON,ICON_Setup_1, 8, 252); + DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 121, 447, 271-123, 479-21, 34, 325); + DWIN_Frame_AreaCopy(1, 121, 447, 271 - 123, 479 - 21, 34, 325); else - DWIN_Frame_AreaCopy(1, 1, 465, 271-237, 479-2, 48-17, 325); + DWIN_Frame_AreaCopy(1, 1, 465, 271 - 237, 479 - 2, 48 - 17, 325); } else { - DWIN_ICON_Show(ICON,ICON_Setup_0, 8, 252); + DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 121, 405, 271-123, 420, 34, 325); + DWIN_Frame_AreaCopy(1, 121, 405, 271 - 123, 420, 34, 325); else - DWIN_Frame_AreaCopy(1, 1, 438, 271-239, 479-31, 48-17, 325); + DWIN_Frame_AreaCopy(1, 1, 438, 271 - 239, 479 - 31, 48 - 17, 325); } } void ICON_Pause() { if (select_print.now == 1) { - DWIN_ICON_Show(ICON,ICON_Pause_1, 96, 252); + DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 181, 447, 271-63, 479-20, 124, 325); + DWIN_Frame_AreaCopy(1, 181, 447, 271 - 63, 479 - 20, 124, 325); else - DWIN_Frame_AreaCopy(1, 177, 451, 271-55, 479-17, 136-20, 325); + DWIN_Frame_AreaCopy(1, 177, 451, 271 - 55, 479 - 17, 136 - 20, 325); } else { - DWIN_ICON_Show(ICON,ICON_Pause_0, 96, 252); + DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 181, 405, 271-63, 420, 124, 325); + DWIN_Frame_AreaCopy(1, 181, 405, 271 - 63, 420, 124, 325); else - DWIN_Frame_AreaCopy(1, 177, 423, 271-56, 479-46, 136-20, 325); + DWIN_Frame_AreaCopy(1, 177, 423, 271 - 56, 479 - 46, 136 - 20, 325); } } void ICON_Continue() { if (select_print.now == 1) { - DWIN_ICON_Show(ICON,ICON_Continue_1, 96, 252); + DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 1, 447, 271-243, 479-19, 124, 325); + DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 124, 325); else - DWIN_Frame_AreaCopy(1, 1, 451, 271-239, 479-16, 136-15, 325); + DWIN_Frame_AreaCopy(1, 1, 451, 271 - 239, 479 - 16, 136 - 15, 325); } else { - DWIN_ICON_Show(ICON,ICON_Continue_0, 96, 252); + DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 1, 405, 271-243, 420, 124, 325); + DWIN_Frame_AreaCopy(1, 1, 405, 271 - 243, 420, 124, 325); else - DWIN_Frame_AreaCopy(1, 1, 424, 271-240, 479-45, 136-15, 325); + DWIN_Frame_AreaCopy(1, 1, 424, 271 - 240, 479 - 45, 136 - 15, 325); } } void ICON_Stop() { if (select_print.now == 2) { - DWIN_ICON_Show(ICON,ICON_Stop_1, 184, 252); + DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 151, 447, 271-93, 479-20, 210, 325); + DWIN_Frame_AreaCopy(1, 151, 447, 271 - 93, 479 - 20, 210, 325); else - DWIN_Frame_AreaCopy(1, 218, 451, 271-22, 479-14, 224-15, 325); + DWIN_Frame_AreaCopy(1, 218, 451, 271 - 22, 479 - 14, 224 - 15, 325); } else { - DWIN_ICON_Show(ICON,ICON_Stop_0, 184, 252); + DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 151, 405, 271-93, 420, 210, 325); + DWIN_Frame_AreaCopy(1, 151, 405, 271 - 93, 420, 210, 325); else - DWIN_Frame_AreaCopy(1, 218, 423, 271-24, 479-43, 224-15, 325); + DWIN_Frame_AreaCopy(1, 218, 423, 271 - 24, 479 - 43, 224 - 15, 325); } } @@ -335,7 +375,7 @@ inline void Clear_Title_Bar(void) { } inline void Draw_Title(const char * const title) { - DWIN_Draw_String(false,false,HEADER_FONT,White,Background_blue, 14, 4, (char*)title); + DWIN_Draw_String(false, false, HEADER_FONT, White, Background_blue, 14, 4, (char*)title); } inline void Clear_Menu_Area(void) { @@ -353,20 +393,20 @@ inline void Clear_Popup_Area(void) { } void Draw_Popup_Bkgd_105(void) { - DWIN_Draw_Rectangle(1, Background_window, 14, 105, 271-13, 479-105); + DWIN_Draw_Rectangle(1, Background_window, 14, 105, 271 - 13, 479 - 105); } inline void Draw_More_Icon(const uint8_t line) { - DWIN_ICON_Show(ICON, ICON_More, 226, 46+line*MLINE); + DWIN_ICON_Show(ICON, ICON_More, 226, 46 + line * MLINE); } inline void Draw_Menu_Cursor(const uint8_t line) { - //DWIN_ICON_Show(ICON,ICON_Rectangle, 0, 31+line*MLINE); - DWIN_Draw_Rectangle(1, Rectangle_Color, 0, 31+line*MLINE, 14, 31+(line+1)*MLINE-2); + // DWIN_ICON_Show(ICON,ICON_Rectangle, 0, 31 + line * MLINE); + DWIN_Draw_Rectangle(1, Rectangle_Color, 0, 31 + line * MLINE, 14, 31 + (line + 1) * MLINE - 2); } inline void Erase_Menu_Cursor(const uint8_t line) { - DWIN_Draw_Rectangle(1, Background_black, 0, 31+line*MLINE, 14, 31+(line+1)*MLINE-2); + DWIN_Draw_Rectangle(1, Background_black, 0, 31 + line * MLINE, 14, 31 + (line + 1) * MLINE - 2); } inline void Move_Highlight(const int16_t from, const uint16_t newline) { @@ -376,7 +416,7 @@ inline void Move_Highlight(const int16_t from, const uint16_t newline) { inline void Add_Menu_Line() { Move_Highlight(1, MROWS); - DWIN_Draw_Line(Line_Color, 16, 82+MROWS*MLINE, 256, 83+MROWS*MLINE); + DWIN_Draw_Line(Line_Color, 16, 82 + MROWS * MLINE, 256, 83 + MROWS * MLINE); } inline void Scroll_Menu(const uint8_t dir) { @@ -392,25 +432,25 @@ inline uint16_t nr_sd_menu_items() { } inline void Draw_Menu_Icon(const uint8_t line, const uint8_t icon) { - DWIN_ICON_Show(ICON, icon, 26, 46+line*MLINE); + DWIN_ICON_Show(ICON, icon, 26, 46 + line * MLINE); } inline void Erase_Menu_Text(const uint8_t line) { - DWIN_Draw_Rectangle(1, Background_black, LBLX, 31+line*MLINE+4, 271, 28+(line+1)*MLINE-4); + DWIN_Draw_Rectangle(1, Background_black, LBLX, 31 + line * MLINE + 4, 271, 28 + (line + 1) * MLINE - 4); } inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr) { - if (label) DWIN_Draw_String(false,false,font8x16,White,Background_black, LBLX, 48+line*MLINE, (char*)label); + if (label) DWIN_Draw_String(false, false, font8x16, White, Background_black, LBLX, 48 + line * MLINE, (char*)label); if (icon) Draw_Menu_Icon(line, icon); - DWIN_Draw_Line(Line_Color, 16, 29+(line+1)*MLINE, 256, 30+(line+1)*MLINE); + DWIN_Draw_Line(Line_Color, 16, 29 + (line + 1) * MLINE, 256, 30 + (line + 1) * MLINE); } // The "Back" label is always on the first line inline void Draw_Back_Label(void) { if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 129, 72, 271-115, 479-395, LBLX, MBASE(0)); + DWIN_Frame_AreaCopy(1, 129, 72, 271 - 115, 479 - 395, LBLX, MBASE(0)); else - DWIN_Frame_AreaCopy(1, 226, 179, 271-15, 479-290, LBLX, MBASE(0)); + DWIN_Frame_AreaCopy(1, 226, 179, 271 - 15, 479 - 290, LBLX, MBASE(0)); } // Draw "Back" line at the top @@ -425,12 +465,12 @@ inline void Draw_Back_First(const bool is_sel=true) { // inline void draw_move_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 69, 61, 271-169, 479-408, LBLX, line); // "Move" + DWIN_Frame_AreaCopy(1, 69, 61, 271 - 169, 479 - 408, LBLX, line); // "Move" } inline void Prepare_Item_Move(const uint8_t row) { if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 159, 70, 271-71, 479-395, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 159, 70, 271 - 71, 479 - 395, LBLX, MBASE(row)); else draw_move_en(MBASE(row)); // "Move >" Draw_Menu_Line(row, ICON_Axis); @@ -439,76 +479,78 @@ inline void Prepare_Item_Move(const uint8_t row) { inline void Prepare_Item_Disable(const uint8_t row) { if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 204, 70, 271-12, 479-397, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 204, 70, 271 - 12, 479 - 397, LBLX, MBASE(row)); else - DWIN_Frame_AreaCopy(1, 103, 59, 271-71, 479-405, LBLX, MBASE(row)); // "Disable Stepper" + DWIN_Frame_AreaCopy(1, 103, 59, 271 - 71, 479 - 405, LBLX, MBASE(row)); // "Disable Stepper" Draw_Menu_Line(row, ICON_CloseMotor); } inline void Prepare_Item_Home(const uint8_t row) { if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 0, 89, 271-230, 479-378, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 0, 89, 271 - 230, 479 - 378, LBLX, MBASE(row)); else - DWIN_Frame_AreaCopy(1, 202, 61, 271-0, 479-408, LBLX, MBASE(row)); // "Auto Home" + DWIN_Frame_AreaCopy(1, 202, 61, 271 - 0, 479 - 408, LBLX, MBASE(row)); // "Auto Home" Draw_Menu_Line(row, ICON_Homing); } inline void Prepare_Item_Offset(const uint8_t row) { if (HMI_flag.language_flag) { #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 174, 164, 271-48, 479-302, LBLX, MBASE(row)); - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z*100); + DWIN_Frame_AreaCopy(1, 174, 164, 271 - 48, 479 - 302, LBLX, MBASE(row)); + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else - DWIN_Frame_AreaCopy(1, 43, 89, 271-173, 479-378, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 43, 89, 271 - 173, 479 - 378, LBLX, MBASE(row)); #endif } else { #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 93, 179, 271-130, 479-290, LBLX, MBASE(row)); // "Z-Offset" - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z*100); + DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(row)); // "Z-Offset" + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); #else - DWIN_Frame_AreaCopy(1, 1, 76, 271-165, 479-393, LBLX, MBASE(row)); // "..." + DWIN_Frame_AreaCopy(1, 1, 76, 271 - 165, 479 - 393, LBLX, MBASE(row)); // "..." #endif } Draw_Menu_Line(row, ICON_SetHome); } inline void Prepare_Item_PLA(const uint8_t row) { - if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 100, 89, 271-93-27, 479-378, LBLX, MBASE(row)); + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 100, 89, 271 - 93 - 27, 479 - 378, LBLX, MBASE(row)); + } else { - DWIN_Frame_AreaCopy(1, 107, 76, 271-115, 479-393, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX+49+3, MBASE(row)); // "PLA" + DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX + 49 + 3, MBASE(row)); // "PLA" } Draw_Menu_Line(row, ICON_PLAPreheat); } inline void Prepare_Item_ABS(const uint8_t row) { - if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 180, 89, 271-11-27, 479-379, LBLX, MBASE(row)); + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 180, 89, 271 - 11 - 27, 479 - 379, LBLX, MBASE(row)); + } else { - DWIN_Frame_AreaCopy(1, 107, 76, 271-115, 479-393, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX+49+3, MBASE(row)); // "ABS" + DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 49 + 3, MBASE(row)); // "ABS" } Draw_Menu_Line(row, ICON_ABSPreheat); } inline void Prepare_Item_Cool(const uint8_t row) { if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 1, 104, 271-215, 479-362, LBLX, MBASE(row)); + DWIN_Frame_AreaCopy(1, 1, 104, 271 - 215, 479 - 362, LBLX, MBASE(row)); else - DWIN_Frame_AreaCopy(1, 200, 76, 271-7, 479-393, LBLX, MBASE(row)); // "Cooldown" + DWIN_Frame_AreaCopy(1, 200, 76, 271 - 7, 479 - 393, LBLX, MBASE(row));// "Cooldown" Draw_Menu_Line(row, ICON_Cool); } inline void Prepare_Item_Lang(const uint8_t row) { if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 239, 134, 271-5, 479-333, LBLX, MBASE(row)); - DWIN_Draw_String(false,false,font8x16,White,Background_black, 226, MBASE(row), (char*)"CN"); + DWIN_Frame_AreaCopy(1, 239, 134, 271 - 5, 479 - 333, LBLX, MBASE(row)); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), (char*)"CN"); } else { - DWIN_Frame_AreaCopy(1, 0, 194, 271-150, 479-272, LBLX, MBASE(row)); // "Language selection" - DWIN_Draw_String(false,false,font8x16,White,Background_black, 226, MBASE(row), (char*)"EN"); + DWIN_Frame_AreaCopy(1, 0, 194, 271 - 150, 479 - 272, LBLX, MBASE(row)); // "Language selection" + DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), (char*)"EN"); } Draw_Menu_Icon(row, ICON_Language); } @@ -516,29 +558,30 @@ inline void Prepare_Item_Lang(const uint8_t row) { inline void Draw_Prepare_Menu() { Clear_Main_Window(); - const int16_t scroll = MROWS-index_prepare; // Scrolled-up lines + const int16_t scroll = MROWS - index_prepare; // Scrolled-up lines #define PSCROL(L) (scroll + (L)) #define PVISI(L) WITHIN(PSCROL(L), 0, MROWS) - if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 133, 1, 271-111, 479-465-1, 14, 8); // "Prepare" + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 133, 1, 271 - 111, 479 - 465 - 1, 14, 8); // "Prepare" + } else { #ifdef USE_STRING_HEADINGS Draw_Title("Prepare"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 178, 2, 271-42, 479-464-1, 14, 8); // "Prepare" + DWIN_Frame_AreaCopy(1, 178, 2, 271 - 42, 479 - 464 - 1, 14, 8); // "Prepare" #endif } if (PVISI(0)) Draw_Back_First(select_prepare.now == 0); // < Back - if (PVISI(1)) Prepare_Item_Move(PSCROL(1)); // Move > - if (PVISI(2)) Prepare_Item_Disable(PSCROL(2)); // Disable Stepper - if (PVISI(3)) Prepare_Item_Home(PSCROL(3)); // Auto Home - if (PVISI(4)) Prepare_Item_Offset(PSCROL(4)); // Z-Offset - if (PVISI(5)) Prepare_Item_PLA(PSCROL(5)); // Preheat PLA - if (PVISI(6)) Prepare_Item_ABS(PSCROL(6)); // Preheat ABS - if (PVISI(7)) Prepare_Item_Cool(PSCROL(7)); // Cooldown - if (PVISI(8)) Prepare_Item_Lang(PSCROL(8)); // Language CN/EN + if (PVISI(1)) Prepare_Item_Move(PSCROL(1)); // Move > + if (PVISI(2)) Prepare_Item_Disable(PSCROL(2)); // Disable Stepper + if (PVISI(3)) Prepare_Item_Home(PSCROL(3)); // Auto Home + if (PVISI(4)) Prepare_Item_Offset(PSCROL(4)); // Z-Offset + if (PVISI(5)) Prepare_Item_PLA(PSCROL(5)); // Preheat PLA + if (PVISI(6)) Prepare_Item_ABS(PSCROL(6)); // Preheat ABS + if (PVISI(7)) Prepare_Item_Cool(PSCROL(7)); // Cooldown + if (PVISI(8)) Prepare_Item_Lang(PSCROL(8)); // Language CN/EN if (select_prepare.now) Draw_Menu_Cursor(PSCROL(select_prepare.now)); } @@ -546,44 +589,44 @@ inline void Draw_Prepare_Menu() { inline void Draw_Control_Menu() { Clear_Main_Window(); - const int16_t scroll = TERN(HAS_LEVELING, MROWS-index_control, 0); // Scrolled-up lines + const int16_t scroll = TERN(HAS_LEVELING, MROWS - index_control, 0); // Scrolled-up lines #define CSCROL(L) (scroll + (L)) #define CLINE(L) MBASE(CSCROL(L)) #define CVISI(L) WITHIN(CSCROL(L), 0, MROWS) - if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back + if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 103, 1, 271-141, 479-465, 14, 8); - DWIN_Frame_AreaCopy(1, 57, 104, 271-187, 479-363, LBLX, CLINE(1)); // Temperature > - DWIN_Frame_AreaCopy(1, 87, 104, 271-157, 479-363, LBLX, CLINE(2)); // Motion > - DWIN_Frame_AreaCopy(1, 117, 104, 271- 99, 479-363, LBLX, CLINE(3)); // Store Config - DWIN_Frame_AreaCopy(1, 174, 103, 271- 42, 479-363, LBLX, CLINE(4)); // Read Config - DWIN_Frame_AreaCopy(1, 1, 118, 271-215, 479-348, LBLX, CLINE(5)); // Reset Config + DWIN_Frame_AreaCopy(1, 103, 1, 271 - 141, 479 - 465, 14, 8); + DWIN_Frame_AreaCopy(1, 57, 104, 271 - 187, 479 - 363, LBLX, CLINE(1)); // Temperature > + DWIN_Frame_AreaCopy(1, 87, 104, 271 - 157, 479 - 363, LBLX, CLINE(2)); // Motion > + DWIN_Frame_AreaCopy(1, 117, 104, 271 - 99, 479 - 363, LBLX, CLINE(3)); // Store Config + DWIN_Frame_AreaCopy(1, 174, 103, 271 - 42, 479 - 363, LBLX, CLINE(4)); // Read Config + DWIN_Frame_AreaCopy(1, 1, 118, 271 - 215, 479 - 348, LBLX, CLINE(5)); // Reset Config if (CVISI(6)) - DWIN_Frame_AreaCopy(1, 231, 104, 271- 13, 479-363, LBLX, CLINE(6)); // Info > + DWIN_Frame_AreaCopy(1, 231, 104, 271 - 13, 479 - 363, LBLX, CLINE(6)); // Info > } else { #ifdef USE_STRING_HEADINGS Draw_Title("Control"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 128, 2, 271-95, 479-467, 14, 8); + DWIN_Frame_AreaCopy(1, 128, 2, 271 - 95, 479 - 467, 14, 8); #endif - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX, CLINE(1)); // Temperature > - DWIN_Frame_AreaCopy(1, 84, 89, 271-143, 479-380, LBLX, CLINE(2)); // Motion > - DWIN_Frame_AreaCopy(1, 131+17, 89, 271- 3, 479-377-1, LBLX, CLINE(3)); // "Store Configuration" + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX, CLINE(1));// Temperature > + DWIN_Frame_AreaCopy(1, 84, 89, 271 - 143, 479 - 380, LBLX, CLINE(2));// Motion > + DWIN_Frame_AreaCopy(1, 131 + 17, 89, 271 - 3, 479 - 377 - 1, LBLX, CLINE(3));// "Store Configuration" - DWIN_Frame_AreaCopy(1, 26, 104, 271-214, 479-365, LBLX, CLINE(4)); // "Read" - DWIN_Frame_AreaCopy(1, 131+51, 89, 271-3, 479-377-1, LBLX+31+3, CLINE(4)); // "Configuration" + DWIN_Frame_AreaCopy(1, 26, 104, 271 - 214, 479 - 365, LBLX, CLINE(4)); // "Read" + DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 31 + 3, CLINE(4)); // "Configuration" - DWIN_Frame_AreaCopy(1, 59, 104, 271-178, 479-365, LBLX, CLINE(5)); // "Reset" - DWIN_Frame_AreaCopy(1, 131+51, 89, 271-3, 479-377-1, LBLX+34+3, CLINE(5)); // "Configuration" + DWIN_Frame_AreaCopy(1, 59, 104, 271 - 178, 479 - 365, LBLX, CLINE(5)); // "Reset" + DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 34 + 3, CLINE(5)); // "Configuration" if (CVISI(6)) - DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > + DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > } if (select_control.now && CVISI(select_control.now)) @@ -591,7 +634,7 @@ inline void Draw_Control_Menu() { // Draw icons and lines LOOP_L_N(i, 6) - if (CVISI(i + 1)) Draw_Menu_Line(CSCROL(i + 1), ICON_Temperature+i); + if (CVISI(i + 1)) Draw_Menu_Line(CSCROL(i + 1), ICON_Temperature + i); Draw_More_Icon(CSCROL(1)); Draw_More_Icon(CSCROL(2)); @@ -602,27 +645,27 @@ inline void Draw_Tune_Menu() { Clear_Main_Window(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 73, 2, 271-171, 479-466, 14, 9); + DWIN_Frame_AreaCopy(1, 73, 2, 271 - 171, 479 - 466, 14, 9); - DWIN_Frame_AreaCopy(1, 116, 164, 271-100, 479-303, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 174, 164, 271-48, 479-302, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 116, 164, 271 - 100, 479 - 303, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 115, 134, 271 - 101, 479 - 333, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 174, 164, 271 - 48, 479 - 302, LBLX, MBASE(5)); } else { #ifdef USE_STRING_HEADINGS Draw_Title("Tune"); // TODO: GET_TEXT #else - DWIN_Frame_AreaCopy(1, 94, 2, 271-145, 479-467, 14, 9); + DWIN_Frame_AreaCopy(1, 94, 2, 271 - 145, 479 - 467, 14, 9); #endif - DWIN_Frame_AreaCopy(1, 1, 179, 271-179, 479-287-2, LBLX, MBASE(1)); // print speed - DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX, MBASE(2)); // Hotend... - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+41+3, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX, MBASE(3)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+3, MBASE(3)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX, MBASE(4)); // fan speed - DWIN_Frame_AreaCopy(1, 93, 179, 271-130, 479-290, LBLX, MBASE(5)); // Z-offset + DWIN_Frame_AreaCopy(1, 1, 179, 271 - 179, 479 - 287 - 2, LBLX, MBASE(1)); // print speed + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(2)); // Hotend... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(2)); // ...Temperature + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(3)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(3)); // ...Temperature + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(4)); // fan speed + DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(5)); // Z-offset } Draw_Back_First(select_tune.now == 0); @@ -634,72 +677,72 @@ inline void Draw_Tune_Menu() { Draw_Menu_Line(4, ICON_FanSpeed); Draw_Menu_Line(5, ICON_Zoffset); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), feedrate_percentage); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), thermalManager.temp_hotend[0].target); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), thermalManager.temp_bed.target); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(4), thermalManager.fan_speed[0]); - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5), BABY_Z_VAR*100); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), feedrate_percentage); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(4), thermalManager.fan_speed[0]); + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5), BABY_Z_VAR * 100); } inline void draw_max_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 245, 119, 271-2, 479-350, LBLX, line); // "Max" + DWIN_Frame_AreaCopy(1, 245, 119, 271 - 2, 479 - 350, LBLX, line); // "Max" } inline void draw_max_accel_en(const uint16_t line) { draw_max_en(line); - DWIN_Frame_AreaCopy(1, 1, 135, 271-192, 479-334, LBLX+24+3, line); // "Acceleration" + DWIN_Frame_AreaCopy(1, 1, 135, 271 - 192, 479 - 334, LBLX + 24 + 3, line); // "Acceleration" } inline void draw_speed_en(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 184, 119, 224, 479-347, LBLX+inset, line); // "Speed" + DWIN_Frame_AreaCopy(1, 184, 119, 224, 479 - 347, LBLX + inset, line); // "Speed" } inline void draw_corner_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 64, 119, 271-165, 479-350, LBLX+24+3, line); // "Corner" + DWIN_Frame_AreaCopy(1, 64, 119, 271 - 165, 479 - 350, LBLX + 24 + 3, line); // "Corner" } inline void draw_steps_per_mm(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 1, 151, 271-170, 479-318, LBLX, line); // "Steps-per-mm" + DWIN_Frame_AreaCopy(1, 1, 151, 271 - 170, 479 - 318, LBLX, line); // "Steps-per-mm" } inline void say_x(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 95, 104, 271-169, 479-365, LBLX+inset, line); // "X" + DWIN_Frame_AreaCopy(1, 95, 104, 271 - 169, 479 - 365, LBLX + inset, line); // "X" } inline void say_y(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 104, 104, 271-161, 479-365, LBLX+inset, line); // "Y" + DWIN_Frame_AreaCopy(1, 104, 104, 271 - 161, 479 - 365, LBLX + inset, line); // "Y" } inline void say_z(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 112, 104, 271-151, 479-365, LBLX+inset, line); // "Z" + DWIN_Frame_AreaCopy(1, 112, 104, 271 - 151, 479 - 365, LBLX + inset, line); // "Z" } inline void say_e(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 237, 119, 271-27, 479-350, LBLX+inset, line); // "E" + DWIN_Frame_AreaCopy(1, 237, 119, 271 - 27, 479 - 350, LBLX + inset, line); // "E" } inline void Draw_Motion_Menu() { Clear_Main_Window(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 1, 16, 271-243, 479-451, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); - DWIN_Frame_AreaCopy(1, 173, 133, 228, 479-332, LBLX, MBASE(1)); // max speed - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(2)); // max... - DWIN_Frame_AreaCopy(1, 28, 149, 271-202, 479-318, LBLX+27, MBASE(2)+1); // ...acceleration - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(3)); // max... - DWIN_Frame_AreaCopy(1, 1, 180, 271-243, 479-287, LBLX+27, MBASE(3)+1); // ... - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479-332, LBLX+54, MBASE(3)); // ...jerk - DWIN_Frame_AreaCopy(1, 153, 148, 271-77, 479-318, LBLX, MBASE(4)); // flow ratio + DWIN_Frame_AreaCopy(1, 173, 133, 228, 479 - 332, LBLX, MBASE(1)); // max speed + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(2)); // max... + DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(2) + 1); // ...acceleration + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(3)); // max... + DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(3) + 1); // ... + DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 54, MBASE(3)); // ...jerk + DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(4)); // flow ratio } else { #ifdef USE_STRING_HEADINGS Draw_Title("Motion"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 144, 16, 271-82, 479-453, 14, 8); + DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); #endif - draw_max_en(MBASE(1)); draw_speed_en(24+3, MBASE(1)); // "Max Speed" - draw_max_accel_en(MBASE(2)); // "Max Acceleration" - draw_max_en(MBASE(3)); draw_corner_en(MBASE(3)); // "Max Corner" - draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" + draw_max_en(MBASE(1)); draw_speed_en(24 + 3, MBASE(1)); // "Max Speed" + draw_max_accel_en(MBASE(2)); // "Max Acceleration" + draw_max_en(MBASE(3)); draw_corner_en(MBASE(3)); // "Max Corner" + draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" } Draw_Back_First(select_motion.now == 0); if (select_motion.now) Draw_Menu_Cursor(select_motion.now); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeed+i); + LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeed + i); Draw_More_Icon(1); Draw_More_Icon(2); @@ -717,30 +760,30 @@ void Popup_Window_Temperature(const bool toohigh) { if (toohigh) { DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 103, 371, 237, 479-93, 52, 285); + DWIN_Frame_AreaCopy(1, 103, 371, 237, 479 - 93, 52, 285); DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271-0, 402, 95, 310); + DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); } else { - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 36, 300, (char*)"Nozzle or Bed temperature"); - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 92, 300, (char*)"is too high"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, (char*)"Nozzle or Bed temperature"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, (char*)"is too high"); } } else { DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 103, 371, 271-1, 479-93, 52, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271-0, 402, 95, 310); + DWIN_Frame_AreaCopy(1, 103, 371, 271 - 1, 479 - 93, 52, 285); + DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); } else { - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 36, 300, (char*)"Nozzle or Bed temperature"); - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 92, 300, (char*)"is too low"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 36, 300, (char*)"Nozzle or Bed temperature"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 300, (char*)"is too low"); } } } inline void Draw_Popup_Bkgd_60() { - DWIN_Draw_Rectangle(1, Background_window, 14, 60, 271-13, 330); + DWIN_Draw_Rectangle(1, Background_window, 14, 60, 271 - 13, 330); } #if HAS_HOTEND @@ -750,12 +793,12 @@ inline void Draw_Popup_Bkgd_60() { Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 103, 371, 136, 479-93, 69, 240); - DWIN_Frame_AreaCopy(1, 170, 371, 271-1, 479-93, 69+33, 240); + DWIN_Frame_AreaCopy(1, 103, 371, 136, 479 - 93, 69, 240); + DWIN_Frame_AreaCopy(1, 170, 371, 271 - 1, 479 - 93, 69 + 33, 240); DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); } else { - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 20, 235, (char*)"Nozzle is too cold"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 20, 235, (char*)"Nozzle is too cold"); DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280); } } @@ -766,15 +809,15 @@ void Popup_Window_Resume(void) { Clear_Popup_Area(); Draw_Popup_Bkgd_105(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 160, 338, 271-36, 479-125, 98, 135); - DWIN_Frame_AreaCopy(1, 103, 321, 271-0, 479-144, 52, 192); + DWIN_Frame_AreaCopy(1, 160, 338, 271 - 36, 479 - 125, 98, 135); + DWIN_Frame_AreaCopy(1, 103, 321, 271 - 0, 479 - 144, 52, 192); DWIN_ICON_Show(ICON, ICON_Continue_C, 26, 307); DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 307); } else { - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 120, 115, (char*)"Tips"); - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 24, 192, (char*)"I see the file stopped"); - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 68, 212, (char*)"unexpectedly last time"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 120, 115, (char*)"Tips"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 192, (char*)"I see the file stopped"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 68, 212, (char*)"unexpectedly last time"); DWIN_ICON_Show(ICON, ICON_Continue_E, 26, 307); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 307); } @@ -790,8 +833,8 @@ void Popup_Window_Home(void) { DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 80, 230, (char*)"Auto homing..."); - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 80, 230, (char*)"Auto homing..."); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); } } @@ -804,8 +847,8 @@ void Popup_Window_Leveling(void) { DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 76, 230, (char*)"Auto leveling..."); - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 76, 230, (char*)"Auto leveling..."); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); } } @@ -830,8 +873,8 @@ void Popup_window_PauseOrStop(void) { DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); } else { - if (select_print.now == 1) DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 88, 150, (char*)"Pause print?"); - else if (select_print.now == 2) DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, 92, 150, (char*)"Stop print?"); + if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 88, 150, (char*)"Pause print?"); + else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 150, (char*)"Stop print?"); DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); } @@ -840,35 +883,35 @@ void Popup_window_PauseOrStop(void) { void Draw_Printing_Screen(void) { if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 30, 1, 271-200, 479-465, 14, 9); // Tune - DWIN_Frame_AreaCopy(1, 0, 72, 271-208, 479-393, 41, 188); // Pause - DWIN_Frame_AreaCopy(1, 65, 72, 271-143, 479-393, 176, 188); // Stop + DWIN_Frame_AreaCopy(1, 30, 1, 271 - 200, 479 - 465, 14, 9);// Tune + DWIN_Frame_AreaCopy(1, 0, 72, 271 - 208, 479 - 393, 41, 188);// Pause + DWIN_Frame_AreaCopy(1, 65, 72, 271 - 143, 479 - 393, 176, 188); // Stop } else { - DWIN_Frame_AreaCopy(1, 40, 2, 271-179, 479-464-1, 14, 9); // Tune - DWIN_Frame_AreaCopy(1, 0, 44, 271-175, 479-420-1, 41, 188); // Pause - DWIN_Frame_AreaCopy(1, 98, 44, 271-119, 479-420-1, 176, 188); // Stop + DWIN_Frame_AreaCopy(1, 40, 2, 271 - 179, 479 - 464 - 1, 14, 9);// Tune + DWIN_Frame_AreaCopy(1, 0, 44, 271 - 175, 479 - 420 - 1, 41, 188);// Pause + DWIN_Frame_AreaCopy(1, 98, 44, 271 - 119, 479 - 420 - 1, 176, 188); // Stop } } void Draw_Print_ProgressBar() { - DWIN_ICON_Show(ICON,ICON_Bar, 15, 93); - DWIN_Draw_Rectangle(1, BarFill_Color, 16+Percentrecord*240/100, 93, 256, 113); - DWIN_Draw_IntValue(true,true,0,font8x16,Percent_Color,Background_black, 2, 117, 133, Percentrecord); - DWIN_Draw_String(false,false,font8x16,Percent_Color,Background_black, 117+16, 133, (char*)"%"); + DWIN_ICON_Show(ICON, ICON_Bar, 15, 93); + DWIN_Draw_Rectangle(1, BarFill_Color, 16 + Percentrecord * 240 / 100, 93, 256, 113); + DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Background_black, 2, 117, 133, Percentrecord); + DWIN_Draw_String(false, false, font8x16, Percent_Color, Background_black, 117 + 16, 133, (char*)"%"); } void Draw_Print_ProgressElapsed() { - duration_t elapsed = print_job_timer.duration(); // print timer - DWIN_Draw_IntValue(true,true,1,font8x16,White,Background_black, 2, 42, 212, elapsed.value/3600); - DWIN_Draw_String(false,false,font8x16,White,Background_black, 42+16, 212, (char*)":"); - DWIN_Draw_IntValue(true,true,1,font8x16,White,Background_black, 2, 42+24, 212, (elapsed.value%3600)/60); + duration_t elapsed = print_job_timer.duration(); // print timer + DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 42, 212, elapsed.value / 3600); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 42 + 16, 212, (char*)":"); + DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 42 + 24, 212, (elapsed.value % 3600) / 60); } void Draw_Print_ProgressRemain() { - DWIN_Draw_IntValue(true,true,1,font8x16,White,Background_black, 2, 176, 212, remain_time/3600); - DWIN_Draw_String(false,false,font8x16,White,Background_black, 176+16, 212, (char*)":"); - DWIN_Draw_IntValue(true,true,1,font8x16,White,Background_black, 2, 176+24, 212, (remain_time%3600)/60); + DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 176, 212, remain_time / 3600); + DWIN_Draw_String(false, false, font8x16, White, Background_black, 176 + 16, 212, (char*)":"); + DWIN_Draw_IntValue(true, true, 1, font8x16, White, Background_black, 2, 176 + 24, 212, (remain_time % 3600) / 60); } void Goto_PrintProcess(void) { @@ -883,10 +926,10 @@ void Goto_PrintProcess(void) { // Copy into filebuf string before entry char * const name = card.longest_filename(); - DWIN_Draw_String(false,false,font8x16,White,Background_black, (DWIN_WIDTH-strlen(name)*MENU_CHR_W)/2, 60, name); + DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2, 60, name); - DWIN_ICON_Show(ICON,ICON_PrintTime, 17, 193); - DWIN_ICON_Show(ICON,ICON_RemainTime, 150, 191); + DWIN_ICON_Show(ICON, ICON_PrintTime, 17, 193); + DWIN_ICON_Show(ICON, ICON_RemainTime, 150, 191); Draw_Print_ProgressBar(); Draw_Print_ProgressElapsed(); @@ -898,13 +941,14 @@ void Goto_MainMenu(void) { Clear_Main_Window(); - if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 2, 2, 271-244, 479-465, 14, 9); // "Home" + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 2, 2, 271 - 244, 479 - 465, 14, 9); // "Home" + } else { #ifdef USE_STRING_HEADINGS Draw_Title("Home"); // TODO: GET_TEXT #else - DWIN_Frame_AreaCopy(1, 0, 2, 271-232, 479-467, 14, 9); + DWIN_Frame_AreaCopy(1, 0, 2, 271 - 232, 479 - 467, 14, 9); #endif } @@ -920,21 +964,23 @@ inline ENCODER_DiffState get_encoder_state() { const millis_t ms = millis(); if (PENDING(ms, Encoder_ms)) return ENCODER_DIFF_NO; const ENCODER_DiffState state = Encoder_ReceiveAnalyze(); - if (state != ENCODER_DIFF_NO) Encoder_ms = ms + Encoder_wait; + if (state != ENCODER_DIFF_NO) Encoder_ms = ms + ENCODER_WAIT; return state; } void HMI_Move_X(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Move_X_scale += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Move_X_scale -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; EncoderRate.encoderRateEnabled = 0; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -943,10 +989,10 @@ void HMI_Move_X(void) { DWIN_UpdateLCD(); return; } - if (HMI_ValueStruct.Move_X_scale < X_MIN_POS*MinUnitMult) HMI_ValueStruct.Move_X_scale = X_MIN_POS*MinUnitMult; - else if (HMI_ValueStruct.Move_X_scale > X_MAX_POS*MinUnitMult) HMI_ValueStruct.Move_X_scale = X_MAX_POS*MinUnitMult; - current_position[X_AXIS] = HMI_ValueStruct.Move_X_scale/10; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + NOLESS(HMI_ValueStruct.Move_X_scale, (X_MIN_POS) * MINUNITMULT); + NOMORE(HMI_ValueStruct.Move_X_scale, (X_MAX_POS) * MINUNITMULT); + current_position[X_AXIS] = HMI_ValueStruct.Move_X_scale / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); DWIN_UpdateLCD(); } } @@ -954,14 +1000,16 @@ void HMI_Move_X(void) { void HMI_Move_Y(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Move_Y_scale += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Move_Y_scale -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; EncoderRate.encoderRateEnabled = 0; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -970,10 +1018,10 @@ void HMI_Move_Y(void) { DWIN_UpdateLCD(); return; } - if (HMI_ValueStruct.Move_Y_scale < Y_MIN_POS*MinUnitMult) HMI_ValueStruct.Move_Y_scale = Y_MIN_POS*MinUnitMult; - else if (HMI_ValueStruct.Move_Y_scale > Y_MAX_POS*MinUnitMult) HMI_ValueStruct.Move_Y_scale = Y_MAX_POS*MinUnitMult; - current_position[Y_AXIS] = HMI_ValueStruct.Move_Y_scale/10; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + NOLESS(HMI_ValueStruct.Move_Y_scale, (Y_MIN_POS) * MINUNITMULT); + NOMORE(HMI_ValueStruct.Move_Y_scale, (Y_MAX_POS) * MINUNITMULT); + current_position[Y_AXIS] = HMI_ValueStruct.Move_Y_scale / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); DWIN_UpdateLCD(); } } @@ -981,14 +1029,16 @@ void HMI_Move_Y(void) { void HMI_Move_Z(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Move_Z_scale += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Move_Z_scale -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; EncoderRate.encoderRateEnabled = 0; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); if (!planner.is_full()) { // Wait for planner moves to finish! planner.synchronize(); @@ -997,12 +1047,10 @@ void HMI_Move_Z(void) { DWIN_UpdateLCD(); return; } - if (HMI_ValueStruct.Move_Z_scale < Z_MIN_POS*MinUnitMult) - HMI_ValueStruct.Move_Z_scale = Z_MIN_POS*MinUnitMult; - else if (HMI_ValueStruct.Move_Z_scale > Z_MAX_POS*MinUnitMult) - HMI_ValueStruct.Move_Z_scale = Z_MAX_POS*MinUnitMult; - current_position[Z_AXIS] = HMI_ValueStruct.Move_Z_scale/10; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + NOLESS(HMI_ValueStruct.Move_Z_scale, Z_MIN_POS * MINUNITMULT); + NOMORE(HMI_ValueStruct.Move_Z_scale, Z_MAX_POS * MINUNITMULT); + current_position[Z_AXIS] = HMI_ValueStruct.Move_Z_scale / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); DWIN_UpdateLCD(); } } @@ -1010,10 +1058,12 @@ void HMI_Move_Z(void) { void HMI_Move_E(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Move_E_scale += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Move_E_scale -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { checkkey = AxisMove; EncoderRate.encoderRateEnabled = 0; @@ -1026,11 +1076,11 @@ void HMI_Move_E(void) { DWIN_UpdateLCD(); return; } - if ((HMI_ValueStruct.Move_E_scale-last_E_scale) > EXTRUDE_MAXLENGTH*MinUnitMult) - HMI_ValueStruct.Move_E_scale = last_E_scale + EXTRUDE_MAXLENGTH*MinUnitMult; - else if ((last_E_scale-HMI_ValueStruct.Move_E_scale) > EXTRUDE_MAXLENGTH*MinUnitMult) - HMI_ValueStruct.Move_E_scale = last_E_scale - EXTRUDE_MAXLENGTH*MinUnitMult; - current_position.e = HMI_ValueStruct.Move_E_scale/10; + if ((HMI_ValueStruct.Move_E_scale - last_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) + HMI_ValueStruct.Move_E_scale = last_E_scale + (EXTRUDE_MAXLENGTH) * MINUNITMULT; + else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) + HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; + current_position.e = HMI_ValueStruct.Move_E_scale / 10; show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); DWIN_UpdateLCD(); } @@ -1040,13 +1090,15 @@ void HMI_Zoffset(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { last_zoffset = zprobe_zoffset; - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.offset_value += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.offset_value -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { EncoderRate.encoderRateEnabled = 0; - zprobe_zoffset = HMI_ValueStruct.offset_value / 100; + zprobe_zoffset = HMI_ValueStruct.offset_value / 100; #if HAS_BED_PROBE if (WITHIN(zprobe_zoffset - last_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) probe.offset.z = zprobe_zoffset; @@ -1059,21 +1111,21 @@ void HMI_Zoffset(void) { if (HMI_ValueStruct.show_mode == -4) { checkkey = Prepare; - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(4+MROWS-index_prepare), TERN(HAS_LEVELING, probe.offset.z*100, HMI_ValueStruct.offset_value)); + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(4 + MROWS - index_prepare), TERN(HAS_LEVELING, probe.offset.z * 100, HMI_ValueStruct.offset_value)); } else { checkkey = Tune; - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5+MROWS-index_tune), TERN(HAS_LEVELING, probe.offset.z*100, HMI_ValueStruct.offset_value)); + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5 + MROWS - index_tune), TERN(HAS_LEVELING, probe.offset.z * 100, HMI_ValueStruct.offset_value)); } DWIN_UpdateLCD(); return; } - NOLESS(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN)*100); - NOMORE(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MAX)*100); + NOLESS(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100); + NOMORE(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MAX) * 100); if (HMI_ValueStruct.show_mode == -4) - show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(4+MROWS-index_prepare), HMI_ValueStruct.offset_value); + show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(4 + MROWS - index_prepare), HMI_ValueStruct.offset_value); else - show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(5+MROWS-index_tune), HMI_ValueStruct.offset_value); + show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(5 + MROWS - index_tune), HMI_ValueStruct.offset_value); DWIN_UpdateLCD(); } } @@ -1083,376 +1135,394 @@ void HMI_Zoffset(void) { void HMI_ETemp(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.E_Temp += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.E_Temp -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return EncoderRate.encoderRateEnabled = 0; if (HMI_ValueStruct.show_mode == -1) { // temperature checkkey = TemperatureID; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); return; } else { // tune checkkey = Tune; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2 + MROWS - index_tune), HMI_ValueStruct.E_Temp); } thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0); return; } // E_Temp limit - NOMORE(HMI_ValueStruct.E_Temp, max_E_Temp); - NOLESS(HMI_ValueStruct.E_Temp, min_E_Temp); + NOMORE(HMI_ValueStruct.E_Temp, MAX_E_TEMP); + NOLESS(HMI_ValueStruct.E_Temp, MIN_E_TEMP); // E_Temp value - if (HMI_ValueStruct.show_mode >= 0) // tune - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), HMI_ValueStruct.E_Temp); - else // other page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); + if (HMI_ValueStruct.show_mode >= 0) // tune + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2 + MROWS - index_tune), HMI_ValueStruct.E_Temp); + else // other page + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); } } -#endif +#endif // if HAS_HOTEND #if HAS_HEATED_BED void HMI_BedTemp(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Bed_Temp += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Bed_Temp -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return EncoderRate.encoderRateEnabled = 0; if (HMI_ValueStruct.show_mode == -1) { checkkey = TemperatureID; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); return; } else { checkkey = Tune; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3 + MROWS - index_tune), HMI_ValueStruct.Bed_Temp); } thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); return; } - //Bed_Temp limit - NOMORE(HMI_ValueStruct.Bed_Temp, max_Bed_Temp); - NOLESS(HMI_ValueStruct.Bed_Temp, min_Bed_Temp); - //Bed_Temp value + // Bed_Temp limit + NOMORE(HMI_ValueStruct.Bed_Temp, BED_MAX_TARGET); + NOLESS(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP); + // Bed_Temp value if (HMI_ValueStruct.show_mode >= 0) // tune page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3 + MROWS - index_tune), HMI_ValueStruct.Bed_Temp); else // other page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); } } -#endif +#endif // if HAS_HEATED_BED #if HAS_FAN void HMI_FanSpeed(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Fan_speed += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Fan_speed -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return EncoderRate.encoderRateEnabled = 0; if (HMI_ValueStruct.show_mode == -1) { checkkey = TemperatureID; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); } else if (HMI_ValueStruct.show_mode == -2) { checkkey = PLAPreheat; ui.material_preset[0].fan_speed = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); return; } else if (HMI_ValueStruct.show_mode == -3) { checkkey = ABSPreheat; ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); return; } else { checkkey = Tune; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(4 + MROWS - index_tune), HMI_ValueStruct.Fan_speed); } thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); return; } - //Fan_speed limit - NOMORE(HMI_ValueStruct.Fan_speed, FanOn); - NOLESS(HMI_ValueStruct.Fan_speed, FanOff); + // Fan_speed limit + NOMORE(HMI_ValueStruct.Fan_speed, FANON); + NOLESS(HMI_ValueStruct.Fan_speed, FANOFF); // Fan_speed value if (HMI_ValueStruct.show_mode >= 0) // tune page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(4 + MROWS - index_tune), HMI_ValueStruct.Fan_speed); else // other page - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); } } -#endif +#endif // if HAS_FAN void HMI_PrintSpeed(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.print_speed += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.print_speed -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = Tune; EncoderRate.encoderRateEnabled = 0; - feedrate_percentage = HMI_ValueStruct.print_speed; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1+MROWS-index_tune), HMI_ValueStruct.print_speed); + feedrate_percentage = HMI_ValueStruct.print_speed; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1 + MROWS - index_tune), HMI_ValueStruct.print_speed); return; } // print_speed limit - NOMORE(HMI_ValueStruct.print_speed, max_print_speed); - NOLESS(HMI_ValueStruct.print_speed, min_print_speed); + NOMORE(HMI_ValueStruct.print_speed, MAX_PRINT_SPEED); + NOLESS(HMI_ValueStruct.print_speed, MIN_PRINT_SPEED); // print_speed value - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1+MROWS-index_tune), HMI_ValueStruct.print_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1 + MROWS - index_tune), HMI_ValueStruct.print_speed); } } void HMI_MaxFeedspeedXYZE(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Max_Feedspeed += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Max_Feedspeed -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = MaxSpeed; EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.feedspeed_flag == X_AXIS) planner.set_max_feedrate(X_AXIS, HMI_ValueStruct.Max_Feedspeed); + if (HMI_flag.feedspeed_flag == X_AXIS) planner.set_max_feedrate(X_AXIS, HMI_ValueStruct.Max_Feedspeed); else if (HMI_flag.feedspeed_flag == Y_AXIS) planner.set_max_feedrate(Y_AXIS, HMI_ValueStruct.Max_Feedspeed); else if (HMI_flag.feedspeed_flag == Z_AXIS) planner.set_max_feedrate(Z_AXIS, HMI_ValueStruct.Max_Feedspeed); #if HAS_HOTEND else if (HMI_flag.feedspeed_flag == E_AXIS) planner.set_max_feedrate(E_AXIS, HMI_ValueStruct.Max_Feedspeed); #endif - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); return; } - //MaxFeedspeed limit - if (HMI_flag.feedspeed_flag == X_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[X_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[X_AXIS]*2;} - else if (HMI_flag.feedspeed_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Y_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Y_AXIS]*2;} - else if (HMI_flag.feedspeed_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Z_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Z_AXIS]*2;} + // MaxFeedspeed limit + if (HMI_flag.feedspeed_flag == X_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[X_AXIS] * 2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[X_AXIS] * 2; } + else if (HMI_flag.feedspeed_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Y_AXIS] * 2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Y_AXIS] * 2; } + else if (HMI_flag.feedspeed_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[Z_AXIS] * 2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[Z_AXIS] * 2; } #if HAS_HOTEND - else if (HMI_flag.feedspeed_flag == E_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[E_AXIS]*2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[E_AXIS]*2;} + else if (HMI_flag.feedspeed_flag == E_AXIS) {if (HMI_ValueStruct.Max_Feedspeed > default_max_feedrate[E_AXIS] * 2) HMI_ValueStruct.Max_Feedspeed = default_max_feedrate[E_AXIS] * 2; } #endif - if (HMI_ValueStruct.Max_Feedspeed < min_MaxFeedspeed) HMI_ValueStruct.Max_Feedspeed = min_MaxFeedspeed; - //MaxFeedspeed value - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + if (HMI_ValueStruct.Max_Feedspeed < MIN_MAXFEEDSPEED) HMI_ValueStruct.Max_Feedspeed = MIN_MAXFEEDSPEED; + // MaxFeedspeed value + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); } } void HMI_MaxAccelerationXYZE(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) HMI_ValueStruct.Max_Acceleration += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) HMI_ValueStruct.Max_Acceleration -= EncoderRate.encoderMoveValue; + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Max_Acceleration += EncoderRate.encoderMoveValue;} + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Max_Acceleration -= EncoderRate.encoderMoveValue;} else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = MaxAcceleration; EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.acc_flag == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); + if (HMI_flag.acc_flag == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); else if (HMI_flag.acc_flag == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration); else if (HMI_flag.acc_flag == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration); #if HAS_HOTEND else if (HMI_flag.acc_flag == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); #endif - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); return; } // MaxAcceleration limit - if (HMI_flag.acc_flag == X_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[X_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[X_AXIS]*2;} - else if (HMI_flag.acc_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Y_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Y_AXIS]*2;} - else if (HMI_flag.acc_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Z_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Z_AXIS]*2;} + if (HMI_flag.acc_flag == X_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[X_AXIS] * 2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[X_AXIS] * 2; } + else if (HMI_flag.acc_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Y_AXIS] * 2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Y_AXIS] * 2; } + else if (HMI_flag.acc_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[Z_AXIS] * 2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[Z_AXIS] * 2; } #if HAS_HOTEND - else if (HMI_flag.acc_flag == E_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[E_AXIS]*2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[E_AXIS]*2;} + else if (HMI_flag.acc_flag == E_AXIS) {if (HMI_ValueStruct.Max_Acceleration > default_max_acceleration[E_AXIS] * 2) HMI_ValueStruct.Max_Acceleration = default_max_acceleration[E_AXIS] * 2; } #endif - if (HMI_ValueStruct.Max_Acceleration < min_MaxAcceleration) HMI_ValueStruct.Max_Acceleration = min_MaxAcceleration; + if (HMI_ValueStruct.Max_Acceleration < MIN_MAXACCELERATION) HMI_ValueStruct.Max_Acceleration = MIN_MAXACCELERATION; // MaxAcceleration value - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); } } void HMI_MaxCornerXYZE(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Max_Corner += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Max_Corner -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = MaxCorner; EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.corner_flag == X_AXIS) planner.set_max_jerk(X_AXIS, HMI_ValueStruct.Max_Corner/10); - else if (HMI_flag.corner_flag == Y_AXIS) planner.set_max_jerk(Y_AXIS, HMI_ValueStruct.Max_Corner/10); - else if (HMI_flag.corner_flag == Z_AXIS) planner.set_max_jerk(Z_AXIS, HMI_ValueStruct.Max_Corner/10); - else if (HMI_flag.corner_flag == E_AXIS) planner.set_max_jerk(E_AXIS, HMI_ValueStruct.Max_Corner/10); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + if (HMI_flag.corner_flag == X_AXIS) planner.set_max_jerk(X_AXIS, HMI_ValueStruct.Max_Corner / 10); + else if (HMI_flag.corner_flag == Y_AXIS) planner.set_max_jerk(Y_AXIS, HMI_ValueStruct.Max_Corner / 10); + else if (HMI_flag.corner_flag == Z_AXIS) planner.set_max_jerk(Z_AXIS, HMI_ValueStruct.Max_Corner / 10); + else if (HMI_flag.corner_flag == E_AXIS) planner.set_max_jerk(E_AXIS, HMI_ValueStruct.Max_Corner / 10); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); return; } - //MaxCorner limit - if (HMI_flag.corner_flag == X_AXIS) {if (HMI_ValueStruct.Max_Corner > default_max_jerk[X_AXIS]*2*MinUnitMult) HMI_ValueStruct.Max_Corner = default_max_jerk[X_AXIS]*2*MinUnitMult;} - else if (HMI_flag.corner_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Corner > default_max_jerk[Y_AXIS]*2*MinUnitMult) HMI_ValueStruct.Max_Corner = default_max_jerk[Y_AXIS]*2*MinUnitMult;} - else if (HMI_flag.corner_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Corner > default_max_jerk[Z_AXIS]*2*MinUnitMult) HMI_ValueStruct.Max_Corner = default_max_jerk[Z_AXIS]*2*MinUnitMult;} - else if (HMI_flag.corner_flag == E_AXIS) {if (HMI_ValueStruct.Max_Corner > default_max_jerk[E_AXIS]*2*MinUnitMult) HMI_ValueStruct.Max_Corner = default_max_jerk[E_AXIS]*2*MinUnitMult;} - if (HMI_ValueStruct.Max_Corner < min_MaxCorner*MinUnitMult) HMI_ValueStruct.Max_Corner = min_MaxCorner*MinUnitMult; - //MaxCorner value - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + // MaxCorner limit + if (HMI_flag.corner_flag == X_AXIS) + NOMORE(HMI_ValueStruct.Max_Corner, default_max_jerk[X_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.corner_flag == Y_AXIS) + NOMORE(HMI_ValueStruct.Max_Corner, default_max_jerk[Y_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.corner_flag == Z_AXIS) + NOMORE(HMI_ValueStruct.Max_Corner, default_max_jerk[Z_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.corner_flag == E_AXIS) + NOMORE(HMI_ValueStruct.Max_Corner, default_max_jerk[E_AXIS] * 2 * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Corner, (MIN_MAXCORNER) * MINUNITMULT); + // MaxCorner value + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); } } void HMI_StepXYZE(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { HMI_ValueStruct.Max_Step += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { HMI_ValueStruct.Max_Step -= EncoderRate.encoderMoveValue; + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { // return checkkey = Step; EncoderRate.encoderRateEnabled = 0; - if (HMI_flag.step_flag == X_AXIS) planner.settings.axis_steps_per_mm[X_AXIS] = HMI_ValueStruct.Max_Step/10; - else if (HMI_flag.step_flag == Y_AXIS) planner.settings.axis_steps_per_mm[Y_AXIS] = HMI_ValueStruct.Max_Step/10; - else if (HMI_flag.step_flag == Z_AXIS) planner.settings.axis_steps_per_mm[Z_AXIS] = HMI_ValueStruct.Max_Step/10; - else if (HMI_flag.step_flag == E_AXIS) planner.settings.axis_steps_per_mm[E_AXIS] = HMI_ValueStruct.Max_Step/10; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + if (HMI_flag.step_flag == X_AXIS) planner.settings.axis_steps_per_mm[X_AXIS] = HMI_ValueStruct.Max_Step / 10; + else if (HMI_flag.step_flag == Y_AXIS) planner.settings.axis_steps_per_mm[Y_AXIS] = HMI_ValueStruct.Max_Step / 10; + else if (HMI_flag.step_flag == Z_AXIS) planner.settings.axis_steps_per_mm[Z_AXIS] = HMI_ValueStruct.Max_Step / 10; + else if (HMI_flag.step_flag == E_AXIS) planner.settings.axis_steps_per_mm[E_AXIS] = HMI_ValueStruct.Max_Step / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); return; } - //Step limit - if (HMI_flag.step_flag == X_AXIS) {if (HMI_ValueStruct.Max_Step > default_axis_steps_per_unit[X_AXIS]*2*MinUnitMult) HMI_ValueStruct.Max_Step = default_axis_steps_per_unit[X_AXIS]*2*MinUnitMult;} - else if (HMI_flag.step_flag == Y_AXIS) {if (HMI_ValueStruct.Max_Step > default_axis_steps_per_unit[Y_AXIS]*2*MinUnitMult) HMI_ValueStruct.Max_Step = default_axis_steps_per_unit[Y_AXIS]*2*MinUnitMult;} - else if (HMI_flag.step_flag == Z_AXIS) {if (HMI_ValueStruct.Max_Step > default_axis_steps_per_unit[Z_AXIS]*2*MinUnitMult) HMI_ValueStruct.Max_Step = default_axis_steps_per_unit[Z_AXIS]*2*MinUnitMult;} - else if (HMI_flag.step_flag == E_AXIS) {if (HMI_ValueStruct.Max_Step > default_axis_steps_per_unit[E_AXIS]*2*MinUnitMult) HMI_ValueStruct.Max_Step = default_axis_steps_per_unit[E_AXIS]*2*MinUnitMult;} - if (HMI_ValueStruct.Max_Step < min_Step) HMI_ValueStruct.Max_Step = min_Step; - //Step value - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + // Step limit + if (HMI_flag.step_flag == X_AXIS) + NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[X_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.step_flag == Y_AXIS) + NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[Y_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.step_flag == Z_AXIS) + NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[Z_AXIS] * 2 * MINUNITMULT); + else if (HMI_flag.step_flag == E_AXIS) + NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[E_AXIS] * 2 * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); + // Step value + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); } } void update_variable(void) { /* Tune page temperature update */ if (checkkey == Tune) { - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2+MROWS-index_tune), thermalManager.temp_hotend[0].target); - } - if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3+MROWS-index_tune), thermalManager.temp_bed.target); - } + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2 + MROWS - index_tune), thermalManager.temp_hotend[0].target); + if (last_temp_bed_target != thermalManager.temp_bed.target) + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3 + MROWS - index_tune), thermalManager.temp_bed.target); if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(4+MROWS-index_tune), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(4 + MROWS - index_tune), thermalManager.fan_speed[0]); last_fan_speed = thermalManager.fan_speed[0]; } } /* Temperature page temperature update */ if (checkkey == TemperatureID) { - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); - } - if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), thermalManager.temp_bed.target); - } + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + if (last_temp_bed_target != thermalManager.temp_bed.target) + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), thermalManager.temp_bed.target); if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), thermalManager.fan_speed[0]); last_fan_speed = thermalManager.fan_speed[0]; } } /* Bottom temperature update */ if (last_temp_hotend_current != thermalManager.temp_hotend[0].celsius) { - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); last_temp_hotend_current = thermalManager.temp_hotend[0].celsius; } if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 33+4*STAT_CHR_W+6, 382, thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); last_temp_hotend_target = thermalManager.temp_hotend[0].target; } if (last_temp_bed_current != thermalManager.temp_bed.celsius) { - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); last_temp_bed_current = thermalManager.temp_bed.celsius; } if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 178+4*STAT_CHR_W+6, 382, thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); last_temp_bed_target = thermalManager.temp_bed.target; } if (last_speed != feedrate_percentage) { - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 33+2*STAT_CHR_W, 429, feedrate_percentage); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); last_speed = feedrate_percentage; } #if HAS_LEVELING if (last_probe_zoffset != probe.offset.z) { - show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178+STAT_CHR_W, 429, probe.offset.z*100); + show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, probe.offset.z * 100); last_probe_zoffset = probe.offset.z; } #else if (last_zoffset != zprobe_zoffset) { - show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178+STAT_CHR_W, 429, zprobe_zoffset*100); + show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, zprobe_zoffset * 100); last_zoffset = zprobe_zoffset; } #endif } /** - * Read and cache the working directory. - * - * TODO: New code can follow the pattern of menu_media.cpp - * and rely on Marlin caching for performance. No need to - * cache files here. - * - */ +* Read and cache the working directory. +* +* TODO: New code can follow the pattern of menu_media.cpp +* and rely on Marlin caching for performance. No need to +* cache files here. +* +*/ #ifndef strcasecmp_P -#define strcasecmp_P(a, b) strcasecmp((a), (b)) + #define strcasecmp_P(a, b) strcasecmp((a), (b)) #endif inline void make_name_without_ext(char *dst, char *src, int maxlen=MENU_CHAR_LIMIT) { char * const name = card.longest_filename(); - size_t pos = strlen(name); // index of ending nul + size_t pos = strlen(name); // index of ending nul // For files, remove the extension // which may be .gcode, .gco, or .g if (!card.flag.filenameIsDir) while (pos && src[pos] != '.') pos--; // find last '.' (stop at 0) - int len = pos; // nul or '.' - if (len > maxlen) { // Keep the name short - pos = len = maxlen; // move nul down - dst[--pos] = '.'; // insert dots + int len = pos; // nul or '.' + if (len > maxlen) { // Keep the name short + pos = len = maxlen; // move nul down + dst[--pos] = '.'; // insert dots dst[--pos] = '.'; dst[--pos] = '.'; } - dst[len] = '\0'; // end it + dst[len] = '\0'; // end it // Copy down to 0 while (pos--) dst[pos] = src[pos]; @@ -1463,14 +1533,14 @@ inline void HMI_SDCardInit(void) { card.cdroot(); } void MarlinUI::refresh() { // The card was mounted or unmounted // or some other status change occurred - //DWIN_lcd_sd_status = false; // On next DWIN_Update - //HMI_SDCardUpdate(); + // DWIN_lcd_sd_status = false; // On next DWIN_Update + // HMI_SDCardUpdate(); } #define ICON_Folder ICON_More char shift_name[LONG_FILENAME_LENGTH + 1]; -int8_t shift_amt; // = 0 +int8_t shift_amt; // = 0 millis_t shift_ms; // = 0 // Init the shift name based on the highlighted item @@ -1486,15 +1556,15 @@ inline void Init_Shift_Name() { inline void Init_SDItem_Shift() { shift_amt = 0; - shift_ms = select_file.now > 0 && strlen(shift_name) > MENU_CHAR_LIMIT - ? millis() + 750UL : 0; + shift_ms = select_file.now > 0 && strlen(shift_name) > MENU_CHAR_LIMIT + ? millis() + 750UL : 0; } /** - * Display an SD item, adding a CDUP for subfolders. - */ +* Display an SD item, adding a CDUP for subfolders. +*/ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { - if (row < 0) row = item + 1 + MROWS-index_file; + if (row < 0) row = item + 1 + MROWS - index_file; const bool is_subdir = !card.flag.workDirIsRoot; if (is_subdir && item == 0) { Draw_Menu_Line(row, ICON_Folder, (char*)".."); @@ -1529,7 +1599,7 @@ inline void Draw_SDItem_Shifted(int8_t &shift) { const char c = shift_name[lastchar]; shift_name[lastchar] = '\0'; - const uint8_t row = select_file.now + MROWS-index_file; // skip "Back" and scroll + const uint8_t row = select_file.now + MROWS - index_file; // skip "Back" and scroll Erase_Menu_Text(row); Draw_Menu_Line(row, 0, &shift_name[shift]); @@ -1547,7 +1617,7 @@ inline void Redraw_SD_List() { // As many files as will fit LOOP_L_N(i, _MIN(nr_sd_menu_items(), MROWS)) - Draw_SDItem(i, i + 1); + Draw_SDItem(i, i + 1); Init_SDItem_Shift(); } @@ -1571,21 +1641,22 @@ void HMI_SDCardUpdate(void) { if (HMI_flag.home_flag) return; if (DWIN_lcd_sd_status != card.isMounted()) { DWIN_lcd_sd_status = card.isMounted(); - //SERIAL_ECHOLNPAIR("HMI_SDCardUpdate: ", int(DWIN_lcd_sd_status)); + // SERIAL_ECHOLNPAIR("HMI_SDCardUpdate: ", int(DWIN_lcd_sd_status)); if (card.isMounted()) { if (checkkey == SelectFile) Redraw_SD_List(); } else { // clean file icon - if (checkkey == SelectFile) + if (checkkey == SelectFile) { Redraw_SD_List(); + } else if (checkkey == PrintProcess || checkkey == Tune || printingIsActive()) { // TODO: Move card removed abort handling // to CardReader::manage_media. card.flag.abort_sd_printing = true; - wait_for_heatup = false; - abort_flag = true; + wait_for_heatup = false; + abort_flag = true; } } DWIN_UpdateLCD(); @@ -1598,26 +1669,26 @@ void HMI_StartFrame(const bool with_update) { DWIN_Draw_Rectangle(1, Background_black, 0, 360, 272, 479); - DWIN_ICON_Show(ICON,ICON_HotendTemp, 13, 381); + DWIN_ICON_Show(ICON, ICON_HotendTemp, 13, 381); #if HOTENDS > 1 - //DWIN_ICON_Show(ICON,ICON_HotendTemp, 13, 381); + // DWIN_ICON_Show(ICON,ICON_HotendTemp, 13, 381); #endif - DWIN_ICON_Show(ICON,ICON_BedTemp, 158, 381); - DWIN_ICON_Show(ICON,ICON_Speed, 13, 429); - DWIN_ICON_Show(ICON,ICON_Zoffset, 158, 428); + DWIN_ICON_Show(ICON, ICON_BedTemp, 158, 381); + DWIN_ICON_Show(ICON, ICON_Speed, 13, 429); + DWIN_ICON_Show(ICON, ICON_Zoffset, 158, 428); // Draw initial Status Area - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 33+4*STAT_CHR_W+6, 382, thermalManager.temp_hotend[0].target); - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 178+4*STAT_CHR_W+6, 382, thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178, 382, thermalManager.temp_bed.celsius); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); - DWIN_Draw_IntValue(true,true,0,STAT_FONT,White,Background_black, 3, 33+2*STAT_CHR_W, 429, feedrate_percentage); - DWIN_Draw_String(false,false,STAT_FONT,White,Background_black, 33+(2+3)*STAT_CHR_W+2, 429, (char*)"%"); + DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + (2 + 3) * STAT_CHR_W + 2, 429, (char*)"%"); show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178, 429, BABY_Z_VAR * 100); - DWIN_Draw_String(false,false,STAT_FONT,White,Background_black, 33+3*STAT_CHR_W+5, 383, (char*)"/"); - DWIN_Draw_String(false,false,STAT_FONT,White,Background_black, 178+3*STAT_CHR_W+5, 383, (char*)"/"); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 33 + 3 * STAT_CHR_W + 5, 383, (char*)"/"); + DWIN_Draw_String(false, false, STAT_FONT, White, Background_black, 178 + 3 * STAT_CHR_W + 5, 383, (char*)"/"); if (with_update) { DWIN_UpdateLCD(); @@ -1625,60 +1696,51 @@ void HMI_StartFrame(const bool with_update) { } } -#ifndef MACHINE_SIZE - #define MACHINE_SIZE "220x220x250" -#endif -#ifndef CORP_WEBSITE_C - #define CORP_WEBSITE_C "www.cxsw3d.com" -#endif -#ifndef CORP_WEBSITE_E - #define CORP_WEBSITE_E "www.creality.com" -#endif - inline void Draw_Info_Menu() { Clear_Main_Window(); - DWIN_Draw_String(false,false,font8x16,White,Background_black, (DWIN_WIDTH-strlen(MACHINE_SIZE)*MENU_CHR_W)/2, 122, (char*)MACHINE_SIZE); - DWIN_Draw_String(false,false,font8x16,White,Background_black, (DWIN_WIDTH-strlen(SHORT_BUILD_VERSION)*MENU_CHR_W)/2, 195, (char*)SHORT_BUILD_VERSION); + DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); + DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 30, 17, 271-214, 479-450, 14, 8); + DWIN_Frame_AreaCopy(1, 30, 17, 271 - 214, 479 - 450, 14, 8); - DWIN_Frame_AreaCopy(1, 197, 149, 271-19, 479-318, 108, 102); - DWIN_Frame_AreaCopy(1, 1, 164, 271-215, 479-303, 108, 175); - DWIN_Frame_AreaCopy(1, 58, 164, 271-158, 479-303, 105, 248); - DWIN_Draw_String(false,false,font8x16,White,Background_black, (DWIN_WIDTH-strlen(CORP_WEBSITE_C)*MENU_CHR_W)/2, 268, (char*)CORP_WEBSITE_C); + DWIN_Frame_AreaCopy(1, 197, 149, 271 - 19, 479 - 318, 108, 102); + DWIN_Frame_AreaCopy(1, 1, 164, 271 - 215, 479 - 303, 108, 175); + DWIN_Frame_AreaCopy(1, 58, 164, 271 - 158, 479 - 303, 105, 248); + DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_C); } else { #ifdef USE_STRING_HEADINGS Draw_Title("Info"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 190, 16, 271-56, 479-453, 14, 8); + DWIN_Frame_AreaCopy(1, 190, 16, 271 - 56, 479 - 453, 14, 8); #endif - DWIN_Frame_AreaCopy(1, 120, 150, 146, 479-318, 124, 102); - DWIN_Frame_AreaCopy(1, 146, 151, 271-17, 479-318, 82, 175); - DWIN_Frame_AreaCopy(1, 0, 165, 271-177, 479-304, 89, 248); - DWIN_Draw_String(false,false,font8x16,White,Background_black, (DWIN_WIDTH-strlen(CORP_WEBSITE_E)*MENU_CHR_W)/2, 268, (char*)CORP_WEBSITE_E); + DWIN_Frame_AreaCopy(1, 120, 150, 146, 479 - 318, 124, 102); + DWIN_Frame_AreaCopy(1, 146, 151, 271 - 17, 479 - 318, 82, 175); + DWIN_Frame_AreaCopy(1, 0, 165, 271 - 177, 479 - 304, 89, 248); + DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(CORP_WEBSITE_E) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_E); } Draw_Back_First(); LOOP_L_N(i, 3) { - DWIN_ICON_Show(ICON,ICON_PrintSize+i, 26, 99+i*73); - DWIN_Draw_Line(Line_Color, 16, MBASE(2)+i*73, 256, 156+i*73); + DWIN_ICON_Show(ICON, ICON_PrintSize + i, 26, 99 + i * 73); + DWIN_Draw_Line(Line_Color, 16, MBASE(2) + i * 73, 256, 156 + i * 73); } } inline void Draw_Print_File_Menu() { Clear_Title_Bar(); - if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 0, 31, 271-216, 479-435, 14, 8); + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 0, 31, 271 - 216, 479 - 435, 14, 8); + } else { #ifdef USE_STRING_HEADINGS Draw_Title("Print file"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 52, 31, 271-134, 479-438, 14, 8); // "Print file" + DWIN_Frame_AreaCopy(1, 52, 31, 271 - 134, 479 - 438, 14, 8); // "Print file" #endif } @@ -1781,45 +1843,46 @@ void HMI_SelectFile(void) { if (encoder_diffState == ENCODER_DIFF_CW && fullCnt) { if (select_file.inc(fullCnt)) { - const uint8_t itemnum = select_file.now - 1; // -1 for "Back" - if (shift_ms) { // If line was shifted - Erase_Menu_Text(select_file.now - 1 + MROWS-index_file); // Erase and - Draw_SDItem(itemnum - 1); // redraw + const uint8_t itemnum = select_file.now - 1; // -1 for "Back" + if (shift_ms) { // If line was shifted + Erase_Menu_Text(select_file.now - 1 + MROWS - index_file); // Erase and + Draw_SDItem(itemnum - 1); // redraw } - if (select_file.now > MROWS && select_file.now > index_file) { // Cursor past the bottom - index_file = select_file.now; // New bottom line + if (select_file.now > MROWS && select_file.now > index_file) { // Cursor past the bottom + index_file = select_file.now; // New bottom line Scroll_Menu(DWIN_SCROLL_UP); - Draw_SDItem(itemnum, MROWS); // Draw and init the shift name + Draw_SDItem(itemnum, MROWS); // Draw and init the shift name } else { - Move_Highlight(1, select_file.now+MROWS-index_file); // Just move highlight - Init_Shift_Name(); // ...and init the shift name + Move_Highlight(1, select_file.now + MROWS - index_file); // Just move highlight + Init_Shift_Name(); // ...and init the shift name } Init_SDItem_Shift(); } } else if (encoder_diffState == ENCODER_DIFF_CCW && fullCnt) { if (select_file.dec()) { - const uint8_t itemnum = select_file.now - 1; // -1 for "Back" - if (shift_ms) { // If line was shifted - Erase_Menu_Text(select_file.now + 1 + MROWS-index_file); // Erase and - Draw_SDItem(itemnum + 1); // redraw + const uint8_t itemnum = select_file.now - 1; // -1 for "Back" + if (shift_ms) { // If line was shifted + Erase_Menu_Text(select_file.now + 1 + MROWS - index_file); // Erase and + Draw_SDItem(itemnum + 1); // redraw } - if (select_file.now < index_file - MROWS) { // Cursor past the top - index_file--; // New bottom line + if (select_file.now < index_file - MROWS) { // Cursor past the top + index_file--; // New bottom line Scroll_Menu(DWIN_SCROLL_DOWN); if (index_file == MROWS) { Draw_Back_First(); shift_ms = 0; } - else - Draw_SDItem(itemnum, 0); // Draw the item (and init shift name) + else { + Draw_SDItem(itemnum, 0); // Draw the item (and init shift name) + } } else { - Move_Highlight(-1, select_file.now+MROWS-index_file); // Just move highlight - Init_Shift_Name(); // ...and init the shift name + Move_Highlight(-1, select_file.now + MROWS - index_file); // Just move highlight + Init_Shift_Name(); // ...and init the shift name } - Init_SDItem_Shift(); // Reset left. Init timer. + Init_SDItem_Shift(); // Reset left. Init timer. } } else if (encoder_diffState == ENCODER_DIFF_ENTER) { @@ -1848,8 +1911,8 @@ void HMI_SelectFile(void) { select_file.reset(); // Start choice and print SD file - HMI_flag.heat_flag = 1; - HMI_flag.print_finish = 0; + HMI_flag.heat_flag = 1; + HMI_flag.print_finish = 0; HMI_ValueStruct.show_mode = 0; card.openAndPrintFile(card.filename); @@ -1857,15 +1920,15 @@ void HMI_SelectFile(void) { #if FAN_COUNT > 0 // All fans on for Ender 3 v2 ? // The slicer should manage this for us. - //for (uint8_t i = 0; i < FAN_COUNT; i++) - // thermalManager.fan_speed[i] = FanOn; + // for (uint8_t i = 0; i < FAN_COUNT; i++) + // thermalManager.fan_speed[i] = FANON; #endif Goto_PrintProcess(); } } - HMI_SelectFileExit: - DWIN_UpdateLCD(); +HMI_SelectFileExit: + DWIN_UpdateLCD(); } /* Printing */ @@ -1876,7 +1939,7 @@ void HMI_Printing(void) { if (HMI_flag.confirm_flag) { if (encoder_diffState == ENCODER_DIFF_ENTER) { HMI_flag.confirm_flag = 0; - abort_flag = 1; + abort_flag = 1; } return; } @@ -1963,10 +2026,12 @@ void HMI_PauseOrStop(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (encoder_diffState == ENCODER_DIFF_CW) + if (encoder_diffState == ENCODER_DIFF_CW) { Draw_Select_Highlight(false); - else if (encoder_diffState == ENCODER_DIFF_CCW) + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { Draw_Select_Highlight(true); + } else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (select_print.now == 1) { // pause window if (HMI_flag.select_flag) { @@ -1984,11 +2049,11 @@ void HMI_PauseOrStop(void) { } else if (select_print.now == 2) { // stop window if (HMI_flag.select_flag) { - wait_for_heatup = false; // Stop waiting for heater + wait_for_heatup = false; // Stop waiting for heater #if 0 // TODO: In ExtUI or MarlinUI add a common stop event - //card.flag.abort_sd_printing = true; + // card.flag.abort_sd_printing = true; #else checkkey = Back_Main; // Wait for planner moves to finish! @@ -2004,8 +2069,9 @@ void HMI_PauseOrStop(void) { abort_flag = true; #endif } - else - Goto_PrintProcess(); // cancel stop + else { + Goto_PrintProcess(); // cancel stop + } } } DWIN_UpdateLCD(); @@ -2015,29 +2081,28 @@ inline void Draw_Move_Menu() { Clear_Main_Window(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 192, 1, 271-38, 479-465, 14, 8); - - DWIN_Frame_AreaCopy(1, 58, 118, 271-165, 479-347, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 109, 118, 271-114, 479-347, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 160, 118, 271-62, 479-347, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 212, 118, 271-18, 479-348, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 192, 1, 271 - 38, 479 - 465, 14, 8); + DWIN_Frame_AreaCopy(1, 58, 118, 271 - 165, 479 - 347, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 109, 118, 271 - 114, 479 - 347, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 160, 118, 271 - 62, 479 - 347, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 212, 118, 271 - 18, 479 - 348, LBLX, MBASE(4)); } else { #ifdef USE_STRING_HEADINGS Draw_Title("Move"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 231, 2, 271-6, 479-467, 14, 8); + DWIN_Frame_AreaCopy(1, 231, 2, 271 - 6, 479 - 467, 14, 8); #endif - draw_move_en(MBASE(1)); say_x(33+3, MBASE(1)); // "Move X" - draw_move_en(MBASE(2)); say_y(33+3, MBASE(2)); // "Move Y" - draw_move_en(MBASE(3)); say_z(33+3, MBASE(3)); // "Move Z" - DWIN_Frame_AreaCopy(1, 123, 192, 271-95, 479-277, LBLX, MBASE(4)); // "Extruder" + draw_move_en(MBASE(1)); say_x(33 + 3, MBASE(1)); // "Move X" + draw_move_en(MBASE(2)); say_y(33 + 3, MBASE(2)); // "Move Y" + draw_move_en(MBASE(3)); say_z(33 + 3, MBASE(3)); // "Move Z" + DWIN_Frame_AreaCopy(1, 123, 192, 271 - 95, 479 - 277, LBLX, MBASE(4)); // "Extruder" } Draw_Back_First(select_axis.now == 0); if (select_axis.now) Draw_Menu_Cursor(select_axis.now); - LOOP_L_N(i, MROWS) Draw_Menu_Line(i + 1, ICON_MoveX+i); + LOOP_L_N(i, MROWS) Draw_Menu_Line(i + 1, ICON_MoveX + i); } /* Prepare */ @@ -2053,38 +2118,40 @@ void HMI_Prepare(void) { // Scroll up and draw a blank bottom line Scroll_Menu(DWIN_SCROLL_UP); - Draw_Menu_Icon(MROWS, ICON_Axis+select_prepare.now-1); + Draw_Menu_Icon(MROWS, ICON_Axis + select_prepare.now - 1); // Draw "More" icon for sub-menus - if (index_prepare < 7) Draw_More_Icon(MROWS-index_prepare+1); + if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); - if (index_prepare == 6) Prepare_Item_ABS(MROWS); + if (index_prepare == 6) Prepare_Item_ABS(MROWS); else if (index_prepare == 7) Prepare_Item_Cool(MROWS); else if (index_prepare == 8) Prepare_Item_Lang(MROWS); } - else - Move_Highlight(1, select_prepare.now+MROWS-index_prepare); + else { + Move_Highlight(1, select_prepare.now + MROWS - index_prepare); + } } } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_prepare.dec()) { - if (select_prepare.now < index_prepare-MROWS) { + if (select_prepare.now < index_prepare - MROWS) { index_prepare--; Scroll_Menu(DWIN_SCROLL_DOWN); if (index_prepare == MROWS) Draw_Back_First(); else - Draw_Menu_Line(0, ICON_Axis+select_prepare.now-1); + Draw_Menu_Line(0, ICON_Axis + select_prepare.now - 1); - if (index_prepare < 7) Draw_More_Icon(MROWS-index_prepare+1); + if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); - if (index_prepare == 6) Prepare_Item_Move(0); + if (index_prepare == 6) Prepare_Item_Move(0); else if (index_prepare == 7) Prepare_Item_Disable(0); else if (index_prepare == 8) Prepare_Item_Home(0); } - else - Move_Highlight(-1, select_prepare.now+MROWS-index_prepare); + else { + Move_Highlight(-1, select_prepare.now + MROWS - index_prepare); + } } } else if (encoder_diffState == ENCODER_DIFF_ENTER) { @@ -2100,10 +2167,10 @@ void HMI_Prepare(void) { queue.inject_P(PSTR("G92 E0")); current_position.e = HMI_ValueStruct.Move_E_scale = 0; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(1), current_position[X_AXIS]*MinUnitMult); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(2), current_position[Y_AXIS]*MinUnitMult); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(3), current_position[Z_AXIS]*MinUnitMult); - show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), current_position.e*MinUnitMult); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), current_position[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), current_position[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), current_position[Z_AXIS] * MINUNITMULT); + show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), current_position.e * MINUNITMULT); break; case 2: // close motion queue.inject_P(PSTR("M84")); @@ -2117,9 +2184,9 @@ void HMI_Prepare(void) { case 4: // Z-offset #if HAS_LEVELING checkkey = Homeoffset; - HMI_ValueStruct.show_mode = -4; + HMI_ValueStruct.show_mode = -4; HMI_ValueStruct.offset_value = probe.offset.z * 100; - show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(4+MROWS-index_prepare), HMI_ValueStruct.offset_value); + show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(4 + MROWS - index_prepare), HMI_ValueStruct.offset_value); EncoderRate.encoderRateEnabled = 1; #else // Apply workspace offset, making the current position 0,0,0 @@ -2166,45 +2233,45 @@ void Draw_Temperature_Menu() { Clear_Main_Window(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 236, 2, 271-8, 479-466, 14, 8); + DWIN_Frame_AreaCopy(1, 236, 2, 271 - 8, 479 - 466, 14, 8); - DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 100, 89, 271-93, 479-378, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 180, 89, 271-11, 479-379, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 115, 134, 271 - 101, 479 - 333, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 100, 89, 271 - 93, 479 - 378, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 180, 89, 271 - 11, 479 - 379, LBLX, MBASE(5)); } else { #ifdef USE_STRING_HEADINGS Draw_Title("Temperature"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8); + DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); #endif - DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX, MBASE(1)); // Nozzle... - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+41+3, MBASE(1)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX, MBASE(2)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+3, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX, MBASE(3)); // Fan speed - DWIN_Frame_AreaCopy(1, 107, 76, 271-115, 479-393, LBLX, MBASE(4)); // Preheat... - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX+49+3, MBASE(4)); // ...PLA - DWIN_Frame_AreaCopy(1, 131, 119, 271-89, 479-347, LBLX+49+24+6, MBASE(4)); // PLA setting - DWIN_Frame_AreaCopy(1, 107, 76, 271-115, 479-393, LBLX, MBASE(5)); // Preheat... - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX+49+3, MBASE(5)); // ...ABS - DWIN_Frame_AreaCopy(1, 131, 119, 271-89, 479-347, LBLX+49+3+26+3, MBASE(5)); // ABS setting + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(1)); // Nozzle... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(1)); // ...Temperature + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(2)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(2)); // ...Temperature + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(3)); // Fan speed + DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(4)); // Preheat... + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX + 49 + 3, MBASE(4)); // ...PLA + DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 24 + 6, MBASE(4)); // PLA setting + DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(5)); // Preheat... + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 49 + 3, MBASE(5)); // ...ABS + DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 3 + 26 + 3, MBASE(5)); // ABS setting } Draw_Back_First(select_temp.now == 0); if (select_temp.now) Draw_Menu_Cursor(select_temp.now); - LOOP_L_N(i, 5) Draw_Menu_Line(i + 1, ICON_SetEndTemp+i); + LOOP_L_N(i, 5) Draw_Menu_Line(i + 1, ICON_SetEndTemp + i); Draw_More_Icon(4); Draw_More_Icon(5); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), thermalManager.temp_bed.target); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), thermalManager.fan_speed[0]); } /* Control */ @@ -2219,35 +2286,37 @@ void HMI_Control(void) { if (select_control.now > MROWS && select_control.now > index_control) { index_control = select_control.now; Scroll_Menu(DWIN_SCROLL_UP); - Draw_Menu_Icon(MROWS, ICON_Temperature+select_control.now-1); - Draw_More_Icon(1+MROWS-index_control); // Temperature > - Draw_More_Icon(2+MROWS-index_control); // Motion > + Draw_Menu_Icon(MROWS, ICON_Temperature + select_control.now - 1); + Draw_More_Icon(1 + MROWS - index_control); // Temperature > + Draw_More_Icon(2 + MROWS - index_control); // Motion > if (index_control > MROWS) { - Draw_More_Icon(6+MROWS-index_control); // Info > + Draw_More_Icon(6 + MROWS - index_control); // Info > if (HMI_flag.language_flag) - DWIN_Frame_AreaCopy(1, 231, 104, 271-13, 479-363, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 231, 104, 271 - 13, 479 - 363, LBLX, MBASE(5)); else - DWIN_Frame_AreaCopy(1, 0, 104, 271-247, 479-365, LBLX, MBASE(5)); + DWIN_Frame_AreaCopy(1, 0, 104, 271 - 247, 479 - 365, LBLX, MBASE(5)); } } - else - Move_Highlight(1, select_control.now+MROWS-index_control); + else { + Move_Highlight(1, select_control.now + MROWS - index_control); + } } } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_control.dec()) { - if (select_control.now < index_control-MROWS) { + if (select_control.now < index_control - MROWS) { index_control--; Scroll_Menu(DWIN_SCROLL_DOWN); if (index_control == MROWS) Draw_Back_First(); else - Draw_Menu_Line(0, ICON_Temperature+select_control.now-1); - Draw_More_Icon(0+MROWS-index_control+1); // Temperature > - Draw_More_Icon(1+MROWS-index_control+1); // Motion > + Draw_Menu_Line(0, ICON_Temperature + select_control.now - 1); + Draw_More_Icon(0 + MROWS - index_control + 1); // Temperature > + Draw_More_Icon(1 + MROWS - index_control + 1); // Motion > + } + else { + Move_Highlight(-1, select_control.now + MROWS - index_control); } - else - Move_Highlight(-1, select_control.now+MROWS-index_control); } } else if (encoder_diffState == ENCODER_DIFF_ENTER) { @@ -2272,14 +2341,15 @@ void HMI_Control(void) { buzzer.tone(100, 659); buzzer.tone(100, 698); } - else buzzer.tone(20, 440); + else + buzzer.tone(20, 440); break; case 4: // read EEPROM - if (settings.load()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else buzzer.tone(20, 440); + if (settings.load()) { + buzzer.tone(100, 659); + buzzer.tone(100, 698); + } + else {buzzer.tone(20, 440);} break; case 5: // resume EEPROM settings.reset(); @@ -2318,9 +2388,9 @@ void HMI_AxisMove(void) { HMI_flag.ETempTooLow_flag = 0; Draw_Move_Menu(); current_position.e = HMI_ValueStruct.Move_E_scale = 0; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); DWIN_UpdateLCD(); } @@ -2345,39 +2415,39 @@ void HMI_AxisMove(void) { break; case 1: // X axis move checkkey = Move_X; - HMI_ValueStruct.Move_X_scale = current_position[X_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + HMI_ValueStruct.Move_X_scale = current_position[X_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); EncoderRate.encoderRateEnabled = 1; break; case 2: // Y axis move checkkey = Move_Y; - HMI_ValueStruct.Move_Y_scale = current_position[Y_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + HMI_ValueStruct.Move_Y_scale = current_position[Y_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); EncoderRate.encoderRateEnabled = 1; break; case 3: // Z axis move checkkey = Move_Z; - HMI_ValueStruct.Move_Z_scale = current_position[Z_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + HMI_ValueStruct.Move_Z_scale = current_position[Z_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); EncoderRate.encoderRateEnabled = 1; break; - #if HAS_HOTEND - case 4: // Extruder - // window tips - #ifdef PREVENT_COLD_EXTRUSION - if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) { - HMI_flag.ETempTooLow_flag = 1; - Popup_Window_ETempTooLow(); - DWIN_UpdateLCD(); - return; - } - #endif - checkkey = Extruder; - HMI_ValueStruct.Move_E_scale = current_position.e*MinUnitMult; - show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - EncoderRate.encoderRateEnabled = 1; - break; - #endif + #if HAS_HOTEND + case 4: // Extruder + // window tips + #ifdef PREVENT_COLD_EXTRUSION + if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) { + HMI_flag.ETempTooLow_flag = 1; + Popup_Window_ETempTooLow(); + DWIN_UpdateLCD(); + return; + } + #endif + checkkey = Extruder; + HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; + show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + EncoderRate.encoderRateEnabled = 1; + break; + #endif } } DWIN_UpdateLCD(); @@ -2403,132 +2473,131 @@ void HMI_Temperature(void) { index_control = MROWS; Draw_Control_Menu(); break; - #if HAS_HOTEND - case 1: // nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_HEATED_BED - case 2: // bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_FAN - case 3: // fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_HOTEND - case 4: // PLA preheat setting + #if HAS_HOTEND + case 1: // nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HEATED_BED + case 2: // bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_FAN + case 3: // fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HOTEND + case 4: // PLA preheat setting + checkkey = PLAPreheat; + select_PLA.reset(); + HMI_ValueStruct.show_mode = -2; + + Clear_Main_Window(); + + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 59, 16, 271 - 132, 479 - 450, 14, 8); + + DWIN_Frame_AreaCopy(1, 100, 89, 124, 479 - 378, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX + 24, MBASE(1)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 100, 89, 124, 479 - 378, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX + 24, MBASE(2)); // PLA bed temp + DWIN_Frame_AreaCopy(1, 100, 89, 124, 479 - 378, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 115, 134, 271 - 101, 479 - 333, LBLX + 24, MBASE(3)); // PLA fan speed + DWIN_Frame_AreaCopy(1, 72, 148, 271 - 120, 479 - 317, LBLX, MBASE(4)); // save PLA configuration + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("PLA Settings"); // TODO: GET_TEXT_F + #else + DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); + #endif + + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // PLA bed temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // PLA fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); // save PLA configuration + } - checkkey = PLAPreheat; - select_PLA.reset(); - HMI_ValueStruct.show_mode = -2; - - Clear_Main_Window(); - - if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 59, 16, 271-132, 479-450, 14, 8); - - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2)); // PLA bed temp - DWIN_Frame_AreaCopy(1, 100, 89, 124, 479-378, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4)); // save PLA configuration - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("PLA Settings"); // TODO: GET_TEXT_F - #else - DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8); - #endif + Draw_Back_First(); - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(2)+3); - DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3); - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // PLA bed temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479-393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4)); // save PLA configuration - } + Draw_Menu_Line(1, ICON_SetEndTemp); + Draw_Menu_Line(2, ICON_SetBedTemp); + Draw_Menu_Line(3, ICON_FanSpeed); + Draw_Menu_Line(4, ICON_WriteEEPROM); - Draw_Back_First(); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); - Draw_Menu_Line(1, ICON_SetEndTemp); - Draw_Menu_Line(2, ICON_SetBedTemp); - Draw_Menu_Line(3, ICON_FanSpeed); - Draw_Menu_Line(4, ICON_WriteEEPROM); + break; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); + case 5: // ABS preheat setting + checkkey = ABSPreheat; + select_ABS.reset(); + HMI_ValueStruct.show_mode = -3; - break; - case 5: // ABS preheat setting + Clear_Main_Window(); - checkkey = ABSPreheat; - select_ABS.reset(); - HMI_ValueStruct.show_mode = -3; - - Clear_Main_Window(); - - if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 142, 16, 271-48, 479-450, 14, 8); - - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 134, 271-215, 479-333, LBLX+24, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 58, 134, 271-158, 479-333, LBLX+24, MBASE(2)); // ABS bed temp - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 115, 134, 271-101, 479-333, LBLX+24, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 72, 148, 271-120, 479-317, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 180, 89, 204, 479-379, LBLX+28, MBASE(4)+2); // save ABS configuration - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("ABS Settings"); // TODO: GET_TEXT_F - #else - DWIN_Frame_AreaCopy(1, 56, 16, 271-130, 479-450-1, 14, 8); - #endif + if (HMI_flag.language_flag) { + DWIN_Frame_AreaCopy(1, 142, 16, 271 - 48, 479 - 450, 14, 8); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271-33, 479-365, LBLX+24+3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+41+6, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(2)+3); - DWIN_Frame_AreaCopy(1, 240, 104, 271-7, 479-365, LBLX+24+3, MBASE(2)+3); - DWIN_Frame_AreaCopy(1, 1, 89, 271-188, 479-377-1, LBLX+24+24+6, MBASE(2)+3); // ABS bed temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271-207, 479-347, LBLX+24+3, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271-42, 479-301-1, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479-393, LBLX+33, MBASE(4)); // save ABS configuration - } + DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX + 24, MBASE(1)); // ABS nozzle temp + DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX + 24, MBASE(2)); // ABS bed temp + DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 115, 134, 271 - 101, 479 - 333, LBLX + 24, MBASE(3)); // ABS fan speed + DWIN_Frame_AreaCopy(1, 72, 148, 271 - 120, 479 - 317, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX + 28, MBASE(4) + 2); // save ABS configuration + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("ABS Settings"); // TODO: GET_TEXT_F + #else + DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); + #endif + + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // ABS nozzle temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // ABS bed temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // ABS fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 33, MBASE(4)); // save ABS configuration + } - Draw_Back_First(); + Draw_Back_First(); - Draw_Menu_Line(1, ICON_SetEndTemp); - Draw_Menu_Line(2, ICON_SetBedTemp); - Draw_Menu_Line(3, ICON_FanSpeed); - Draw_Menu_Line(4, ICON_WriteEEPROM); + Draw_Menu_Line(1, ICON_SetEndTemp); + Draw_Menu_Line(2, ICON_SetBedTemp); + Draw_Menu_Line(3, ICON_FanSpeed); + Draw_Menu_Line(4, ICON_WriteEEPROM); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); - break; - #endif + break; + #endif // if HAS_HOTEND } } DWIN_UpdateLCD(); @@ -2538,187 +2607,187 @@ inline void Draw_Max_Speed_Menu() { Clear_Main_Window(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 1, 16, 271-243, 479-451, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); auto say_max_speed = [](const uint16_t row) { - DWIN_Frame_AreaCopy(1, 173, 133, 228, 479-332, LBLX, row); // "Max speed" + DWIN_Frame_AreaCopy(1, 173, 133, 228, 479 - 332, LBLX, row); // "Max speed" }; - say_max_speed(MBASE(1)); // "Max speed" - DWIN_Frame_AreaCopy(1, 229, 133, 236, 479-332, LBLX+55+3, MBASE(1)); // X - say_max_speed(MBASE(2)); // "Max speed" - DWIN_Frame_AreaCopy(1, 1, 150, 271-264, 479-319, LBLX+55+3, MBASE(2)+3); // Y - say_max_speed(MBASE(3)); // "Max speed" - DWIN_Frame_AreaCopy(1, 9, 150, 271-255, 479-319, LBLX+55+3, MBASE(3)+3); // Z - say_max_speed(MBASE(4)); // "Max speed" - DWIN_Frame_AreaCopy(1, 18, 150, 271-246, 479-319, LBLX+55+3, MBASE(4)+3); // E + say_max_speed(MBASE(1)); // "Max speed" + DWIN_Frame_AreaCopy(1, 229, 133, 236, 479 - 332, LBLX + 55 + 3, MBASE(1)); // X + say_max_speed(MBASE(2)); // "Max speed" + DWIN_Frame_AreaCopy(1, 1, 150, 271 - 264, 479 - 319, LBLX + 55 + 3, MBASE(2) + 3); // Y + say_max_speed(MBASE(3)); // "Max speed" + DWIN_Frame_AreaCopy(1, 9, 150, 271 - 255, 479 - 319, LBLX + 55 + 3, MBASE(3) + 3); // Z + say_max_speed(MBASE(4)); // "Max speed" + DWIN_Frame_AreaCopy(1, 18, 150, 271 - 246, 479 - 319, LBLX + 55 + 3, MBASE(4) + 3); // E } else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 144, 16, 271-82, 479-453, 14, 8); + DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); #endif - draw_max_en(MBASE(1)); // "Max" - DWIN_Frame_AreaCopy(1, 184, 119, 271-37, 479-347, LBLX+24+3, MBASE(1)); // "Speed X" + draw_max_en(MBASE(1)); // "Max" + DWIN_Frame_AreaCopy(1, 184, 119, 271 - 37, 479 - 347, LBLX + 24 + 3, MBASE(1)); // "Speed X" - draw_max_en(MBASE(2)); // "Max" - draw_speed_en(24+3, MBASE(2)); // "Speed" - say_y(24+40+6, MBASE(2)); // "Y" + draw_max_en(MBASE(2)); // "Max" + draw_speed_en(24 + 3, MBASE(2)); // "Speed" + say_y(24 + 40 + 6, MBASE(2)); // "Y" - draw_max_en(MBASE(3)); // "Max" - draw_speed_en(24+3, MBASE(3)); // "Speed" - say_z(24+40+6, MBASE(3)); // "Z" + draw_max_en(MBASE(3)); // "Max" + draw_speed_en(24 + 3, MBASE(3)); // "Speed" + say_z(24 + 40 + 6, MBASE(3)); // "Z" - draw_max_en(MBASE(4)); // "Max" - draw_speed_en(24+3, MBASE(4)); // "Speed" - say_e(24+40+6, MBASE(4)); // "E" + draw_max_en(MBASE(4)); // "Max" + draw_speed_en(24 + 3, MBASE(4)); // "Speed" + say_e(24 + 40 + 6, MBASE(4)); // "E" } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeedX+i); + LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeedX + i); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(1), planner.settings.max_feedrate_mm_s[X_AXIS]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(2), planner.settings.max_feedrate_mm_s[Y_AXIS]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(3), planner.settings.max_feedrate_mm_s[Z_AXIS]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(4), planner.settings.max_feedrate_mm_s[E_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(1), planner.settings.max_feedrate_mm_s[X_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(2), planner.settings.max_feedrate_mm_s[Y_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(3), planner.settings.max_feedrate_mm_s[Z_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(4), planner.settings.max_feedrate_mm_s[E_AXIS]); } inline void Draw_Max_Accel_Menu() { Clear_Main_Window(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 1, 16, 271-243, 479-451, 14, 8); - - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 28, 149, 271-202, 479-318, LBLX+27, MBASE(1)+1); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 479-332, LBLX+27+41+3, MBASE(1)); // max acceleration X - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 28, 149, 271-202, 479-318, LBLX+27, MBASE(2)+1); - DWIN_Frame_AreaCopy(1, 1, 150, 271-264, 479-319, LBLX+27+41+3, MBASE(2)+2); // max acceleration Y - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 28, 149, 271-202, 479-318, LBLX+27, MBASE(3)+1); - DWIN_Frame_AreaCopy(1, 9, 150, 271-255, 479-319, LBLX+27+41+3, MBASE(3)+2); // max acceleration Z - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 28, 149, 271-202, 479-318, LBLX+27, MBASE(4)+1); - DWIN_Frame_AreaCopy(1, 18, 150, 271-246, 479-319, LBLX+27+41+3, MBASE(4)+2); // max acceleration E + DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); + + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(1) + 1); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 479 - 332, LBLX + 27 + 41 + 3, MBASE(1)); // max acceleration X + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(2) + 1); + DWIN_Frame_AreaCopy(1, 1, 150, 271 - 264, 479 - 319, LBLX + 27 + 41 + 3, MBASE(2) + 2); // max acceleration Y + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(3) + 1); + DWIN_Frame_AreaCopy(1, 9, 150, 271 - 255, 479 - 319, LBLX + 27 + 41 + 3, MBASE(3) + 2); // max acceleration Z + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 28, 149, 271 - 202, 479 - 318, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 18, 150, 271 - 246, 479 - 319, LBLX + 27 + 41 + 3, MBASE(4) + 2); // max acceleration E } else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Accel (mm/s/s)"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 144, 16, 271-82, 479-453, 14, 8); + DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); #endif - draw_max_accel_en(MBASE(1)); say_x(24+78+6, MBASE(1)); // "Max Acceleration X" - draw_max_accel_en(MBASE(2)); say_y(24+78+6, MBASE(2)); // "Max Acceleration Y" - draw_max_accel_en(MBASE(3)); say_z(24+78+6, MBASE(3)); // "Max Acceleration Z" - draw_max_accel_en(MBASE(4)); say_e(24+78+6, MBASE(4)); // "Max Acceleration E" + draw_max_accel_en(MBASE(1)); say_x(24 + 78 + 6, MBASE(1)); // "Max Acceleration X" + draw_max_accel_en(MBASE(2)); say_y(24 + 78 + 6, MBASE(2)); // "Max Acceleration Y" + draw_max_accel_en(MBASE(3)); say_z(24 + 78 + 6, MBASE(3)); // "Max Acceleration Z" + draw_max_accel_en(MBASE(4)); say_e(24 + 78 + 6, MBASE(4)); // "Max Acceleration E" } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxAccX+i); + LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxAccX + i); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(1), planner.settings.max_acceleration_mm_per_s2[X_AXIS]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(2), planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(3), planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); - DWIN_Draw_IntValue(true,true,0,font8x16,White,Background_black, 4, 210, MBASE(4), planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(1), planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(2), planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(3), planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Background_black, 4, 210, MBASE(4), planner.settings.max_acceleration_mm_per_s2[E_AXIS]); } inline void Draw_Max_Jerk_Menu() { Clear_Main_Window(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 1, 16, 271-243, 479-451, 14, 8); - - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 180, 271-243, 479-287, LBLX+27, MBASE(1)+1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479-332, LBLX+53, MBASE(1)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 479-332, LBLX+80+3, MBASE(1)); // max corner speed X - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 180, 271-243, 479-287, LBLX+27, MBASE(2)+1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479-332, LBLX+53, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 150, 271-264, 479-319, LBLX+80+3, MBASE(2)+3); // max corner speed Y - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 1, 180, 271-243, 479-287, LBLX+27, MBASE(3)+1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479-332, LBLX+53, MBASE(3)); - DWIN_Frame_AreaCopy(1, 9, 150, 271-255, 479-319, LBLX+80+3, MBASE(3)+3); // max corner speed Z - DWIN_Frame_AreaCopy(1, 173, 133, 200, 479-332, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 1, 180, 271-243, 479-287, LBLX+27, MBASE(4)+1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 479-332, LBLX+53, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 271-246, 479-319, LBLX+80+3, MBASE(4)+3); // max corner speed E + DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); + + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(1) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 53, MBASE(1)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 479 - 332, LBLX + 80 + 3, MBASE(1)); // max corner speed X + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(2) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 53, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 150, 271 - 264, 479 - 319, LBLX + 80 + 3, MBASE(2) + 3); // max corner speed Y + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(3) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 53, MBASE(3)); + DWIN_Frame_AreaCopy(1, 9, 150, 271 - 255, 479 - 319, LBLX + 80 + 3, MBASE(3) + 3); // max corner speed Z + DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 1, 180, 271 - 243, 479 - 287, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 479 - 332, LBLX + 53, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 271 - 246, 479 - 319, LBLX + 80 + 3, MBASE(4) + 3); // max corner speed E } else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Corner"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 144, 16, 271-82, 479-453, 14, 8); + DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); #endif - draw_max_en(MBASE(1)); // "Max" - draw_corner_en(MBASE(1)); // "Corner" - draw_speed_en(66+6, MBASE(1)); // "Speed" - say_x(106+9, MBASE(1)); // "X" + draw_max_en(MBASE(1)); // "Max" + draw_corner_en(MBASE(1)); // "Corner" + draw_speed_en(66 + 6, MBASE(1)); // "Speed" + say_x(106 + 9, MBASE(1)); // "X" - draw_max_en(MBASE(2)); // "Max" - draw_corner_en(MBASE(2)); // "Corner" - draw_speed_en(66+6, MBASE(2)); // "Speed" - say_y(106+9, MBASE(2)); // "Y" + draw_max_en(MBASE(2)); // "Max" + draw_corner_en(MBASE(2)); // "Corner" + draw_speed_en(66 + 6, MBASE(2)); // "Speed" + say_y(106 + 9, MBASE(2)); // "Y" - draw_max_en(MBASE(3)); // "Max" - draw_corner_en(MBASE(3)); // "Corner" - draw_speed_en(66+6, MBASE(3)); // "Speed" - say_z(106+9, MBASE(3)); // "Z" + draw_max_en(MBASE(3)); // "Max" + draw_corner_en(MBASE(3)); // "Corner" + draw_speed_en(66 + 6, MBASE(3)); // "Speed" + say_z(106 + 9, MBASE(3)); // "Z" - draw_max_en(MBASE(4)); // "Max" - draw_corner_en(MBASE(4)); // "Corner" - draw_speed_en(66+6, MBASE(4)); // "Speed" - say_e(106+9, MBASE(4)); // "E" + draw_max_en(MBASE(4)); // "Max" + draw_corner_en(MBASE(4)); // "Corner" + draw_speed_en(66 + 6, MBASE(4)); // "Speed" + say_e(106 + 9, MBASE(4)); // "E" } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeedCornerX+i); + LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_MaxSpeedCornerX + i); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS]*MinUnitMult); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS]*MinUnitMult); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS]*MinUnitMult); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS]*MinUnitMult); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); } inline void Draw_Steps_Menu() { Clear_Main_Window(); if (HMI_flag.language_flag) { - DWIN_Frame_AreaCopy(1, 1, 16, 271-243, 479-451, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); - DWIN_Frame_AreaCopy(1, 153, 148, 271-77, 479-318, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 479-332, LBLX+41+3, MBASE(1)); // Transmission Ratio X - DWIN_Frame_AreaCopy(1, 153, 148, 271-77, 479-318, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 150, 271-264, 479-319, LBLX+41+3, MBASE(2)+3); // Transmission Ratio Y - DWIN_Frame_AreaCopy(1, 153, 148, 271-77, 479-318, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 9, 150, 271-255, 479-319, LBLX+41+3, MBASE(3)+3); // Transmission Ratio Z - DWIN_Frame_AreaCopy(1, 153, 148, 271-77, 479-318, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 271-246, 479-319, LBLX+41+3, MBASE(4)+3); // Transmission Ratio E + DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 479 - 332, LBLX + 41 + 3, MBASE(1)); // Transmission Ratio X + DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 150, 271 - 264, 479 - 319, LBLX + 41 + 3, MBASE(2) + 3); // Transmission Ratio Y + DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 9, 150, 271 - 255, 479 - 319, LBLX + 41 + 3, MBASE(3) + 3); // Transmission Ratio Z + DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 271 - 246, 479 - 319, LBLX + 41 + 3, MBASE(4) + 3); // Transmission Ratio E } else { #ifdef USE_STRING_HEADINGS Draw_Title("Steps-per-mm"); // TODO: GET_TEXT_F #else - DWIN_Frame_AreaCopy(1, 144, 16, 271-82, 479-453, 14, 8); + DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); #endif - draw_steps_per_mm(MBASE(1)); say_x(100+3, MBASE(1)); // "Steps-per-mm X" - draw_steps_per_mm(MBASE(2)); say_y(100+3, MBASE(2)); // "Y" - draw_steps_per_mm(MBASE(3)); say_z(100+3, MBASE(3)); // "Z" - draw_steps_per_mm(MBASE(4)); say_e(100+3, MBASE(4)); // "E" + draw_steps_per_mm(MBASE(1)); say_x(100 + 3, MBASE(1)); // "Steps-per-mm X" + draw_steps_per_mm(MBASE(2)); say_y(100 + 3, MBASE(2)); // "Y" + draw_steps_per_mm(MBASE(3)); say_z(100 + 3, MBASE(3)); // "Z" + draw_steps_per_mm(MBASE(4)); say_e(100 + 3, MBASE(4)); // "E" } Draw_Back_First(); - LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_StepX+i); + LOOP_L_N(i, 4) Draw_Menu_Line(i + 1, ICON_StepX + i); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS]*MinUnitMult); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS]*MinUnitMult); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS]*MinUnitMult); - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Background_black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS]*MinUnitMult); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Background_black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); } /* Motion */ @@ -2798,65 +2867,68 @@ void HMI_Tune(void) { Scroll_Menu(DWIN_SCROLL_UP); Prepare_Item_Lang(5); } - else - Move_Highlight(1, select_tune.now + MROWS-index_tune); + else { + Move_Highlight(1, select_tune.now + MROWS - index_tune); + } } } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_tune.dec()) { - if (select_tune.now < index_tune-MROWS) { + if (select_tune.now < index_tune - MROWS) { index_tune--; Scroll_Menu(DWIN_SCROLL_DOWN); if (index_tune == MROWS) Draw_Back_First(); } - else - Move_Highlight(-1, select_tune.now + MROWS-index_tune); + else { + Move_Highlight(-1, select_tune.now + MROWS - index_tune); + } } } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_tune.now) { - case 0: { // back + case 0: { // Back select_print.set(0); Goto_PrintProcess(); - } break; - case 1: // print speed + } + break; + case 1: // Print speed checkkey = PrintSpeed; HMI_ValueStruct.print_speed = feedrate_percentage; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1+MROWS-index_tune), feedrate_percentage); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1 + MROWS - index_tune), feedrate_percentage); EncoderRate.encoderRateEnabled = 1; break; - #if HAS_HOTEND - case 2: // nozzle temp - checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2+MROWS-index_tune), thermalManager.temp_hotend[0].target); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_HEATED_BED - case 3: // bed temp - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3+MROWS-index_tune), thermalManager.temp_bed.target); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_FAN - case 4: // fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(4+MROWS-index_tune), thermalManager.fan_speed[0]); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - case 5: // z-offset + #if HAS_HOTEND + case 2: // Nozzle temp + checkkey = ETemp; + HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2 + MROWS - index_tune), thermalManager.temp_hotend[0].target); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HEATED_BED + case 3: // Bed temp + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3 + MROWS - index_tune), thermalManager.temp_bed.target); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_FAN + case 4: // Fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(4 + MROWS - index_tune), thermalManager.fan_speed[0]); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + case 5: // Z-offset checkkey = Homeoffset; HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; - show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(5+MROWS-index_tune), HMI_ValueStruct.offset_value); + show_plus_or_minus(font8x16, Select_Color, 2, 2, 202, MBASE(5 + MROWS - index_tune), HMI_ValueStruct.offset_value); EncoderRate.encoderRateEnabled = 1; break; - case 6: // language - /* select language */ + case 6: // Language + // Select language HMI_flag.language_flag = !HMI_flag.language_flag; Clear_Main_Window(); @@ -2899,36 +2971,37 @@ void HMI_PLAPreheatSetting(void) { HMI_ValueStruct.show_mode = -1; Draw_Temperature_Menu(); break; - #if HAS_HOTEND - case 1: // set nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_HEATED_BED - case 2: // set bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_FAN - case 3: // set fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); - EncoderRate.encoderRateEnabled = 1; - break; - #endif + #if HAS_HOTEND + case 1: // set nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), ui.material_preset[0].hotend_temp); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HEATED_BED + case 2: // set bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), ui.material_preset[0].bed_temp); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_FAN + case 3: // set fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), ui.material_preset[0].fan_speed); + EncoderRate.encoderRateEnabled = 1; + break; + #endif case 4: // save PLA configuration if (settings.save()) { buzzer.tone(100, 659); buzzer.tone(100, 698); } - else buzzer.tone(20, 440); + else + buzzer.tone(20, 440); break; default: break; } @@ -2956,36 +3029,37 @@ void HMI_ABSPreheatSetting(void) { HMI_ValueStruct.show_mode = -1; Draw_Temperature_Menu(); break; - #if HAS_HOTEND - case 1: // set nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_HEATED_BED - case 2: // set bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); - EncoderRate.encoderRateEnabled = 1; - break; - #endif - #if HAS_FAN - case 3: // set fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); - EncoderRate.encoderRateEnabled = 1; - break; - #endif + #if HAS_HOTEND + case 1: // set nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(1), ui.material_preset[1].hotend_temp); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_HEATED_BED + case 2: // set bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(2), ui.material_preset[1].bed_temp); + EncoderRate.encoderRateEnabled = 1; + break; + #endif + #if HAS_FAN + case 3: // set fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 3, 216, MBASE(3), ui.material_preset[1].fan_speed); + EncoderRate.encoderRateEnabled = 1; + break; + #endif case 4: // save PLA configuration if (settings.save()) { buzzer.tone(100, 659); buzzer.tone(100, 698); } - else buzzer.tone(20, 440); + else + buzzer.tone(20, 440); break; default: break; @@ -3014,31 +3088,31 @@ void HMI_MaxSpeed(void) { Draw_Motion_Menu(); break; case 1: // max Speed X - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = X_AXIS; + checkkey = MaxSpeed_value; + HMI_flag.feedspeed_flag = X_AXIS; HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[X_AXIS]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); EncoderRate.encoderRateEnabled = 1; break; case 2: // max Speed Y - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = Y_AXIS; + checkkey = MaxSpeed_value; + HMI_flag.feedspeed_flag = Y_AXIS; HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[Y_AXIS]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); EncoderRate.encoderRateEnabled = 1; break; case 3: // max Speed Z - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = Z_AXIS; + checkkey = MaxSpeed_value; + HMI_flag.feedspeed_flag = Z_AXIS; HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[Z_AXIS]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); EncoderRate.encoderRateEnabled = 1; break; case 4: // max Speed E - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_flag = E_AXIS; + checkkey = MaxSpeed_value; + HMI_flag.feedspeed_flag = E_AXIS; HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[E_AXIS]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); EncoderRate.encoderRateEnabled = 1; break; default: @@ -3063,36 +3137,36 @@ void HMI_MaxAcceleration(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_acc.now) { case 0: // back - checkkey = Motion; + checkkey = Motion; select_motion.now = 2; Draw_Motion_Menu(); break; case 1: // max acceleration X - checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = X_AXIS; + checkkey = MaxAcceleration_value; + HMI_flag.acc_flag = X_AXIS; HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[X_AXIS]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); EncoderRate.encoderRateEnabled = 1; break; case 2: // max acceleration Y - checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = Y_AXIS; + checkkey = MaxAcceleration_value; + HMI_flag.acc_flag = Y_AXIS; HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[Y_AXIS]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); EncoderRate.encoderRateEnabled = 1; break; case 3: // max acceleration Z - checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = Z_AXIS; + checkkey = MaxAcceleration_value; + HMI_flag.acc_flag = Z_AXIS; HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[Z_AXIS]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); EncoderRate.encoderRateEnabled = 1; break; case 4: // max acceleration E - checkkey = MaxAcceleration_value; - HMI_flag.acc_flag = E_AXIS; + checkkey = MaxAcceleration_value; + HMI_flag.acc_flag = E_AXIS; HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[E_AXIS]; - DWIN_Draw_IntValue(true,true,0,font8x16,White,Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + DWIN_Draw_IntValue(true, true, 0, font8x16, White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); EncoderRate.encoderRateEnabled = 1; break; default: @@ -3117,36 +3191,36 @@ void HMI_MaxCorner(void) { else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_corner.now) { case 0: // back - checkkey = Motion; + checkkey = Motion; select_motion.now = 3; Draw_Motion_Menu(); break; case 1: // max corner X - checkkey = MaxCorner_value; - HMI_flag.corner_flag = X_AXIS; - HMI_ValueStruct.Max_Corner = planner.max_jerk[X_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + checkkey = MaxCorner_value; + HMI_flag.corner_flag = X_AXIS; + HMI_ValueStruct.Max_Corner = planner.max_jerk[X_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); EncoderRate.encoderRateEnabled = 1; break; case 2: // max corner Y - checkkey = MaxCorner_value; - HMI_flag.corner_flag = Y_AXIS; - HMI_ValueStruct.Max_Corner = planner.max_jerk[Y_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + checkkey = MaxCorner_value; + HMI_flag.corner_flag = Y_AXIS; + HMI_ValueStruct.Max_Corner = planner.max_jerk[Y_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); EncoderRate.encoderRateEnabled = 1; break; case 3: // max corner Z - checkkey = MaxCorner_value; - HMI_flag.corner_flag = Z_AXIS; - HMI_ValueStruct.Max_Corner = planner.max_jerk[Z_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + checkkey = MaxCorner_value; + HMI_flag.corner_flag = Z_AXIS; + HMI_ValueStruct.Max_Corner = planner.max_jerk[Z_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); EncoderRate.encoderRateEnabled = 1; break; case 4: // max corner E - checkkey = MaxCorner_value; - HMI_flag.corner_flag = E_AXIS; - HMI_ValueStruct.Max_Corner = planner.max_jerk[E_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); + checkkey = MaxCorner_value; + HMI_flag.corner_flag = E_AXIS; + HMI_ValueStruct.Max_Corner = planner.max_jerk[E_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_corner.now), HMI_ValueStruct.Max_Corner); EncoderRate.encoderRateEnabled = 1; break; default: @@ -3176,31 +3250,31 @@ void HMI_Step(void) { Draw_Motion_Menu(); break; case 1: // max step X - checkkey = Step_value; - HMI_flag.step_flag = X_AXIS; - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[X_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + checkkey = Step_value; + HMI_flag.step_flag = X_AXIS; + HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); EncoderRate.encoderRateEnabled = 1; break; case 2: // max step Y - checkkey = Step_value; - HMI_flag.step_flag = Y_AXIS; - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[Y_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + checkkey = Step_value; + HMI_flag.step_flag = Y_AXIS; + HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); EncoderRate.encoderRateEnabled = 1; break; case 3: // max step Z - checkkey = Step_value; - HMI_flag.step_flag = Z_AXIS; - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[Z_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + checkkey = Step_value; + HMI_flag.step_flag = Z_AXIS; + HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); EncoderRate.encoderRateEnabled = 1; break; case 4: // max step E - checkkey = Step_value; - HMI_flag.step_flag = E_AXIS; - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[E_AXIS]*MinUnitMult; - DWIN_Draw_FloatValue(true,true,0,font8x16,White,Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + checkkey = Step_value; + HMI_flag.step_flag = E_AXIS; + HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); EncoderRate.encoderRateEnabled = 1; break; default: @@ -3214,8 +3288,8 @@ void HMI_Init(void) { HMI_SDCardInit(); for (uint16_t t = 0; t <= 100; t += 2) { - DWIN_ICON_Show(ICON,ICON_Bar, 15, 260); - DWIN_Draw_Rectangle(1, Background_black, 15 + t * 242/100, 260, 257, 280); + DWIN_ICON_Show(ICON, ICON_Bar, 15, 260); + DWIN_Draw_Rectangle(1, Background_black, 15 + t * 242 / 100, 260, 257, 280); DWIN_UpdateLCD(); delay(20); } @@ -3231,14 +3305,9 @@ void HMI_Init(void) { } void DWIN_Update(void) { - /* status update */ - EachMomentUpdate(); - - /* sdcard update */ - HMI_SDCardUpdate(); - - /* rotary encoder update */ - DWIN_HandleScreen(); + EachMomentUpdate(); // Status update + HMI_SDCardUpdate(); // SD card update + DWIN_HandleScreen(); // Rotary encoder update } void EachMomentUpdate(void) { @@ -3266,7 +3335,7 @@ void EachMomentUpdate(void) { // show print done confirm DWIN_Draw_Rectangle(1, Background_black, 0, 250, 271, 360); - DWIN_ICON_Show(ICON, HMI_flag.language_flag ? ICON_Confirm_C : ICON_Confirm_E, 86, 302-19); + DWIN_ICON_Show(ICON, HMI_flag.language_flag ? ICON_Confirm_C : ICON_Confirm_E, 86, 302 - 19); } else if (HMI_flag.pause_flag != printingIsPaused()) { // print status update @@ -3297,7 +3366,7 @@ void EachMomentUpdate(void) { } } - duration_t elapsed = print_job_timer.duration(); // print timer + duration_t elapsed = print_job_timer.duration(); // print timer /* already print time */ const uint16_t min = (elapsed.value % 3600) / 60; if (last_Printtime != min) { // 1 minute update @@ -3312,7 +3381,7 @@ void EachMomentUpdate(void) { Draw_Print_ProgressRemain(); } } - else if (abort_flag && !HMI_flag.home_flag) { // Print Stop + else if (abort_flag && !HMI_flag.home_flag) { // Print Stop abort_flag = 0; HMI_ValueStruct.print_speed = feedrate_percentage = 100; zprobe_zoffset = TERN(HAS_LEVELING, probe.offset.z, 0); @@ -3356,7 +3425,7 @@ void EachMomentUpdate(void) { Popup_Window_Resume(); draw_first_option(false); char * const name = card.longest_filename(); - DWIN_Draw_String(false,true,font8x16, Font_window, Background_window, (DWIN_WIDTH-strlen(name)*MENU_CHR_W)/2, 252, name); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2, 252, name); DWIN_UpdateLCD(); break; } @@ -3377,6 +3446,7 @@ void EachMomentUpdate(void) { } else update_selection(encoder_diffState == ENCODER_DIFF_CCW); + DWIN_UpdateLCD(); } } diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/dwin.h index 9b78601404f0..3667761b4010 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/dwin.h @@ -31,45 +31,8 @@ #include -#define MACHINE_SIZE "220x220x250" -#define CORP_WEBSITE_C "www.cxsw3d.com" -#define CORP_WEBSITE_E "www.creality.com" - -/*********************************/ - -#define MENU_CHAR_LIMIT 24 - -/*fan speed limit*/ -#define FanOn 255 -#define FanOff 0 - -/*print speed limit*/ -#define max_print_speed 999 -#define min_print_speed 10 - -/*Temp limit*/ -#define max_E_Temp (HEATER_0_MAXTEMP - 15) -#define min_E_Temp HEATER_0_MINTEMP -#define max_Bed_Temp (BED_MAXTEMP - 10) -#define min_Bed_Temp BED_MINTEMP - -/*Feedspeed limit*/ // max feedspeed = DEFAULT_MAX_FEEDRATE * 2 -#define min_MaxFeedspeed 1 -#define min_MaxAcceleration 1 -#define min_MaxCorner 0.1 -#define min_Step 1 - -#define FEEDRATE_E (60) - -// mininum unit (0.1) : multiple (10) -#define MinUnitMult 10 - -#define Encoder_wait 20 -#define DWIN_SCROLL_UPDATE_INTERVAL 2000 -#define DWIN_REMAIN_TIME_UPDATE_INTERVAL 20000 - enum processID { - /*Process ID*/ + // Process ID MainMenu, SelectFile, Prepare, @@ -94,14 +57,14 @@ enum processID { Step, Step_value, - /*Last Process ID*/ + // Last Process ID Last_Prepare, - /*Back Process ID*/ + // Back Process ID Back_Main, Back_Print, - /*Date variable ID*/ + // Date variable ID Move_X, Move_Y, Move_Z, @@ -118,17 +81,17 @@ enum processID { #endif PrintSpeed, - /*Window ID*/ + // Window ID Print_window, Popup_Window }; -/*Picture ID*/ +// Picture ID #define Start_Process 0 #define Language_English 1 #define Language_Chinese 2 -/*ICON ID*/ +// ICON ID #define ICON 0x09 #define ICON_LOGO 0 #define ICON_Print_0 1 @@ -227,11 +190,11 @@ enum processID { #define ICON_Info_0 90 #define ICON_Info_1 91 -/* -* 3-.0:字å·å¤§å°ï¼Œ0x00-0x09,对应字体大å°äºŽä¸‹ï¼š -* 0x00=6*12 0x01=8*16 0x02=10*20 0x03=12*24 0x04=14*28 -* 0x05=16*32 0x06=20*40 0x07=24*48 0x08=28*56 0x09=32*64 -*/ +/** + * 3-.0:The font size, 0x00-0x09, corresponds to the font size below: + * 0x00=6*12 0x01=8*16 0x02=10*20 0x03=12*24 0x04=14*28 + * 0x05=16*32 0x06=20*40 0x07=24*48 0x08=28*56 0x09=32*64 + */ #define font6x12 0x00 #define font8x16 0x01 #define font10x20 0x02 @@ -243,17 +206,17 @@ enum processID { #define font28x56 0x08 #define font32x64 0x09 -/* Colour */ +// Color #define White 0xFFFF -#define Background_window 0x31E8 // 弹窗背景色 -#define Background_blue 0x1125 // æš—è“背景色 -#define Background_black 0x0841 // 黑色背景色 -#define Font_window 0xD6BA // 弹窗字体背景色 -#define Line_Color 0x3A6A // 分割线颜色 -#define Rectangle_Color 0xEE2F // è“色方å—光标颜色 -#define Percent_Color 0xFE29 // 百分比颜色 -#define BarFill_Color 0x10E4 // 进度æ¡å¡«å……色 -#define Select_Color 0x33BB // 选中色 +#define Background_window 0x31E8 // Popup background color +#define Background_blue 0x1125 // Dark blue background color +#define Background_black 0x0841 // black background color +#define Font_window 0xD6BA // Popup font background color +#define Line_Color 0x3A6A // Split line color +#define Rectangle_Color 0xEE2F // blue square cursor color +#define Percent_Color 0xFE29 // percentage color +#define BarFill_Color 0x10E4 // fill color of progress bar +#define Select_Color 0x33BB // selected color extern int checkkey, last_checkkey; extern float zprobe_zoffset; @@ -262,15 +225,9 @@ extern char print_filename[16]; extern millis_t dwin_heat_time; typedef struct { - #if HAS_HOTEND - int16_t E_Temp = 0; - #endif - #if HAS_HEATED_BED - int16_t Bed_Temp = 0; - #endif - #if HAS_FAN - int16_t Fan_speed = 0; - #endif + TERN_(HAS_HOTEND, int16_t E_Temp = 0); + TERN_(HAS_HEATED_BED, int16_t Bed_Temp = 0); + TERN_(HAS_FAN, int16_t Fan_speed = 0); int16_t print_speed = 100; float Max_Feedspeed = 0; float Max_Acceleration = 0; @@ -311,12 +268,12 @@ typedef struct { extern HMI_value_t HMI_ValueStruct; extern HMI_Flag HMI_flag; -/* Language */ +// Language void lcd_select_language(void); void set_english_to_eeprom(void); void set_chinese_to_eeprom(void); -/* Show ICON*/ +// Show ICO void ICON_Print(bool show); void ICON_Prepare(bool show); void ICON_Control(bool show); @@ -328,7 +285,7 @@ void ICON_Pause(bool show); void ICON_Continue(bool show); void ICON_Stop(bool show); -/* Popup window tips */ +// Popup window tips #if HAS_HOTEND void Popup_Window_Temperature(const bool toohigh); void Popup_Window_ETempTooLow(void); @@ -341,7 +298,7 @@ void Popup_Window_Leveling(void); void Goto_PrintProcess(void); void Goto_MainMenu(void); -/* Variable control */ +// Variable control void HMI_Move_X(void); void HMI_Move_Y(void); void HMI_Move_Z(void); @@ -349,15 +306,10 @@ void HMI_Move_E(void); void HMI_Zoffset(void); -#if HAS_HOTEND - void HMI_ETemp(void); -#endif -#if HAS_HEATED_BED - void HMI_BedTemp(void); -#endif -#if HAS_FAN - void HMI_FanSpeed(void); -#endif +TERN_(HAS_HOTEND, void HMI_ETemp(void)); +TERN_(HAS_HEATED_BED, void HMI_BedTemp(void)); +TERN_(HAS_FAN, void HMI_FanSpeed(void)); + void HMI_PrintSpeed(void); void HMI_MaxFeedspeedXYZE(void); @@ -368,40 +320,40 @@ void HMI_StepXYZE(void); void update_variable(void); void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); -/* SD Card */ +// SD Card void HMI_SDCardInit(void); void HMI_SDCardUpdate(void); -/* Main Process */ +// Main Process void Icon_print(bool value); void Icon_control(bool value); void Icon_temperature(bool value); void Icon_leveling(bool value); -/* Other */ +// Other bool Pause_HeatStatus(); -void HMI_StartFrame(const bool with_update); // å¼€æœºç”»é¢ -void HMI_MainMenu(void); // ä¸»è¿›ç¨‹ç”»é¢ -void HMI_SelectFile(void); // 文件页 -void HMI_Printing(void); // 打å°é¡µ -void HMI_Prepare(void); // 准备页 -void HMI_Control(void); // 控制页 -void HMI_Leveling(void); // 调平页 -void HMI_AxisMove(void); // 轴移动èœå• -void HMI_Temperature(void); // 温度èœå• -void HMI_Motion(void); // è¿åŠ¨èœå• -void HMI_Info(void); // ä¿¡æ¯èœå• -void HMI_Tune(void); // 调整èœå• +void HMI_StartFrame(const bool with_update); // startup screen +void HMI_MainMenu(void); // main process screen +void HMI_SelectFile(void); // file page +void HMI_Printing(void); // print page +void HMI_Prepare(void); // prepare page +void HMI_Control(void); // control page +void HMI_Leveling(void); // Level the page +void HMI_AxisMove(void); // Axis movement menu +void HMI_Temperature(void); // Temperature menu +void HMI_Motion(void); // Sports menu +void HMI_Info(void); // Information menu +void HMI_Tune(void); // Adjust the menu #if HAS_HOTEND - void HMI_PLAPreheatSetting(void); // PLA预热设置 - void HMI_ABSPreheatSetting(void); // ABS预热设置 + void HMI_PLAPreheatSetting(void); // PLA warm-up setting + void HMI_ABSPreheatSetting(void); // ABS warm-up setting #endif -void HMI_MaxSpeed(void); // 最大速度å­èœå• -void HMI_MaxAcceleration(void); // 最大加速度å­èœå• -void HMI_MaxCorner(void); // 最大æ‹è§’速度å­èœå• -void HMI_Step(void); // 传动比 +void HMI_MaxSpeed(void); // Maximum speed submenu +void HMI_MaxAcceleration(void); // Maximum acceleration submenu +void HMI_MaxCorner(void); // Maximum corner speed submenu +void HMI_Step(void); // transmission ratio void HMI_Init(void); void DWIN_Update(void); diff --git a/Marlin/src/lcd/dwin/eeprom_BL24CXX.h b/Marlin/src/lcd/dwin/eeprom_BL24CXX.h index b655fb8e459a..7ffb64d4d3ec 100644 --- a/Marlin/src/lcd/dwin/eeprom_BL24CXX.h +++ b/Marlin/src/lcd/dwin/eeprom_BL24CXX.h @@ -30,11 +30,11 @@ /******************** IIC ********************/ -//IOæ–¹å‘设置 +//IO direction setting #define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0) #define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0) -//IOæ“作函数 +//IO operation function #define IIC_SCL_0() WRITE(IIC_EEPROM_SCL, LOW) #define IIC_SCL_1() WRITE(IIC_EEPROM_SCL, HIGH) #define IIC_SDA_0() WRITE(IIC_EEPROM_SDA, LOW) @@ -43,18 +43,18 @@ class BL24CXX; -// IIC所有æ“作函数 +// All operation functions of IIC class IIC { friend class BL24CXX; protected: - static void init(); // åˆå§‹åŒ–IICçš„IOå£ - static void start(); // å‘é€IICå¼€å§‹ä¿¡å· - static void stop(); // å‘é€IICåœæ­¢ä¿¡å· - static void send_byte(uint8_t txd); // IICå‘é€ä¸€ä¸ªå­—节 - static uint8_t read_byte(unsigned char ack); // IIC读å–一个字节 - static uint8_t wait_ack(); // IIC等待ACKä¿¡å· - static void ack(); // IICå‘é€ACKä¿¡å· - static void nAck(); // IICä¸å‘é€ACKä¿¡å· + static void init(); // Initialize the IO port of IIC + static void start(); // Send IIC start signal + static void stop(); // Send IIC stop signal + static void send_byte(uint8_t txd); // IIC sends a byte + static uint8_t read_byte(unsigned char ack); // IIC reads a byte + static uint8_t wait_ack(); // IIC waits for ACK signal + static void ack(); // IIC sends ACK signal + static void nAck(); // IIC does not send ACK signal static void write_one_byte(uint8_t daddr, uint8_t addr, uint8_t data); static uint8_t read_one_byte(uint8_t daddr, uint8_t addr); @@ -75,12 +75,12 @@ friend class BL24CXX; class BL24CXX { public: - static void init(); //åˆå§‹åŒ–IIC - static uint8_t check(); //检查器件 - static uint8_t readOneByte(uint16_t ReadAddr); //指定地å€è¯»å–一个字节 - static void writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite); //指定地å€å†™å…¥ä¸€ä¸ªå­—节 - static void writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len);//指定地å€å¼€å§‹å†™å…¥æŒ‡å®šé•¿åº¦çš„æ•°æ® - static uint32_t readLenByte(uint16_t ReadAddr, uint8_t Len); //指定地å€å¼€å§‹è¯»å–æŒ‡å®šé•¿åº¦æ•°æ® - static void write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite); //从指定地å€å¼€å§‹å†™å…¥æŒ‡å®šé•¿åº¦çš„æ•°æ® - static void read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead); //从指定地å€å¼€å§‹è¯»å‡ºæŒ‡å®šé•¿åº¦çš„æ•°æ® + static void init(); // Initialize IIC + static uint8_t check(); // Check the device + static uint8_t readOneByte(uint16_t ReadAddr); // Read a byte at the specified address + static void writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite); // Write a byte at the specified address + static void writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len);// The specified address begins to write the data of the specified length + static uint32_t readLenByte(uint16_t ReadAddr, uint8_t Len); // The specified address starts to read the data of the specified length + static void write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite); // Write the specified length of data from the specified address + static void read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead); // Read the data of the specified length from the specified address }; diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 5de5c09d4d6e..d5e0fcd85829 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -314,10 +314,7 @@ void menu_cancelobject(); #undef PID_BED_MENU_SECTION #endif #if ENABLED(PID_AUTOTUNE_MENU) - #ifndef BED_OVERSHOOT - #define BED_OVERSHOOT 5 - #endif - EDIT_ITEM_FAST_N(int3, -1, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAXTEMP - BED_OVERSHOOT, []{ _lcd_autotune(-1); }); + EDIT_ITEM_FAST_N(int3, -1, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAX_TARGET, []{ _lcd_autotune(-1); }); #endif #endif From 55e519a06f47e8c29687ebf2b58cc8117be0afdf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 14 Jul 2020 21:26:09 -0500 Subject: [PATCH 150/483] General cleanup --- Marlin/src/lcd/menu/menu_motion.cpp | 4 +--- Marlin/src/module/stepper.cpp | 26 ++++++++++++-------------- Marlin/src/module/stepper.h | 3 +-- Marlin/src/module/temperature.cpp | 5 ++++- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index bc1e10181603..1821161cb150 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -139,9 +139,7 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } ui.encoderPosition = 0; } if (ui.should_draw()) { - #if MULTI_MANUAL - MenuItemBase::init(eindex); - #endif + TERN_(MULTI_MANUAL, MenuItemBase::init(eindex)); MenuEditItemBase::draw_edit_screen( GET_TEXT(TERN(MULTI_MANUAL, MSG_MOVE_EN, MSG_MOVE_E)), ftostr41sign(current_position.e diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 6b957bad89ed..16ff134923db 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -168,22 +168,19 @@ bool Stepper::abort_current_block; #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) bool Stepper::locked_Z_motor = false, Stepper::locked_Z2_motor = false - #if NUM_Z_STEPPER_DRIVERS >= 3 - , Stepper::locked_Z3_motor = false - #if NUM_Z_STEPPER_DRIVERS >= 4 - , Stepper::locked_Z4_motor = false - #endif - #endif - ; + #if NUM_Z_STEPPER_DRIVERS >= 3 + , Stepper::locked_Z3_motor = false + #if NUM_Z_STEPPER_DRIVERS >= 4 + , Stepper::locked_Z4_motor = false + #endif + #endif + ; #endif uint32_t Stepper::acceleration_time, Stepper::deceleration_time; uint8_t Stepper::steps_per_isr; -#if DISABLED(ADAPTIVE_STEP_SMOOTHING) - constexpr -#endif - uint8_t Stepper::oversampling_factor; +TERN(ADAPTIVE_STEP_SMOOTHING,,constexpr) uint8_t Stepper::oversampling_factor; xyze_long_t Stepper::delta_error{0}; @@ -2099,17 +2096,18 @@ uint32_t Stepper::block_phase_isr() { // No acceleration / deceleration time elapsed so far acceleration_time = deceleration_time = 0; - uint8_t oversampling = 0; // Assume no axis smoothing (via oversampling) - #if ENABLED(ADAPTIVE_STEP_SMOOTHING) + uint8_t oversampling = 0; // Assume no axis smoothing (via oversampling) // Decide if axis smoothing is possible - uint32_t max_rate = current_block->nominal_rate; // Get the maximum rate (maximum event speed) + uint32_t max_rate = current_block->nominal_rate; // Get the maximum rate (maximum event speed) while (max_rate < MIN_STEP_ISR_FREQUENCY) { // As long as more ISRs are possible... max_rate <<= 1; // Try to double the rate if (max_rate >= MAX_STEP_ISR_FREQUENCY_1X) break; // Don't exceed the estimated ISR limit ++oversampling; // Increase the oversampling (used for left-shift) } oversampling_factor = oversampling; // For all timer interval calculations + #else + constexpr uint8_t oversampling = 0; #endif // Based on the oversampling factor, do the calculations diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 90ca092aceb0..6ae5076cd244 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -191,7 +191,6 @@ #error "Expected at least one of MINIMUM_STEPPER_PULSE or MAXIMUM_STEPPER_RATE to be defined" #endif - // But the user could be enforcing a minimum time, so the loop time is #define ISR_LOOP_CYCLES (ISR_LOOP_BASE_CYCLES + _MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LOOP_CYCLES)) @@ -558,7 +557,7 @@ class Stepper { // In case of high-performance processor, it is able to calculate in real-time timer = uint32_t(STEPPER_TIMER_RATE) / step_rate; #else - constexpr uint32_t min_step_rate = F_CPU / 500000U; + constexpr uint32_t min_step_rate = (F_CPU) / 500000U; NOLESS(step_rate, min_step_rate); step_rate -= min_step_rate; // Correct for minimal speed if (step_rate >= (8 * 256)) { // higher step rate diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 7c10beceeb8d..e62754a30106 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -907,7 +907,10 @@ void Temperature::min_temp_error(const heater_ind_t heater) { SERIAL_ECHOPAIR(STR_PID_DEBUG, ee, STR_PID_DEBUG_INPUT, temp_hotend[ee].celsius, STR_PID_DEBUG_OUTPUT, pid_output); #if DISABLED(PID_OPENLOOP) { - SERIAL_ECHOPAIR( STR_PID_DEBUG_PTERM, work_pid[ee].Kp, STR_PID_DEBUG_ITERM, work_pid[ee].Ki, STR_PID_DEBUG_DTERM, work_pid[ee].Kd + SERIAL_ECHOPAIR( + STR_PID_DEBUG_PTERM, work_pid[ee].Kp, + STR_PID_DEBUG_ITERM, work_pid[ee].Ki, + STR_PID_DEBUG_DTERM, work_pid[ee].Kd #if ENABLED(PID_EXTRUSION_SCALING) , STR_PID_DEBUG_CTERM, work_pid[ee].Kc #endif From 76b67d55e2b55317c21c8d24d014887f2c2329eb Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 14 Jul 2020 23:14:03 -0700 Subject: [PATCH 151/483] Fix some Power Loss Recovery behaviors (#18558) --- Marlin/src/MarlinCore.cpp | 9 +- Marlin/src/feature/powerloss.cpp | 185 ++++++++++++-------- Marlin/src/feature/powerloss.h | 42 +++-- Marlin/src/gcode/feature/powerloss/M413.cpp | 3 + Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/module/temperature.cpp | 22 +-- Marlin/src/module/temperature.h | 4 +- buildroot/tests/rambo-tests | 1 + 8 files changed, 163 insertions(+), 105 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 13d624523949..1a53a1ab71da 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -394,6 +394,13 @@ void disable_all_steppers() { constexpr bool did_pause_print = false; #endif +/** + * A Print Job exists when the timer is running or SD printing + */ +bool printJobOngoing() { + return print_job_timer.isRunning() || IS_SD_PRINTING(); +} + /** * Printing is active when the print job timer is running */ @@ -690,7 +697,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { // Handle Power-Loss Recovery #if ENABLED(POWER_LOSS_RECOVERY) && PIN_EXISTS(POWER_LOSS) - recovery.outage(); + if (printJobOngoing()) recovery.outage(); #endif // Run StallGuard endstop checks diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 97b30435f100..b9f8dfaa6732 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -66,12 +66,16 @@ PrintJobRecovery recovery; #ifndef POWER_LOSS_PURGE_LEN #define POWER_LOSS_PURGE_LEN 0 #endif +#ifndef POWER_LOSS_ZRAISE + #define POWER_LOSS_ZRAISE 2 // Move on loss with backup power, or on resume without it +#endif + +#if DISABLED(BACKUP_POWER_SUPPLY) + #undef POWER_LOSS_RETRACT_LEN // No retract at outage without backup power +#endif #ifndef POWER_LOSS_RETRACT_LEN #define POWER_LOSS_RETRACT_LEN 0 #endif -#ifndef POWER_LOSS_ZRAISE - #define POWER_LOSS_ZRAISE 2 -#endif /** * Clear the recovery info @@ -144,7 +148,7 @@ void PrintJobRecovery::prepare() { /** * Save the current machine state to the power-loss recovery file */ -void PrintJobRecovery::save(const bool force/*=false*/) { +void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/) { #if SAVE_INFO_INTERVAL_MS > 0 static millis_t next_save_ms; // = 0 @@ -177,6 +181,7 @@ void PrintJobRecovery::save(const bool force/*=false*/) { // Machine state info.current_position = current_position; + info.zraise = zraise; TERN_(HAS_HOME_OFFSET, info.home_offset = home_offset); TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift); info.feedrate = uint16_t(feedrate_mm_s * 60.0f); @@ -228,30 +233,73 @@ void PrintJobRecovery::save(const bool force/*=false*/) { #if PIN_EXISTS(POWER_LOSS) + #if ENABLED(BACKUP_POWER_SUPPLY) + + void PrintJobRecovery::retract_and_lift(const float &zraise) { + #if POWER_LOSS_RETRACT_LEN || POWER_LOSS_ZRAISE + + gcode.set_relative_mode(true); // Use relative coordinates + + #if POWER_LOSS_RETRACT_LEN + // Retract filament now + gcode.process_subcommands_now_P(PSTR("G1 F3000 E-" STRINGIFY(POWER_LOSS_RETRACT_LEN))); + #endif + + #if POWER_LOSS_ZRAISE + // Raise the Z axis now + if (zraise) { + char cmd[20], str_1[16]; + sprintf_P(cmd, PSTR("G0 Z%s"), dtostrf(zraise, 1, 3, str_1)); + gcode.process_subcommands_now(cmd); + } + #else + UNUSED(zraise); + #endif + + //gcode.axis_relative = info.axis_relative; + planner.synchronize(); + #endif + } + + #endif + + /** + * An outage was detected by a sensor pin. + * - If not SD printing, let the machine turn off on its own with no "KILL" screen + * - Disable all heaters first to save energy + * - Save the recovery data for the current instant + * - If backup power is available Retract E and Raise Z + * - Go to the KILL screen + */ void PrintJobRecovery::_outage() { #if ENABLED(BACKUP_POWER_SUPPLY) static bool lock = false; - if (lock) return; // No re-entrance from idle() during raise_z() + if (lock) return; // No re-entrance from idle() during retract_and_lift() lock = true; #endif - if (IS_SD_PRINTING()) save(true); - TERN_(BACKUP_POWER_SUPPLY, raise_z()); - kill(GET_TEXT(MSG_OUTAGE_RECOVERY)); - } + #if POWER_LOSS_ZRAISE + // Get the limited Z-raise to do now or on resume + const float zraise = _MAX(0, _MIN(current_position.z + POWER_LOSS_ZRAISE, Z_MAX_POS - 1) - current_position.z); + #else + constexpr float zraise = 0; + #endif - #if ENABLED(BACKUP_POWER_SUPPLY) + // Save, including the limited Z raise + if (IS_SD_PRINTING()) save(true, zraise); + + // Disable all heaters to reduce power loss + thermalManager.disable_all_heaters(); - void PrintJobRecovery::raise_z() { - // Disable all heaters to reduce power loss - thermalManager.disable_all_heaters(); + #if ENABLED(BACKUP_POWER_SUPPLY) + // Do a hard-stop of the steppers (with possibly a loud thud) quickstop_stepper(); - // Raise Z axis - gcode.process_subcommands_now_P(PSTR("G91\nG0 Z" STRINGIFY(POWER_LOSS_ZRAISE))); - planner.synchronize(); - } + // With backup power a retract and raise can be done now + retract_and_lift(zraise); + #endif - #endif + kill(GET_TEXT(MSG_OUTAGE_RECOVERY)); + } #endif @@ -274,6 +322,8 @@ void PrintJobRecovery::write() { */ void PrintJobRecovery::resume() { + char cmd[MAX_CMD_SIZE+16], str_1[16], str_2[16]; + const uint32_t resume_sdpos = info.sdpos; // Get here before the stepper ISR overwrites it #if HAS_LEVELING @@ -282,52 +332,46 @@ void PrintJobRecovery::resume() { #endif // Reset E, raise Z, home XY... - gcode.process_subcommands_now_P(PSTR("G92.9 E0" - #if Z_HOME_DIR > 0 + #if Z_HOME_DIR > 0 - // If Z homing goes to max, just reset E and home all - "\n" - "G28R0" - TERN_(MARLIN_DEV_MODE, "S") + // If Z homing goes to max, just reset E and home all + gcode.process_subcommands_now_P(PSTR( + "G92.9 E0\n" + "G28R0" TERN_(MARLIN_DEV_MODE, "S") + )); - #else // "G92.9 E0 ..." + #else // "G92.9 E0 ..." - // Set Z to 0, raise Z by RECOVERY_ZRAISE, and Home (XY only for Cartesian) - // with no raise. (Only do simulated homing in Marlin Dev Mode.) - #if ENABLED(BACKUP_POWER_SUPPLY) - "Z" STRINGIFY(POWER_LOSS_ZRAISE) // Z-axis was already raised at outage - #else - "Z0\n" // Set Z=0 - "G1Z" STRINGIFY(POWER_LOSS_ZRAISE) // Raise Z - #endif - "\n" + // Set Z to 0, raise Z by info.zraise, and Home (XY only for Cartesian) + // with no raise. (Only do simulated homing in Marlin Dev Mode.) - "G28R0" - #if ENABLED(MARLIN_DEV_MODE) - "S" - #elif !IS_KINEMATIC - "XY" - #endif - #endif - )); - - // Pretend that all axes are homed - axis_homed = axis_known_position = xyz_bits; + sprintf_P(cmd, PSTR("G92.9 E0 " + #if ENABLED(BACKUP_POWER_SUPPLY) + "Z%s" // Z was already raised at outage + #else + "Z0\nG1Z%s" // Set Z=0 and Raise Z now + #endif + ), + dtostrf(info.zraise, 1, 3, str_1) + ); + gcode.process_subcommands_now(cmd); - char cmd[MAX_CMD_SIZE+16], str_1[16], str_2[16]; + gcode.process_subcommands_now_P(PSTR( + "G28R0" // No raise during G28 + TERN_(MARLIN_DEV_MODE, "S") // Simulated Homing + TERN_(IS_CARTESIAN, "XY") // Don't home Z on Cartesian + )); - // Select the previously active tool (with no_move) - #if EXTRUDERS > 1 - sprintf_P(cmd, PSTR("T%i S"), info.active_extruder); - gcode.process_subcommands_now(cmd); #endif + // Pretend that all axes are homed + axis_homed = axis_known_position = xyz_bits; + // Recover volumetric extrusion state #if DISABLED(NO_VOLUMETRICS) #if EXTRUDERS > 1 for (int8_t e = 0; e < EXTRUDERS; e++) { - dtostrf(info.filament_size[e], 1, 3, str_1); - sprintf_P(cmd, PSTR("M200 T%i D%s"), e, str_1); + sprintf_P(cmd, PSTR("M200 T%i D%s"), e, dtostrf(info.filament_size[e], 1, 3, str_1)); gcode.process_subcommands_now(cmd); } if (!info.volumetric_enabled) { @@ -336,8 +380,7 @@ void PrintJobRecovery::resume() { } #else if (info.volumetric_enabled) { - dtostrf(info.filament_size[0], 1, 3, str_1); - sprintf_P(cmd, PSTR("M200 D%s"), str_1); + sprintf_P(cmd, PSTR("M200 D%s"), dtostrf(info.filament_size[0], 1, 3, str_1)); gcode.process_subcommands_now(cmd); } #endif @@ -358,7 +401,7 @@ void PrintJobRecovery::resume() { const int16_t et = info.target_temperature[e]; if (et) { #if HAS_MULTI_HOTEND - sprintf_P(cmd, PSTR("T%i"), e); + sprintf_P(cmd, PSTR("T%i S"), e); gcode.process_subcommands_now(cmd); #endif sprintf_P(cmd, PSTR("M109 S%i"), et); @@ -367,6 +410,12 @@ void PrintJobRecovery::resume() { } #endif + // Select the previously active tool (with no_move) + #if EXTRUDERS > 1 + sprintf_P(cmd, PSTR("T%i S"), info.active_extruder); + gcode.process_subcommands_now(cmd); + #endif + // Restore print cooling fan speeds FANS_LOOP(i) { uint8_t f = info.fan_speed[i]; @@ -400,18 +449,21 @@ void PrintJobRecovery::resume() { memcpy(&mixer.gradient, &info.gradient, sizeof(info.gradient)); #endif - // Extrude and retract to clean the nozzle - #if POWER_LOSS_PURGE_LEN - //sprintf_P(cmd, PSTR("G1 E%d F200"), POWER_LOSS_PURGE_LEN); - //gcode.process_subcommands_now(cmd); - gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_PURGE_LEN) " F200")); + // Un-retract if there was a retract at outage + #if POWER_LOSS_RETRACT_LEN + gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_RETRACT_LEN) " F3000")); #endif - #if POWER_LOSS_RETRACT_LEN - sprintf_P(cmd, PSTR("G1 E%d F3000"), POWER_LOSS_PURGE_LEN - (POWER_LOSS_RETRACT_LEN)); + // Additional purge if configured + #if POWER_LOSS_PURGE_LEN + sprintf_P(cmd, PSTR("G1 E%d F200"), (POWER_LOSS_PURGE_LEN) + (POWER_LOSS_RETRACT_LEN)); gcode.process_subcommands_now(cmd); #endif + #if ENABLED(NOZZLE_CLEAN_FEATURE) + gcode.process_subcommands_now_P(PSTR("G12")); + #endif + // Move back to the saved XY sprintf_P(cmd, PSTR("G1 X%s Y%s F3000"), dtostrf(info.current_position.x, 1, 3, str_1), @@ -429,13 +481,6 @@ void PrintJobRecovery::resume() { #endif gcode.process_subcommands_now(cmd); - // Un-retract - #if POWER_LOSS_PURGE_LEN - //sprintf_P(cmd, PSTR("G1 E%d F3000"), POWER_LOSS_PURGE_LEN); - //gcode.process_subcommands_now(cmd); - gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_PURGE_LEN) " F3000")); - #endif - // Restore the feedrate sprintf_P(cmd, PSTR("G1 F%d"), info.feedrate); gcode.process_subcommands_now(cmd); @@ -476,6 +521,8 @@ void PrintJobRecovery::resume() { } DEBUG_EOL(); + DEBUG_ECHOLNPAIR("zraise: ", info.zraise); + #if HAS_HOME_OFFSET DEBUG_ECHOPGM("home_offset: "); LOOP_XYZ(i) { diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 3645f57c3c21..89b619285dc6 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -26,6 +26,8 @@ */ #include "../sd/cardreader.h" +#include "../gcode/gcode.h" + #include "../inc/MarlinConfig.h" #if ENABLED(MIXING_EXTRUDER) @@ -45,6 +47,7 @@ typedef struct { // Machine state xyze_pos_t current_position; + float zraise; #if HAS_HOME_OFFSET xyz_pos_t home_offset; @@ -161,33 +164,34 @@ class PrintJobRecovery { static inline void cancel() { purge(); card.autostart_index = 0; } static void load(); - static void save(const bool force=ENABLED(SAVE_EACH_CMD_MODE)); + static void save(const bool force=ENABLED(SAVE_EACH_CMD_MODE), const float zraise=0); - #if PIN_EXISTS(POWER_LOSS) - static inline void outage() { - if (enabled && READ(POWER_LOSS_PIN) == POWER_LOSS_STATE) - _outage(); - } - #endif + #if PIN_EXISTS(POWER_LOSS) + static inline void outage() { + if (enabled && READ(POWER_LOSS_PIN) == POWER_LOSS_STATE) + _outage(); + } + #endif - static inline bool valid() { return info.valid(); } + static inline bool valid() { return info.valid(); } - #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - static void debug(PGM_P const prefix); - #else - static inline void debug(PGM_P const) {} - #endif + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + static void debug(PGM_P const prefix); + #else + static inline void debug(PGM_P const) {} + #endif private: static void write(); - #if ENABLED(BACKUP_POWER_SUPPLY) - static void raise_z(); - #endif + #if ENABLED(BACKUP_POWER_SUPPLY) + static void retract_and_lift(const float &zraise); + #endif - #if PIN_EXISTS(POWER_LOSS) - static void _outage(); - #endif + #if PIN_EXISTS(POWER_LOSS) + friend class GcodeSuite; + static void _outage(); + #endif }; extern PrintJobRecovery recovery; diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp index 67e756d5d230..ea933872be11 100644 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ b/Marlin/src/gcode/feature/powerloss/M413.cpp @@ -50,6 +50,9 @@ void GcodeSuite::M413() { if (parser.seen("RL")) recovery.load(); if (parser.seen('W')) recovery.save(true); if (parser.seen('P')) recovery.purge(); + #if PIN_EXISTS(POWER_LOSS) + if (parser.seen('O')) recovery._outage(); + #endif if (parser.seen('E')) serialprintPGM(recovery.exists() ? PSTR("PLR Exists\n") : PSTR("No PLR\n")); if (parser.seen('V')) serialprintPGM(recovery.valid() ? PSTR("Valid\n") : PSTR("Invalid\n")); #endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index d7701f4ae9e0..ba8cf1cfecb9 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -363,7 +363,7 @@ namespace Language_en { PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Printing Object"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancel Object"); PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancel Object ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Outage Recovery"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Power Outage"); PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print from Media"); PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No Media"); PROGMEM Language_Str MSG_DWELL = _UxGT("Sleep..."); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index e62754a30106..2e8b0314aa66 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2026,33 +2026,29 @@ void Temperature::disable_all_heaters() { TERN_(AUTOTEMP, planner.autotemp_enabled = false); - #if HAS_HOTEND - HOTEND_LOOP() setTargetHotend(0, e); - #endif - TERN_(HAS_HEATED_BED, setTargetBed(0)); - TERN_(HAS_HEATED_CHAMBER, setTargetChamber(0)); - // Unpause and reset everything TERN_(PROBING_HEATERS_OFF, pause(false)); - #define DISABLE_HEATER(N) { \ - setTargetHotend(0, N); \ - temp_hotend[N].soft_pwm_amount = 0; \ - WRITE_HEATER_##N(LOW); \ - } + #if HAS_HOTEND + HOTEND_LOOP() { + setTargetHotend(0, e); + temp_hotend[e].soft_pwm_amount = 0; + } + #endif #if HAS_TEMP_HOTEND + #define DISABLE_HEATER(N) WRITE_HEATER_##N(LOW) REPEAT(HOTENDS, DISABLE_HEATER); #endif #if HAS_HEATED_BED - temp_bed.target = 0; + setTargetBed(0); temp_bed.soft_pwm_amount = 0; WRITE_HEATER_BED(LOW); #endif #if HAS_HEATED_CHAMBER - temp_chamber.target = 0; + setTargetChamber(0); temp_chamber.soft_pwm_amount = 0; WRITE_HEATER_CHAMBER(LOW); #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index cfd9f957c1c4..37700c7b8b9f 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -576,7 +576,7 @@ class Temperature { else if (temp_hotend[ee].target == 0) start_preheat_time(ee); #endif - TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); + TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); temp_hotend[ee].target = _MIN(celsius, temp_range[ee].maxtemp - HOTEND_OVERSHOOT); start_watching_hotend(ee); } @@ -624,7 +624,7 @@ class Temperature { #endif static void setTargetBed(const int16_t celsius) { - TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); + TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); temp_bed.target = #ifdef BED_MAX_TARGET _MIN(celsius, BED_MAX_TARGET) diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 53ac729cbc98..0b249e2149cf 100644 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -40,6 +40,7 @@ opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TE PSU_CONTROL AUTO_POWER_CONTROL POWER_LOSS_RECOVERY POWER_LOSS_PIN POWER_LOSS_STATE \ SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL +opt_add DEBUG_POWER_LOSS_RECOVERY exec_test $1 $2 "RAMBO | EXTRUDERS 2 | CHAR LCD + SD | FIX Probe | ABL-Linear | Advanced Pause | PLR | LEDs ..." # From ef90cb7c97b93223ecd3147bc2ce80b6344bf8ff Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 15 Jul 2020 01:20:52 -0500 Subject: [PATCH 152/483] PLR followup --- Marlin/src/module/temperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 2e8b0314aa66..dfbcd0a15afc 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2037,7 +2037,7 @@ void Temperature::disable_all_heaters() { #endif #if HAS_TEMP_HOTEND - #define DISABLE_HEATER(N) WRITE_HEATER_##N(LOW) + #define DISABLE_HEATER(N) WRITE_HEATER_##N(LOW); REPEAT(HOTENDS, DISABLE_HEATER); #endif From 246eac0c828e0ed1a4a00228b62f687bca387727 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 15 Jul 2020 00:46:04 -0700 Subject: [PATCH 153/483] Fix Hotend Idle Timeout trigger (#18657) --- Marlin/src/feature/hotend_idle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp index 6b5d1b276d5f..89c18f7af515 100644 --- a/Marlin/src/feature/hotend_idle.cpp +++ b/Marlin/src/feature/hotend_idle.cpp @@ -43,7 +43,7 @@ millis_t HotendIdleProtection::next_protect_ms = 0; void HotendIdleProtection::check_hotends(const millis_t &ms) { bool do_prot = false; HOTEND_LOOP() { - if (thermalManager.degHotendNear(e, HOTEND_IDLE_MIN_TRIGGER)) { + if (thermalManager.degHotend(active_extruder) >= HOTEND_IDLE_MIN_TRIGGER) { do_prot = true; break; } } From 05c999a809ce57cb7b6cfded72615bf5ffb1f2a9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 16 Jul 2020 00:11:04 +0000 Subject: [PATCH 154/483] [cron] Bump distribution date (2020-07-16) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f03b585d96bc..6de7cc63466a 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-15" + #define STRING_DISTRIBUTION_DATE "2020-07-16" #endif /** From 0223ca8abb96ac45dc02fdf8871ed508f0f48ec6 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 16 Jul 2020 14:45:08 +1200 Subject: [PATCH 155/483] Fix SKR 1.4 LCD / ADC Keypad sanity-check (#18670) --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 4 ++++ Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index 0503defa9a39..612798c23dbc 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -261,6 +261,10 @@ #define LCD_PINS_ENABLE EXPA1_03_PIN #define LCD_PINS_D4 EXPA1_05_PIN + #elif HAS_ADC_BUTTONS + + #error "ADC BUTTONS do not work unmodifed on SKR 1.3, The ADC ports cannot take more than 3.3v." + #else // !CR10_STOCKDISPLAY #define LCD_PINS_RS EXPA1_07_PIN diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 78da8e842f75..00d815ff51d6 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -250,7 +250,7 @@ #define LCD_PINS_ENABLE P1_23 #define LCD_PINS_D4 P1_21 - #elif HAS_GRAPHICAL_LCD + #else #define BTN_ENC P0_28 // (58) open-drain #define LCD_PINS_RS P1_19 @@ -312,14 +312,14 @@ #endif // !FYSETC_MINI_12864 - #elif HAS_CHARACTER_LCD - - #error "Character LCD not yet supported for SKR 1.4." - - #endif + #endif // HAS_GRAPHICAL_LCD #endif // HAS_SPI_LCD +#if HAS_ADC_BUTTONS + #error "ADC BUTTONS do not work unmodifed on SKR 1.4, The ADC ports cannot take more than 3.3v." +#endif + // // Neopixel LED // From ed3df41a7e0090eb183ea840c587d3f02ff82190 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 15 Jul 2020 19:58:32 -0500 Subject: [PATCH 156/483] Broadcast host actions Fixes #18565 --- Marlin/src/feature/host_actions.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index e85c5bf6233c..86a2bcf1a6b6 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -38,6 +38,7 @@ #endif void host_action(PGM_P const pstr, const bool eol) { + PORT_REDIRECT(SERIAL_BOTH); SERIAL_ECHOPGM("//action:"); serialprintPGM(pstr); if (eol) SERIAL_EOL(); @@ -74,18 +75,20 @@ void host_action(PGM_P const pstr, const bool eol) { PromptReason host_prompt_reason = PROMPT_NOT_DEFINED; void host_action_notify(const char * const message) { + PORT_REDIRECT(SERIAL_BOTH); host_action(PSTR("notification "), false); - SERIAL_ECHO(message); - SERIAL_EOL(); + SERIAL_ECHOLN(message); } void host_action_notify_P(PGM_P const message) { + PORT_REDIRECT(SERIAL_BOTH); host_action(PSTR("notification "), false); serialprintPGM(message); SERIAL_EOL(); } void host_action_prompt(PGM_P const ptype, const bool eol=true) { + PORT_REDIRECT(SERIAL_BOTH); host_action(PSTR("prompt_"), false); serialprintPGM(ptype); if (eol) SERIAL_EOL(); @@ -93,6 +96,7 @@ void host_action(PGM_P const pstr, const bool eol) { void host_action_prompt_plus(PGM_P const ptype, PGM_P const pstr, const char extra_char='\0') { host_action_prompt(ptype, false); + PORT_REDIRECT(SERIAL_BOTH); SERIAL_CHAR(' '); serialprintPGM(pstr); if (extra_char != '\0') SERIAL_CHAR(extra_char); From 11e29754e65353e5bff9a0a0d990d8fbd6c1bd07 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 15 Jul 2020 02:53:23 -0500 Subject: [PATCH 157/483] Sanity-check BABYSTEP_MULTIPLICATOR_* --- Marlin/src/inc/SanityCheck.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ba624d061c4f..dd80cae4ff70 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -771,6 +771,15 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "BABYSTEP_HOTEND_Z_OFFSET requires 2 or more HOTENDS." #elif BOTH(BABYSTEP_ALWAYS_AVAILABLE, MOVE_Z_WHEN_IDLE) #error "BABYSTEP_ALWAYS_AVAILABLE and MOVE_Z_WHEN_IDLE are incompatible." + #elif !defined(BABYSTEP_MULTIPLICATOR_Z) + #error "BABYSTEPPING requires BABYSTEP_MULTIPLICATOR_Z." + #elif ENABLED(BABYSTEP_XY) && !defined(BABYSTEP_MULTIPLICATOR_XY) + #error "BABYSTEP_XY requires BABYSTEP_MULTIPLICATOR_XY." + #elif ENABLED(BABYSTEP_MILLIMETER_UNITS) + static_assert(BABYSTEP_MULTIPLICATOR_Z <= 0.1f, "BABYSTEP_MULTIPLICATOR_Z must be less or equal to 0.1mm."); + #if ENABLED(BABYSTEP_XY) + static_assert(BABYSTEP_MULTIPLICATOR_XY <= 0.25f, "BABYSTEP_MULTIPLICATOR_XY must be less than or equal to 0.25mm."); + #endif #endif #endif From 6b0e8e5fd593b118e6acc174a669a1650da47b67 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 17 Jul 2020 00:09:09 +0000 Subject: [PATCH 158/483] [cron] Bump distribution date (2020-07-17) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 6de7cc63466a..f88eef1dd694 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-16" + #define STRING_DISTRIBUTION_DATE "2020-07-17" #endif /** From b8807128893a0ccb2b4633e27a91024dad36ed4f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 16 Jul 2020 21:02:52 -0500 Subject: [PATCH 159/483] Fix material_preset reference issue --- Marlin/src/lcd/ultralcd.cpp | 55 +++++++++++----------- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 6 +-- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 1848a56d2cc7..d9a18ba4eb64 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -20,7 +20,7 @@ * */ -#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" #ifdef LED_BACKLIGHT_TIMEOUT #include "../feature/leds/leds.h" @@ -86,6 +86,32 @@ MarlinUI ui; } #endif +#if PREHEAT_COUNT + preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() + PGM_P MarlinUI::get_preheat_label(const uint8_t m) { + #ifdef PREHEAT_1_LABEL + static PGMSTR(preheat_0_label, PREHEAT_1_LABEL); + #endif + #ifdef PREHEAT_2_LABEL + static PGMSTR(preheat_1_label, PREHEAT_2_LABEL); + #endif + #ifdef PREHEAT_3_LABEL + static PGMSTR(preheat_2_label, PREHEAT_3_LABEL); + #endif + #ifdef PREHEAT_4_LABEL + static PGMSTR(preheat_3_label, PREHEAT_4_LABEL); + #endif + #ifdef PREHEAT_5_LABEL + static PGMSTR(preheat_4_label, PREHEAT_5_LABEL); + #endif + + #define _PLBL(N) preheat_##N##_label, + static PGM_P const preheat_labels[PREHEAT_COUNT] PROGMEM = { REPEAT(PREHEAT_COUNT, _PLBL) }; + + return (PGM_P)pgm_read_ptr(&preheat_labels[m]); + } +#endif + #if HAS_SPI_LCD #if HAS_GRAPHICAL_LCD @@ -149,33 +175,6 @@ millis_t MarlinUI::next_button_update_ms; // = 0 volatile int8_t encoderDiff; // Updated in update_buttons, added to encoderPosition every LCD update #endif -#if PREHEAT_COUNT - preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() - - PGM_P MarlinUI::get_preheat_label(const uint8_t m) { - #ifdef PREHEAT_1_LABEL - static PGMSTR(preheat_0_label, PREHEAT_1_LABEL); - #endif - #ifdef PREHEAT_2_LABEL - static PGMSTR(preheat_1_label, PREHEAT_2_LABEL); - #endif - #ifdef PREHEAT_3_LABEL - static PGMSTR(preheat_2_label, PREHEAT_3_LABEL); - #endif - #ifdef PREHEAT_4_LABEL - static PGMSTR(preheat_3_label, PREHEAT_4_LABEL); - #endif - #ifdef PREHEAT_5_LABEL - static PGMSTR(preheat_4_label, PREHEAT_5_LABEL); - #endif - - #define _PLBL(N) preheat_##N##_label, - static PGM_P const preheat_labels[PREHEAT_COUNT] PROGMEM = { REPEAT(PREHEAT_COUNT, _PLBL) }; - - return (PGM_P)pgm_read_ptr(&preheat_labels[m]); - } -#endif - #if ENABLED(SDSUPPORT) #include "../sd/cardreader.h" diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 2a7a212501b2..6153ddbe6871 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -43,15 +43,15 @@ //#define FLASH_EEPROM_EMULATION // I2C - //#define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 + #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 used only for display settings #if ENABLED(IIC_BL24CXX_EEPROM) #define IIC_EEPROM_SDA PA11 #define IIC_EEPROM_SCL PA12 #define MARLIN_EEPROM_SIZE 0x4000 // 16Kb (24c16) - #else - #define SDCARD_EEPROM_EMULATION // SD EEPROM was in the original build, so... #endif + #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX + // SPI //#define SPI_EEPROM // EEPROM on SPI-0 //#define SPI_CHAN_EEPROM1 ? From 1d6868852ba0f05312bb2594073a807ae98ead42 Mon Sep 17 00:00:00 2001 From: Evgeny Z Date: Fri, 17 Jul 2020 05:40:56 +0300 Subject: [PATCH 160/483] =?UTF-8?q?Chopper=20Timing=20Preset=20for=2024V?= =?UTF-8?q?=200.9=C2=B0=20(#18662)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 1 + Marlin/src/feature/tmc_util.h | 1 + 2 files changed, 2 insertions(+) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index adfdfa0f998c..b44e7c7a640b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2411,6 +2411,7 @@ * CHOPPER_DEFAULT_19V * CHOPPER_DEFAULT_24V * CHOPPER_DEFAULT_36V + * CHOPPER_09STEP_24V // 0.9 degree steppers (24V) * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Prusa firmware for MK3 (24V) * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 * diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 4bf68c474524..de19ddf00a9c 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -35,6 +35,7 @@ #define CHOPPER_DEFAULT_36V { 5, 2, 4 } #define CHOPPER_PRUSAMK3_24V { 3, -2, 6 } #define CHOPPER_MARLIN_119 { 5, 2, 3 } +#define CHOPPER_09STEP_24V { 3, -1, 5 } #if ENABLED(MONITOR_DRIVER_STATUS) && !defined(MONITOR_DRIVER_STATUS_INTERVAL_MS) #define MONITOR_DRIVER_STATUS_INTERVAL_MS 500u From 9424567189a9116f969eb786b41d9a5ca5f02322 Mon Sep 17 00:00:00 2001 From: Sergey1560 <53866542+Sergey1560@users.noreply.github.com> Date: Fri, 17 Jul 2020 05:42:55 +0300 Subject: [PATCH 161/483] Fix passive Chamber Temp reading (#18674) --- Marlin/src/HAL/STM32F1/HAL.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 3a000e76b301..ff9855a5a5cd 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -100,7 +100,7 @@ const uint8_t adc_pins[] = { #if HAS_HEATED_BED TEMP_BED_PIN, #endif - #if HAS_HEATED_CHAMBER + #if HAS_TEMP_CHAMBER TEMP_CHAMBER_PIN, #endif #if HAS_TEMP_ADC_1 @@ -154,7 +154,7 @@ enum TempPinIndex : char { #if HAS_HEATED_BED TEMP_BED, #endif - #if HAS_HEATED_CHAMBER + #if HAS_TEMP_CHAMBER TEMP_CHAMBER, #endif #if HAS_TEMP_ADC_1 @@ -344,7 +344,7 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { #if HAS_HEATED_BED case TEMP_BED_PIN: pin_index = TEMP_BED; break; #endif - #if HAS_HEATED_CHAMBER + #if HAS_TEMP_CHAMBER case TEMP_CHAMBER_PIN: pin_index = TEMP_CHAMBER; break; #endif #if HAS_TEMP_ADC_1 From 6dd2b1210f2810fc410af6aad1f50dcde4e3406e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 16 Jul 2020 22:30:36 -0500 Subject: [PATCH 162/483] Fix check_hotends with > 1 hotend --- Marlin/src/feature/hotend_idle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp index 89c18f7af515..0c8a40e1ebd6 100644 --- a/Marlin/src/feature/hotend_idle.cpp +++ b/Marlin/src/feature/hotend_idle.cpp @@ -43,7 +43,7 @@ millis_t HotendIdleProtection::next_protect_ms = 0; void HotendIdleProtection::check_hotends(const millis_t &ms) { bool do_prot = false; HOTEND_LOOP() { - if (thermalManager.degHotend(active_extruder) >= HOTEND_IDLE_MIN_TRIGGER) { + if (thermalManager.degHotend(e) >= HOTEND_IDLE_MIN_TRIGGER) { do_prot = true; break; } } From e90bbb37d4f956ee4050ff02a4f9b1e0275a87cd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 16 Jul 2020 22:20:55 -0500 Subject: [PATCH 163/483] Tweak and use SD_ORDER --- Marlin/src/lcd/dwin/dwin.cpp | 18 ++++++++++-------- Marlin/src/lcd/menu/menu_media.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 2 +- Marlin/src/sd/cardreader.h | 6 +++++- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index eb804b5e0407..db7bfc6dd768 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -1547,8 +1547,9 @@ millis_t shift_ms; // = 0 inline void Init_Shift_Name() { const bool is_subdir = !card.flag.workDirIsRoot; const int8_t filenum = select_file.now - 1 - is_subdir; // Skip "Back" and ".." - if (WITHIN(filenum, 0, card.get_num_Files() - 1)) { - card.getfilename_sorted(filenum); + const uint16_t fileCnt = card.get_num_Files(); + if (WITHIN(filenum, 0, fileCnt - 1)) { + card.getfilename_sorted(SD_ORDER(filenum, fileCnt)); char * const name = card.longest_filename(); make_name_without_ext(shift_name, name, 100); } @@ -1561,8 +1562,8 @@ inline void Init_SDItem_Shift() { } /** -* Display an SD item, adding a CDUP for subfolders. -*/ + * Display an SD item, adding a CDUP for subfolders. + */ inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { if (row < 0) row = item + 1 + MROWS - index_file; const bool is_subdir = !card.flag.workDirIsRoot; @@ -1617,7 +1618,7 @@ inline void Redraw_SD_List() { // As many files as will fit LOOP_L_N(i, _MIN(nr_sd_menu_items(), MROWS)) - Draw_SDItem(i, i + 1); + Draw_SDItem(i, i + 1); Init_SDItem_Shift(); } @@ -1898,7 +1899,7 @@ void HMI_SelectFile(void) { } else { const uint16_t filenum = select_file.now - 1 - hasUpDir; - card.getfilename_sorted(filenum); + card.getfilename_sorted(SD_ORDER(filenum, card.get_num_Files())); // Enter that folder! if (card.flag.filenameIsDir) { @@ -3415,10 +3416,11 @@ void EachMomentUpdate(void) { DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346); }; - LOOP_L_N(i, card.get_num_Files()) { + const uint16_t fileCnt = card.get_num_Files(); + for (uint16_t i = 0; i < fileCnt; i++) { // TODO: Resume print via M1000 then update the UI // with the active filename which can come from CardReader. - card.getfilename_sorted(i); + card.getfilename_sorted(SD_ORDER(i, fileCnt)); if (!strcmp(card.filename, &recovery.info.sd_filename[1])) { // Resume print before power failure while have the same file recovery_flag = 1; HMI_flag.select_flag = 1; diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index d2514f61d2cb..7b3d1e549c94 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -126,7 +126,7 @@ void menu_media() { if (ui.should_draw()) for (uint16_t i = 0; i < fileCnt; i++) { if (_menuLineNr == _thisItemNr) { - card.getfilename_sorted(i); + card.getfilename_sorted(SD_ORDER(i, fileCnt)); if (card.flag.filenameIsDir) MENU_ITEM(sdfolder, MSG_MEDIA_MENU, card); else diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index beac76531c8d..5b4054f21cbf 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -947,7 +947,7 @@ void CardReader::cdroot() { // Init sort order. for (uint16_t i = 0; i < fileCnt; i++) { - sort_order[i] = SD_ORDER(i, fileCnt); + sort_order[i] = i; // If using RAM then read all filenames now. #if ENABLED(SDSORT_USES_RAM) selectFileByIndex(i); diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 36b81910a822..8efa6c720e09 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -31,7 +31,11 @@ #define SD_RESORT 1 #endif -#define SD_ORDER(N,C) (TERN(SDCARD_RATHERRECENTFIRST, C - 1 - (N), N)) +#if ENABLED(SDCARD_RATHERRECENTFIRST) && DISABLED(SDCARD_SORT_ALPHA) + #define SD_ORDER(N,C) ((C) - 1 - (N)) +#else + #define SD_ORDER(N,C) N +#endif #define MAX_DIR_DEPTH 10 // Maximum folder depth #define MAXDIRNAMELENGTH 8 // DOS folder name size From 4abad60bf199bacd4d43795de54cfcdc77610028 Mon Sep 17 00:00:00 2001 From: JBA <44487003+hub-jba@users.noreply.github.com> Date: Fri, 17 Jul 2020 16:07:09 +1000 Subject: [PATCH 164/483] ExtUI for Anycubic I3 Mega (#18655) --- Marlin/src/gcode/feature/pause/M125.cpp | 2 +- .../extui/lib/anycubic/anycubic_serial.cpp | 294 +++++ .../lcd/extui/lib/anycubic/anycubic_serial.h | 143 +++ .../lcd/extui/lib/anycubic/anycubic_tft.cpp | 1066 +++++++++++++++++ .../src/lcd/extui/lib/anycubic/anycubic_tft.h | 114 ++ Marlin/src/lcd/extui_anycubic_tft.cpp | 104 ++ Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 34 +- 7 files changed, 1753 insertions(+), 4 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp create mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h create mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp create mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h create mode 100644 Marlin/src/lcd/extui_anycubic_tft.cpp diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index 12b0892d5816..cb59985278fa 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -79,7 +79,7 @@ void GcodeSuite::M125() { if (pause_print(retract, park_point, 0, show_lcd)) { TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); - if (!sd_printing || show_lcd) { + if (ENABLED(EXTENSIBLE_UI) || !sd_printing || show_lcd) { wait_for_confirmation(false, 0); resume_print(0, 0, -retract, 0); } diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp new file mode 100644 index 000000000000..3fad103bb415 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp @@ -0,0 +1,294 @@ +/* + anycubic_serial.cpp --- Support for Anycubic i3 Mega TFT serial connection + Created by Christian Hopp on 09.12.17. + + Original file: + HardwareSerial.cpp - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 23 November 2006 by David A. Mellis + Modified 28 September 2010 by Mark Sproul + Modified 14 August 2012 by Alarus +*/ + +#include "../../../../inc/MarlinConfig.h" + +#if ENABLED(ANYCUBIC_TFT_MODEL) + +#include "Arduino.h" + +// this next line disables the entire HardwareSerial.cpp, +// so I can support AtTiny series and other chips without a UART +#ifdef UBRR3H + +#include "anycubic_serial.h" + +#include +#include +#include +#include +#include "wiring_private.h" + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which head is the index of the location +// to which to write the next incoming character and tail is the index of the +// location from which to read. +#if (RAMEND < 1000) + #define SERIAL_BUFFER_SIZE 64 +#else + #define SERIAL_BUFFER_SIZE 128 +#endif + +struct ring_buffer { + unsigned char buffer[SERIAL_BUFFER_SIZE]; + volatile unsigned int head; + volatile unsigned int tail; +}; + +#ifdef UBRR3H + ring_buffer rx_buffer_ajg = { { 0 }, 0, 0 }; + ring_buffer tx_buffer_ajg = { { 0 }, 0, 0 }; +#endif + +inline void store_char(unsigned char c, ring_buffer *buffer) { + int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != buffer->tail) { + buffer->buffer[buffer->head] = c; + buffer->head = i; + } +} + +#if defined(USART3_RX_vect) && defined(UDR3) + void serialEvent3() __attribute__((weak)); + void serialEvent3() {} + #define serialEvent3_implemented + ISR(USART3_RX_vect) { + if (bit_is_clear(UCSR3A, UPE3)) { + unsigned char c = UDR3; + store_char(c, &rx_buffer_ajg); + } + else { + unsigned char c = UDR3; + } + } +#endif + +#ifdef USART3_UDRE_vect + + ISR(USART3_UDRE_vect) { + if (tx_buffer_ajg.head == tx_buffer_ajg.tail) { + // Buffer empty, so disable interrupts + cbi(UCSR3B, UDRIE3); + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer_ajg.buffer[tx_buffer_ajg.tail]; + tx_buffer_ajg.tail = (tx_buffer_ajg.tail + 1) % SERIAL_BUFFER_SIZE; + + UDR3 = c; + } + } + +#endif + +// Constructors //////////////////////////////////////////////////////////////// + +AnycubicSerialClass::AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx_buffer, + volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, + volatile uint8_t *ucsra, volatile uint8_t *ucsrb, + volatile uint8_t *ucsrc, volatile uint8_t *udr, + uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x +) { + _rx_buffer = rx_buffer; + _tx_buffer = tx_buffer; + _ubrrh = ubrrh; + _ubrrl = ubrrl; + _ucsra = ucsra; + _ucsrb = ucsrb; + _ucsrc = ucsrc; + _udr = udr; + _rxen = rxen; + _txen = txen; + _rxcie = rxcie; + _udrie = udrie; + _u2x = u2x; +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void AnycubicSerialClass::begin(unsigned long baud) { + uint16_t baud_setting; + bool use_u2x = true; + + #if F_CPU == 16000000UL + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + if (baud == 57600) use_u2x = false; + #endif + +try_again: + + if (use_u2x) { + *_ucsra = 1 << _u2x; + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } else { + *_ucsra = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } + + if ((baud_setting > 4095) && use_u2x) { + use_u2x = false; + goto try_again; + } + + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + *_ubrrh = baud_setting >> 8; + *_ubrrl = baud_setting; + + transmitting = false; + + sbi(*_ucsrb, _rxen); + sbi(*_ucsrb, _txen); + sbi(*_ucsrb, _rxcie); + cbi(*_ucsrb, _udrie); +} + +void AnycubicSerialClass::begin(unsigned long baud, byte config) { + uint16_t baud_setting; + uint8_t current_config; + bool use_u2x = true; + + #if F_CPU == 16000000UL + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + if (baud == 57600) use_u2x = false; + #endif + +try_again: + + if (use_u2x) { + *_ucsra = 1 << _u2x; + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } + else { + *_ucsra = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } + + if ((baud_setting > 4095) && use_u2x) { + use_u2x = false; + goto try_again; + } + + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + *_ubrrh = baud_setting >> 8; + *_ubrrl = baud_setting; + + //set the data bits, parity, and stop bits + #ifdef __AVR_ATmega8__ + config |= 0x80; // select UCSRC register (shared with UBRRH) + #endif + *_ucsrc = config; + + sbi(*_ucsrb, _rxen); + sbi(*_ucsrb, _txen); + sbi(*_ucsrb, _rxcie); + cbi(*_ucsrb, _udrie); +} + +void AnycubicSerialClass::end() { + // wait for transmission of outgoing data + while (_tx_buffer->head != _tx_buffer->tail) + ; + + cbi(*_ucsrb, _rxen); + cbi(*_ucsrb, _txen); + cbi(*_ucsrb, _rxcie); + cbi(*_ucsrb, _udrie); + + // clear any received data + _rx_buffer->head = _rx_buffer->tail; +} + +int AnycubicSerialClass::available(void) { + return (int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE; +} + +int AnycubicSerialClass::peek(void) { + if (_rx_buffer->head == _rx_buffer->tail) { + return -1; + } else { + return _rx_buffer->buffer[_rx_buffer->tail]; + } +} + +int AnycubicSerialClass::read(void) { + // if the head isn't ahead of the tail, we don't have any characters + if (_rx_buffer->head == _rx_buffer->tail) { + return -1; + } else { + unsigned char c = _rx_buffer->buffer[_rx_buffer->tail]; + _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % SERIAL_BUFFER_SIZE; + return c; + } +} + +void AnycubicSerialClass::flush() { + // UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT + while (transmitting && ! (*_ucsra & _BV(TXC0))); + transmitting = false; +} + +size_t AnycubicSerialClass::write(uint8_t c) { + int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE; + + // If the output buffer is full, there's nothing for it other than to + // wait for the interrupt handler to empty it a bit + // ???: return 0 here instead? + while (i == _tx_buffer->tail) + ; + + _tx_buffer->buffer[_tx_buffer->head] = c; + _tx_buffer->head = i; + + sbi(*_ucsrb, _udrie); + // clear the TXC bit -- "can be cleared by writing a one to its bit location" + transmitting = true; + sbi(*_ucsra, TXC0); + + return 1; +} + +AnycubicSerialClass::operator bool() { + return true; +} + +// Preinstantiate Objects ////////////////////////////////////////////////////// + +#ifdef UBRR3H + AnycubicSerialClass AnycubicSerial(&rx_buffer_ajg, &tx_buffer_ajg, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); +#endif + +#endif // UBRR3H +#endif // ANYCUBIC_TFT_MODEL diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h new file mode 100644 index 000000000000..e7494d38adaf --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h @@ -0,0 +1,143 @@ +/* + anycubic_serial.h --- Support for Anycubic i3 Mega TFT serial connection + Created by Christian Hopp on 09.12.17. + + Original file: + + HardwareSerial.h - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 28 September 2010 by Mark Sproul + Modified 14 August 2012 by Alarus +*/ +#pragma once + +#include +#include + +#include "Stream.h" + +#define FORCE_INLINE __attribute__((always_inline)) inline + +struct ring_buffer; + +class AnycubicSerialClass : public Stream { + private: + ring_buffer *_rx_buffer; + ring_buffer *_tx_buffer; + volatile uint8_t *_ubrrh; + volatile uint8_t *_ubrrl; + volatile uint8_t *_ucsra; + volatile uint8_t *_ucsrb; + volatile uint8_t *_ucsrc; + volatile uint8_t *_udr; + uint8_t _rxen; + uint8_t _txen; + uint8_t _rxcie; + uint8_t _udrie; + uint8_t _u2x; + bool transmitting; + public: + AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx_buffer, + volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, + volatile uint8_t *ucsra, volatile uint8_t *ucsrb, + volatile uint8_t *ucsrc, volatile uint8_t *udr, + uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x + ); + void begin(unsigned long); + void begin(unsigned long, uint8_t); + void end(); + virtual int available(void); + virtual int peek(void); + virtual int read(void); + virtual void flush(void); + virtual size_t write(uint8_t); + inline size_t write(unsigned long n) { return write((uint8_t)n); } + inline size_t write(long n) { return write((uint8_t)n); } + inline size_t write(unsigned int n) { return write((uint8_t)n); } + inline size_t write(int n) { return write((uint8_t)n); } + using Print::write; // pull in write(str) and write(buf, size) from Print + operator bool(); +}; + +// Define config for Serial.begin(baud, config); +#define SERIAL_5N1 0x00 +#define SERIAL_6N1 0x02 +#define SERIAL_7N1 0x04 +#define SERIAL_8N1 0x06 +#define SERIAL_5N2 0x08 +#define SERIAL_6N2 0x0A +#define SERIAL_7N2 0x0C +#define SERIAL_8N2 0x0E +#define SERIAL_5E1 0x20 +#define SERIAL_6E1 0x22 +#define SERIAL_7E1 0x24 +#define SERIAL_8E1 0x26 +#define SERIAL_5E2 0x28 +#define SERIAL_6E2 0x2A +#define SERIAL_7E2 0x2C +#define SERIAL_8E2 0x2E +#define SERIAL_5O1 0x30 +#define SERIAL_6O1 0x32 +#define SERIAL_7O1 0x34 +#define SERIAL_8O1 0x36 +#define SERIAL_5O2 0x38 +#define SERIAL_6O2 0x3A +#define SERIAL_7O2 0x3C +#define SERIAL_8O2 0x3E + +extern void serialEventRun(void) __attribute__((weak)); + +#define ANYCUBIC_SERIAL_PROTOCOL(x) (AnycubicSerial.print(x)) +#define ANYCUBIC_SERIAL_PROTOCOL_F(x,y) (AnycubicSerial.print(x,y)) +#define ANYCUBIC_SERIAL_PROTOCOLPGM(x) (AnycubicSerialprintPGM(PSTR(x))) +#define ANYCUBIC_SERIAL_(x) (AnycubicSerial.print(x),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_PROTOCOLLN(x) (AnycubicSerial.print(x),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) (AnycubicSerialprintPGM(PSTR(x)),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) + +#define ANYCUBIC_SERIAL_START() (AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_CMD_SEND(x) (AnycubicSerialprintPGM(PSTR(x)),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_ENTER() (AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_SPACE() (AnycubicSerial.write(' ')) + +const char newErr[] PROGMEM = "ERR "; +const char newSucc[] PROGMEM = "OK"; + +#define ANYCUBIC_SERIAL_ERROR_START (AnycubicSerialprintPGM(newErr)) +#define ANYCUBIC_SERIAL_ERROR(x) ANYCUBIC_SERIAL_PROTOCOL(x) +#define ANYCUBIC_SERIAL_ERRORPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) +#define ANYCUBIC_SERIAL_ERRORLN(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) +#define ANYCUBIC_SERIAL_ERRORLNPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) + +//##define ANYCUBIC_SERIAL_ECHO_START (AnycubicSerialprintPGM(newSucc)) +#define ANYCUBIC_SERIAL_ECHOLN(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) +#define ANYCUBIC_SERIAL_SUCC_START (AnycubicSerialprintPGM(newSucc)) +#define ANYCUBIC_SERIAL_ECHOPAIR(name,value) (serial_echopair_P(PSTR(name),(value))) +#define ANYCUBIC_SERIAL_ECHOPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) +#define ANYCUBIC_SERIAL_ECHO(x) ANYCUBIC_SERIAL_PROTOCOL(x) + +FORCE_INLINE void AnycubicSerialprintPGM(const char *str) { + char ch=pgm_read_byte(str); + while (ch) { + AnycubicSerial.write(ch); + ch=pgm_read_byte(++str); + } +} + +#ifdef UBRR3H + extern AnycubicSerialClass AnycubicSerial; +#endif diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp new file mode 100644 index 000000000000..718b47fee9b4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp @@ -0,0 +1,1066 @@ +/** + * anycubic_tft.cpp --- Support for Anycubic i3 Mega TFT + * Created by Christian Hopp on 09.12.17. + * Improved by David Ramiro + * Converted to ext_iu by John BouAntoun 21 June 2020 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_TFT_MODEL) + +#include "anycubic_tft.h" +#include "anycubic_serial.h" + +#include "../../../../inc/MarlinConfig.h" +#include "../../ui_api.h" +#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers + +AnycubicTFTClass AnycubicTFT; + +char _conv[8]; + +char *itostr2(const uint8_t &x) { + // sprintf(conv,"%5.1f",x); + int xx = x; + _conv[0] = (xx / 10) % 10 + '0'; + _conv[1] = (xx) % 10 + '0'; + _conv[2] = 0; + return _conv; +} + +#ifndef ULTRA_LCD + #define DIGIT(n) ('0' + (n)) + #define DIGIMOD(n, f) DIGIT((n) / (f) % 10) + #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') + #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) + + char* itostr3(const int x) { + int xx = x; + _conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); + _conv[5] = RJDIGIT(xx, 10); + _conv[6] = DIGIMOD(xx, 1); + return &_conv[4]; + } + +// Convert signed float to fixed-length string with 023.45 / -23.45 format + char *ftostr32(const float &x) { + long xx = x * 100; + _conv[1] = MINUSOR(xx, DIGIMOD(xx, 10000)); + _conv[2] = DIGIMOD(xx, 1000); + _conv[3] = DIGIMOD(xx, 100); + _conv[4] = '.'; + _conv[5] = DIGIMOD(xx, 10); + _conv[6] = DIGIMOD(xx, 1); + return &_conv[1]; + } + +#endif + +AnycubicTFTClass::AnycubicTFTClass() {} + +void AnycubicTFTClass::OnSetup() { + AnycubicSerial.begin(115200); + ANYCUBIC_SENDCOMMAND_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset + ExtUI::delay_ms(10); + + // initialise the state of the key pins running on the tft + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + pinMode(SD_DETECT_PIN, INPUT); + WRITE(SD_DETECT_PIN, HIGH); + #endif + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + pinMode(FIL_RUNOUT_PIN, INPUT); + WRITE(FIL_RUNOUT_PIN, HIGH); + #endif + + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + + // DoSDCardStateCheck(); + ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready + ExtUI::delay_ms(10); + + DoFilamentRunoutCheck(); + SelectedFile[0] = 0; + + #if ENABLED(STARTUP_CHIME) + ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); + #endif + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: Finished startup"); + #endif +} + +void AnycubicTFTClass::OnCommandScan() { + static millis_t nextStopCheck = 0; // used to slow the stopped print check down to reasonable times + const millis_t ms = millis(); + if (ELAPSED(ms, nextStopCheck)) { + nextStopCheck = ms + 1000UL; + if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); + #endif + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status + ExtUI::delay_ms(200); + // tell printer to release resources of print to indicate it is done + ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); + } + } + + if (TFTbuflen < (TFTBUFSIZE - 1)) + GetCommandFromTFT(); + + if (TFTbuflen) { + TFTbuflen = (TFTbuflen - 1); + TFTbufindr = (TFTbufindr + 1) % TFTBUFSIZE; + } +} + +void AnycubicTFTClass::OnKillTFT() { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); +} + +void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered..."); + SERIAL_ECHO(itostr2(isInserted)); + SERIAL_EOL(); + #endif + DoSDCardStateCheck(); +} + +void AnycubicTFTClass::OnSDCardError() { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); + #endif + ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); +} + +void AnycubicTFTClass::OnFilamentRunout() { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); + #endif + DoFilamentRunoutCheck(); +} + +void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: OnUserConfirmRequired triggered... "); + SERIAL_ECHOLN(msg); + #endif + + #if ENABLED(SDSUPPORT) + /** + * Need to handle the process of following states + * "Nozzle Parked" + * "Load Filament" + * "Filament Purging..." + * "HeaterTimeout" + * "Reheat finished." + * + * NOTE: The only way to handle these states is strcmp_P with the msg unfortunately (very expensive) + */ + if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_PARKED; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); + } + else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); + ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); + } + else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_PARKING; + // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out + // disable continue button + // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause + + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); + } + else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); + } + else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); + } + #endif +} + +float AnycubicTFTClass::CodeValue() { + return (strtod(&TFTcmdbuffer[TFTbufindr][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindr] + 1], NULL)); +} + +bool AnycubicTFTClass::CodeSeen(char code) { + TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindr], code); + return (TFTstrchr_pointer != NULL); // Return True if a character was found +} + +bool AnycubicTFTClass::IsNozzleHomed() { + const float xPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::X); + const float yPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::Y); + return WITHIN(xPosition, X_MIN_POS - 0.1, X_MIN_POS + 0.1) && + WITHIN(yPosition, Y_MIN_POS - 0.1, Y_MIN_POS + 0.1); +} + +void AnycubicTFTClass::HandleSpecialMenu() { + /** + * NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. + */ + if (SelectedDirectory[0] == '<') { + switch (SelectedDirectory[1]) { + case 'e': // "" + SpecialMenu = false; + return; + break; + + #if ENABLED(PROBE_MANUALLY) + case '0': + switch (SelectedDirectory[2]) { + case '1': // "<01ZUp0.1>" + SERIAL_ECHOLNPGM("Special Menu: Z Up 0.1"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); + break; + + case '2': // "<02ZUp0.02>" + SERIAL_ECHOLNPGM("Special Menu: Z Up 0.02"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); + break; + + case '3': // "<03ZDn0.02>" + SERIAL_ECHOLNPGM("Special Menu: Z Down 0.02"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); + break; + + case '4': // "<04ZDn0.1>" + SERIAL_ECHOLNPGM("Special Menu: Z Down 0.1"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); + break; + + case '5': // "<05PrehtBed>" + SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); + ExtUI::injectCommands_P(PSTR("M140 S65")); + break; + + case '6': // "<06SMeshLvl>" + SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); + ExtUI::injectCommands_P(PSTR("G29 S1")); + break; + + case '7': // "<07MeshNPnt>" + SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); + ExtUI::injectCommands_P(PSTR("G29 S2")); + break; + + case '8': // "<08HtEndPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); + // need to dwell for half a second to give the fan a chance to start before the pid tuning starts + ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + break; + + case '9': // "<09HtBedPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); + ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + break; + + default: + break; + } + break; + + case '1': + switch (SelectedDirectory[2]) { + case '0': // "<10FWDeflts>" + SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); + ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); + break; + + case '1': // "<11SvEEPROM>" + SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); + ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); + break; + + default: + break; + } + break; + #else // if ENABLED(PROBE_MANUALLY) + case '0': + switch (SelectedDirectory[2]) { + case '1': // "<01PrehtBed>" + SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); + ExtUI::injectCommands_P(PSTR("M140 S65")); + break; + + case '2': // "<02ABL>" + SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); + ExtUI::injectCommands_P(PSTR("G28\nG29")); + break; + + case '3': // "<03HtendPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); + // need to dwell for half a second to give the fan a chance to start before the pid tuning starts + ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + break; + + case '4': // "<04HtbedPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); + ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + break; + + case '5': // "<05FWDeflts>" + SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); + ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); + break; + + case '6': // "<06SvEEPROM>" + SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); + ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); + break; + + case '7': // <07SendM108> + SERIAL_ECHOLNPGM("Special Menu: Send User Confirmation"); + ExtUI::injectCommands_P(PSTR("M108")); + break; + + default: + break; + } + break; + #endif // PROBE_MANUALLY + + default: + break; + } + #if ENABLED(ANYCUBIC_TFT_DEBUG) + } + else { + SERIAL_ECHOPGM("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); + SERIAL_ECHOLN(SelectedDirectory); + #endif + } +} + +void AnycubicTFTClass::RenderCurrentFileList() { + #if ENABLED(SDSUPPORT) + uint16_t selectedNumber = 0; + SelectedDirectory[0] = 0; + SelectedFile[0] = 0; + + ANYCUBIC_SERIAL_PROTOCOLPGM("FN "); // Filelist start + ANYCUBIC_SERIAL_ENTER(); + + if (!ExtUI::isMediaInserted() && !SpecialMenu) { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); + + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + } + else { + if (CodeSeen('S')) + selectedNumber = CodeValue(); + + if (SpecialMenu) + RenderSpecialMenu(selectedNumber); + else + RenderCurrentFolder(selectedNumber); + } + ANYCUBIC_SERIAL_PROTOCOLPGM("END"); // Filelist stop + ANYCUBIC_SERIAL_ENTER(); + #endif // SDSUPPORT +} + +void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { + switch (selectedNumber) { + #if ENABLED(PROBE_MANUALLY) + case 0: // First Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01ZUp0.1>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ZUp0.02>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03ZDn0.02>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04ZDn0.1>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + case 4: // Second Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05PrehtBed>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SMeshLvl>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07MeshNPnt>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<08HtEndPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + case 8: // Third Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<09HtBedPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<10FWDeflts>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<11SvEEPROM>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + #else + case 0: // First Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01PrehtBed>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ABL>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03HtEndPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04HtBedPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + case 4: // Second Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05FWDeflts>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SvEEPROM>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07SendM108>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + #endif // PROBE_MANUALLY + + default: + break; + } +} + +void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { + ExtUI::FileList currentFileList; + uint16_t cnt = selectedNumber; + uint16_t max_files; + uint16_t dir_files = currentFileList.count(); + + if ((dir_files - selectedNumber) < 4) + max_files = dir_files; + else + max_files = selectedNumber + 3; + + for (cnt = selectedNumber; cnt <= max_files; cnt++) { + if (cnt == 0) { // Special Entry + if (currentFileList.isAtRootDir()) { + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + } + else { + ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); + } + } + else { + currentFileList.seek(cnt - 1, false); + + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLN(currentFileList.filename()); + #endif + if (currentFileList.isDir()) { + ANYCUBIC_SERIAL_PROTOCOLPGM("/"); + ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); + ANYCUBIC_SERIAL_PROTOCOLPGM("/"); + ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); + + } + else { + ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); + ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); + } + } + } +} + +void AnycubicTFTClass::OnPrintTimerStarted() { + #if ENABLED(SDSUPPORT) + if (mediaPrintingState == AMPRINTSTATE_PRINTING) + ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print + + #endif +} + +void AnycubicTFTClass::OnPrintTimerPaused() { + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMedia()) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_PARKING; + } + #endif +} + +void AnycubicTFTClass::OnPrintTimerStopped() { + #if ENABLED(SDSUPPORT) + if (mediaPrintingState == AMPRINTSTATE_PRINTING) { + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); + } + // otherwise it was stopped by the printer so don't send print completed signal to TFT + #endif +} + +void AnycubicTFTClass::GetCommandFromTFT() { + char *starpos = NULL; + while (AnycubicSerial.available() > 0 && TFTbuflen < TFTBUFSIZE) { + serial3_char = AnycubicSerial.read(); + if (serial3_char == '\n' || + serial3_char == '\r' || + serial3_char == ':' || + serial3_count >= (TFT_MAX_CMD_SIZE - 1) + ) { + + if (!serial3_count) return; // if empty line + + TFTcmdbuffer[TFTbufindw][serial3_count] = 0; // terminate string + + if ((strchr(TFTcmdbuffer[TFTbufindw], 'A') != NULL)) { + int16_t a_command; + TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); + a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); + + #if ENABLED(ANYCUBIC_TFT_DEBUG) + if ((a_command > 7) && (a_command != 20)) { // No debugging of status polls, please! + SERIAL_ECHOPGM("TFT Serial Command: "); + SERIAL_ECHOLN(TFTcmdbuffer[TFTbufindw]); + } + #endif + + switch (a_command) { + case 0: { // A0 GET HOTEND TEMP + float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SENDCOMMANDPGM_VAL("A0V ", int(hotendActualTemp + 0.5)); + } + break; + + case 1: { // A1 GET HOTEND TARGET TEMP + float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SENDCOMMANDPGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); + } + break; + + case 2: { // A2 GET HOTBED TEMP + float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); + ANYCUBIC_SENDCOMMANDPGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); + } + break; + + case 3: { // A3 GET HOTBED TARGET TEMP + float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); + ANYCUBIC_SENDCOMMANDPGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); + } + break; + + case 4: // A4 GET FAN SPEED + { + float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); + fanPercent = constrain(fanPercent, 0, 100); + ANYCUBIC_SENDCOMMANDPGM_VAL("A4V ", int(fanPercent)); + } + break; + + case 5: // A5 GET CURRENT COORDINATE + { + float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); + float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); + float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); + ANYCUBIC_SERIAL_PROTOCOLPGM("A5V"); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("X: "); + ANYCUBIC_SERIAL_PROTOCOL(xPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("Y: "); + ANYCUBIC_SERIAL_PROTOCOL(yPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("Z: "); + ANYCUBIC_SERIAL_PROTOCOL(zPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 6: // A6 GET SD CARD PRINTING STATUS + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMedia()) { + ANYCUBIC_SERIAL_PROTOCOLPGM("A6V "); + if (ExtUI::isMediaInserted()) { + ANYCUBIC_SERIAL_PROTOCOL(itostr3(int(ExtUI::getProgress_percent()))); + ANYCUBIC_SERIAL_ENTER(); + } + else { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); + } + } + else { + ANYCUBIC_SERIAL_PROTOCOLPGM("A6V ---"); + ANYCUBIC_SERIAL_ENTER(); + } + #endif + break; + + case 7: { // A7 GET PRINTING TIME + uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); + ANYCUBIC_SERIAL_PROTOCOLPGM("A7V "); + if (elapsedSeconds != 0) { // print time + uint32_t elapsedMinutes = elapsedSeconds / 60; + ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes / 60)); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("H"); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes % 60)); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("M"); + } + else { + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("999:999"); + } + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 8: // A8 GET SD LIST + #if ENABLED(SDSUPPORT) + SelectedFile[0] = 0; + RenderCurrentFileList(); + #endif + break; + + case 9: // A9 pause sd print + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMedia()) + PausePrint(); + + #endif + break; + + case 10: // A10 resume sd print + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMediaPaused()) + ResumePrint(); + + #endif + break; + + case 11: // A11 STOP SD PRINT + #if ENABLED(SDSUPPORT) + StopPrint(); + #endif + break; + + case 12: // A12 kill + kill(PSTR(STR_ERR_KILLED)); + break; + + case 13: // A13 SELECTION FILE + #if ENABLED(SDSUPPORT) + if (ExtUI::isMediaInserted()) { + starpos = (strchr(TFTstrchr_pointer + 4, '*')); + if (TFTstrchr_pointer[4] == '/') { + strcpy(SelectedDirectory, TFTstrchr_pointer + 5); + SelectedFile[0] = 0; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + ANYCUBIC_SERIAL_ENTER(); + } + else if (TFTstrchr_pointer[4] == '<') { + strcpy(SelectedDirectory, TFTstrchr_pointer + 4); + SpecialMenu = true; + SelectedFile[0] = 0; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + ANYCUBIC_SERIAL_ENTER(); + } + else { + SelectedDirectory[0] = 0; + + if (starpos != NULL) + *(starpos - 1) = '\0'; + + strcpy(SelectedFile, TFTstrchr_pointer + 4); + ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected + } + } + #endif + break; + + case 14: // A14 START PRINTING + #if ENABLED(SDSUPPORT) + if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) + StartPrint(); + + #endif + break; + + case 15: // A15 RESUMING FROM OUTAGE + // TODO: JBA implement resume form outage + break; + + case 16: { // A16 set hotend temp + unsigned int tempvalue; + if (CodeSeen('S')) { + tempvalue = constrain(CodeValue(), 0, 275); + ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + } + else if (CodeSeen('C') && !ExtUI::isPrinting()) { + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) + ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + tempvalue = constrain(CodeValue(), 0, 275); + ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + } + } + break; + + case 17:// A17 set heated bed temp + { + unsigned int tempbed; + if (CodeSeen('S')) { + tempbed = constrain(CodeValue(), 0, 100); + ExtUI::setTargetTemp_celsius(tempbed, (ExtUI::heater_t)ExtUI::BED); + } + } + break; + + case 18:// A18 set fan speed + { + float fanPercent; + if (CodeSeen('S')) { + fanPercent = CodeValue(); + fanPercent = constrain(fanPercent, 0, 100); + ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + } + else { + fanPercent = 100; + } + ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 19: // A19 stop stepper drivers - sent on stop extrude command and on turn motors off command + if (!ExtUI::isPrinting()) { + quickstop_stepper(); + disable_all_steppers(); + } + + ANYCUBIC_SERIAL_ENTER(); + break; + + case 20: { // A20 read printing speed + int16_t feedrate_percentage = 100; + + if (CodeSeen('S')) + feedrate_percentage = constrain(CodeValue(), 40, 999); + else + ANYCUBIC_SENDCOMMANDPGM_VAL("A20V ", feedrate_percentage); + } + break; + + case 21: // A21 all home + if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { + if (CodeSeen('X')) + ExtUI::injectCommands_P(PSTR("G28 X")); + if (CodeSeen('Y')) + ExtUI::injectCommands_P(PSTR("G28 Y")); + if (CodeSeen('Z')) + ExtUI::injectCommands_P(PSTR("G28 Z")); + } + else if (CodeSeen('C')) { + ExtUI::injectCommands_P(PSTR("G28")); + } + } + break; + + case 22: // A22 move X/Y/Z or extrude + if (!ExtUI::isPrinting()) { + float coorvalue; + unsigned int movespeed = 0; + char commandStr[30]; + char fullCommandStr[38]; + + commandStr[0] = 0; // empty string + if (CodeSeen('F')) // Set feedrate + movespeed = CodeValue(); + + if (CodeSeen('X')) { // Move in X direction + coorvalue = CodeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) + sprintf_P(commandStr, PSTR("G1 X0.1F%i"), movespeed); + else if ((coorvalue <= -0.1) && coorvalue > -1) + sprintf_P(commandStr, PSTR("G1 X-0.1F%i"), movespeed); + else + sprintf_P(commandStr, PSTR("G1 X%iF%i"), int(coorvalue), movespeed); + } + else if (CodeSeen('Y')) { // Move in Y direction + coorvalue = CodeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) + sprintf_P(commandStr, PSTR("G1 Y0.1F%i"), movespeed); + else if ((coorvalue <= -0.1) && coorvalue > -1) + sprintf_P(commandStr, PSTR("G1 Y-0.1F%i"), movespeed); + else + sprintf_P(commandStr, PSTR("G1 Y%iF%i"), int(coorvalue), movespeed); + } + else if (CodeSeen('Z')) { // Move in Z direction + coorvalue = CodeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) + sprintf_P(commandStr, PSTR("G1 Z0.1F%i"), movespeed); + else if ((coorvalue <= -0.1) && coorvalue > -1) + sprintf_P(commandStr, PSTR("G1 Z-0.1F%i"), movespeed); + else + sprintf_P(commandStr, PSTR("G1 Z%iF%i"), int(coorvalue), movespeed); + } + else if (CodeSeen('E')) { // Extrude + coorvalue = CodeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) + sprintf_P(commandStr, PSTR("G1 E0.1F%i"), movespeed); + else if ((coorvalue <= -0.1) && coorvalue > -1) + sprintf_P(commandStr, PSTR("G1 E-0.1F%i"), movespeed); + else + sprintf_P(commandStr, PSTR("G1 E%iF500"), int(coorvalue)); + } + + if (strlen(commandStr) > 0) { + sprintf_P(fullCommandStr, PSTR("G91\n%s\nG90"), commandStr); + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); + SERIAL_ECHOLN(fullCommandStr); + #endif + ExtUI::injectCommands(fullCommandStr); + } + } + ANYCUBIC_SERIAL_ENTER(); + break; + + case 23: // A23 preheat pla + if (!ExtUI::isPrinting()) { + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) + ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + + ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); + ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SERIAL_SUCC_START; + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 24:// A24 preheat abs + if (!ExtUI::isPrinting()) { + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) + ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + + ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); + ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SERIAL_SUCC_START; + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 25: // A25 cool down + if (!ExtUI::isPrinting()) { + ExtUI::setTargetTemp_celsius(0, (ExtUI::heater_t) ExtUI::BED); + ExtUI::setTargetTemp_celsius(0, (ExtUI::extruder_t) ExtUI::E0); + + ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down + } + break; + + case 26: // A26 refresh SD + #if ENABLED(SDSUPPORT) + if (ExtUI::isMediaInserted()) { + if (strlen(SelectedDirectory) > 0) { + ExtUI::FileList currentFileList; + if ((SelectedDirectory[0] == '.') && (SelectedDirectory[1] == '.')) { + currentFileList.upDir(); + } + else { + if (SelectedDirectory[0] == '<') + HandleSpecialMenu(); + else + currentFileList.changeDir(SelectedDirectory); + } + } + } + else { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); + } + + SelectedDirectory[0] = 0; + #endif + break; + + #if ENABLED(SERVO_ENDSTOPS) + case 27: break; // A27 servos angles adjust + #endif + + case 28: // A28 filament test + if (CodeSeen('O')) + NOOP; + else if (CodeSeen('C')) + NOOP; + ANYCUBIC_SERIAL_ENTER(); + break; + + case 33: // A33 get version info + ANYCUBIC_SERIAL_PROTOCOLPGM("J33 "); + ANYCUBIC_SERIAL_PROTOCOLPGM(DETAILED_BUILD_VERSION); + ANYCUBIC_SERIAL_ENTER(); + break; + + default: + break; + } + } + + TFTbufindw = (TFTbufindw + 1) % TFTBUFSIZE; + TFTbuflen += 1; + serial3_count = 0; // clear buffer + } + else { + TFTcmdbuffer[TFTbufindw][serial3_count++] = serial3_char; + } + } +} + +void AnycubicTFTClass::DoSDCardStateCheck() { + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + bool isInserted = ExtUI::isMediaInserted(); + if (isInserted) + ANYCUBIC_SENDCOMMAND_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); + else + ANYCUBIC_SENDCOMMAND_DBG_PGM("J01", "TFT Serial Debug: SD card state changed... !isInserted"); + + #endif +} + +void AnycubicTFTClass::DoFilamentRunoutCheck() { + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + // NOTE: ExtUI::getFilamentRunoutState() only returns the runout state if the job is printing + // we want to actually check the status of the pin here, regardless of printstate + if (READ(FIL_RUNOUT_PIN)) { + if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) { + // play tone to indicate filament is out + ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); + + // tell the user that the filament has run out and wait + ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); + } + else { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); + } + } + #endif // FILAMENT_RUNOUT_SENSOR +} + +void AnycubicTFTClass::StartPrint() { + #if ENABLED(SDSUPPORT) + if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); + SERIAL_ECHO(ExtUI::isPrinting()); + SERIAL_ECHOPGM(" "); + SERIAL_ECHOLN(SelectedFile); + #endif + mediaPrintingState = AMPRINTSTATE_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ExtUI::printFile(SelectedFile); + } + #endif // SDUPPORT +} + +void AnycubicTFTClass::PausePrint() { + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { + mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state + ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause + + // for some reason pausing the print doesn't retract the extruder so force a manual one here + ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); + ExtUI::pausePrint(); + } + #endif +} + +void AnycubicTFTClass::ResumePrint() { + #if ENABLED(SDSUPPORT) + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + if (READ(FIL_RUNOUT_PIN)) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); + #endif + + // trigger the user message box + DoFilamentRunoutCheck(); + + // re-enable the continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still tripped... J18"); + return; + } + #endif + + if (mediaPauseState == AMPAUSESTATE_HEATER_TIMEOUT) { + mediaPauseState = AMPAUSESTATE_REHEATING; + // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out + // // disable the continue button + // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause + + // reheat the nozzle + ExtUI::setUserConfirmed(); + } + else { + mediaPrintingState = AMPRINTSTATE_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + + ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now + ExtUI::resumePrint(); + } + #endif +} + +void AnycubicTFTClass::StopPrint() { + #if ENABLED(SDSUPPORT) + mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); + + // for some reason stopping the print doesn't retract the extruder so force a manual one here + ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); + ExtUI::stopPrint(); + #endif +} + +#endif // ANYCUBIC_TFT_MODEL diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h new file mode 100644 index 000000000000..324dfd213f47 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h @@ -0,0 +1,114 @@ +/** + * anycubic_tft.h --- Support for Anycubic i3 Mega TFT + * Created by Christian Hopp on 09.12.17. + * Improved by David Ramiro + * Converted to ext_iu by John BouAntoun 21 June 2020 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#pragma once + +#include "../../../../inc/MarlinConfigPre.h" +#include "../../../../sd/SdFatConfig.h" // for the FILENAME_LENGTH macro + +// command sending macro's with debugging capability +#define ANYCUBIC_SENDCOMMANDPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) +#define ANYCUBIC_SENDCOMMANDPGM_VAL(x,y) (ANYCUBIC_SERIAL_PROTOCOLPGM(x), ANYCUBIC_SERIAL_PROTOCOLLN(itostr3(y))) +#define ANYCUBIC_SENDCOMMAND(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) +#if ENABLED(ANYCUBIC_TFT_DEBUG) + #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOLNPGM(y)) + #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) +#else + #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) + #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) +#endif + +char *itostr2(const uint8_t &x); +#ifndef ULTRA_LCD + char *itostr3(const int); + char *ftostr32(const float &); +#endif + +#define TFTBUFSIZE 4 +#define TFT_MAX_CMD_SIZE 96 + +enum AnycubicMediaPrintState { + AMPRINTSTATE_NOT_PRINTING, + AMPRINTSTATE_PRINTING, + AMPRINTSTATE_PAUSE_REQUESTED, + AMPRINTSTATE_PAUSED, + AMPRINTSTATE_STOP_REQUESTED +}; + +enum AnycubicMediaPauseState { + AMPAUSESTATE_NOT_PAUSED, + AMPAUSESTATE_PARKING, + AMPAUSESTATE_PARKED, + AMPAUSESTATE_FILAMENT_OUT, + AMPAUSESTATE_FIAMENT_PRUGING, + AMPAUSESTATE_HEATER_TIMEOUT, + AMPAUSESTATE_REHEATING, + AMPAUSESTATE_REHEAT_FINISHED +}; + +class AnycubicTFTClass { +public: + AnycubicTFTClass(); + void OnSetup(); + void OnCommandScan(); + void OnKillTFT(); + void OnSDCardStateChange(bool); + void OnSDCardError(); + void OnFilamentRunout(); + void OnUserConfirmRequired(const char *); + void OnPrintTimerStarted(); + void OnPrintTimerPaused(); + void OnPrintTimerStopped(); + +private: + char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; + int TFTbuflen=0; + int TFTbufindr = 0; + int TFTbufindw = 0; + char serial3_char; + int serial3_count = 0; + char *TFTstrchr_pointer; + uint8_t SpecialMenu = false; + AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + + float CodeValue(); + bool CodeSeen(char); + bool IsNozzleHomed(); + void RenderCurrentFileList(); + void RenderSpecialMenu(uint16_t); + void RenderCurrentFolder(uint16_t); + void GetCommandFromTFT(); + void CheckSDCardChange(); + void CheckPauseState(); + void CheckPrintCompletion(); + void HandleSpecialMenu(); + void DoSDCardStateCheck(); + void DoFilamentRunoutCheck(); + void StartPrint(); + void PausePrint(); + void ResumePrint(); + void StopPrint(); + + char SelectedDirectory[30]; + char SelectedFile[FILENAME_LENGTH]; +}; + +extern AnycubicTFTClass AnycubicTFT; diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_tft.cpp new file mode 100644 index 000000000000..6782f8d9d6af --- /dev/null +++ b/Marlin/src/lcd/extui_anycubic_tft.cpp @@ -0,0 +1,104 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * extui_anycubic_tft.cpp + */ + +#include "../inc/MarlinConfigPre.h" + +#if BOTH(ANYCUBIC_TFT_MODEL, EXTENSIBLE_UI) + +#include "extui/lib/anycubic/anycubic_tft.h" +#include "extui/ui_api.h" + +#include // for the ::tone() call + +namespace ExtUI { + + void onStartup() { AnycubicTFT.OnSetup(); } + void onIdle() { AnycubicTFT.OnCommandScan(); } + void onPrinterKilled(PGM_P const error, PGM_P const component) { AnycubicTFT.OnKillTFT(); } + void onMediaInserted() { AnycubicTFT.OnSDCardStateChange(true); } + void onMediaError() { AnycubicTFT.OnSDCardError(); } + void onMediaRemoved() { AnycubicTFT.OnSDCardStateChange(false); } + void onPlayTone(const uint16_t frequency, const uint16_t duration) { + #if ENABLED(SPEAKER) + ::tone(BEEPER_PIN, frequency, duration); + #endif + } + void onPrintTimerStarted() { AnycubicTFT.OnPrintTimerStarted(); } + void onPrintTimerPaused() { AnycubicTFT.OnPrintTimerPaused(); } + void onPrintTimerStopped() { AnycubicTFT.OnPrintTimerStopped(); } + void onFilamentRunout(const extruder_t extruder) { AnycubicTFT.OnFilamentRunout(); } + void onUserConfirmRequired(const char * const msg) { AnycubicTFT.OnUserConfirmRequired(msg); } + void onStatusChanged(const char * const msg) {} + void onFactoryReset() {} + + void onStoreSettings(char *buff) { + // Called when saving to EEPROM (i.e. M500). If the ExtUI needs + // permanent data to be stored, it can write up to eeprom_data_size bytes + // into buff. + + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); + } + + void onLoadSettings(const char *buff) { + // Called while loading settings from EEPROM. If the ExtUI + // needs to retrieve data, it should copy up to eeprom_data_size bytes + // from buff + + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); + } + + void onConfigurationStoreWritten(bool success) { + // Called after the entire EEPROM has been written, + // whether successful or not. + } + + void onConfigurationStoreRead(bool success) { + // Called after the entire EEPROM has been read, + // whether successful or not. + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + } + + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume() { + // Called on resume from power-loss + } + #endif + + #if HAS_PID_HEATING + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + } + #endif +} + +#endif // ANYCUBIC_TFT_MODEL && EXTENSIBLE_UI diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index a512aa8353fe..ce3160ffe93e 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -38,15 +38,38 @@ #endif // -// Custom Limit Switches +// Limit Switches // //#define ANYCUBIC_4_MAX_PRO_ENDSTOPS + +#define X_MIN_PIN 3 + #if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) #define X_MAX_PIN 43 - #define Y_MIN_PIN 19 +#else + #define X_MAX_PIN 43 +#endif + +#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) + #define Y_STOP_PIN 19 +#else + #define Y_STOP_PIN 42 +#endif + +#define Z_STOP_PIN 18 + +// +// Z Probe (when not Z_MIN_PIN) +// +#define Z_MIN_PROBE_PIN 2 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 19 #endif -// Labeled pins +// +// Heaters / Fans +// #define TG_HEATER_BED_PIN 8 #define TG_HEATER_0_PIN 10 #define TG_HEATER_1_PIN 45 // Anycubic Kossel: Unused @@ -55,6 +78,11 @@ #define TG_FAN1_PIN 7 // Anycubic Kossel: Unused #define TG_FAN2_PIN 44 // Anycubic Kossel: Hotend fan +#define CONTROLLER_FAN_PIN TG_FAN1_PIN + +#define BEEPER_PIN 31 +#define SD_DETECT_PIN 49 + // Remap MOSFET pins to common usages: #define RAMPS_D10_PIN TG_HEATER_0_PIN // HEATER_0_PIN is always RAMPS_D10_PIN in pins_RAMPS.h From bd0430dc38baa8cbea3a07150464ef62bb17bd92 Mon Sep 17 00:00:00 2001 From: George Fu Date: Fri, 17 Jul 2020 20:40:28 +0800 Subject: [PATCH 165/483] Support FT81050 with FYSETC F6 (#18678) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 1 + .../lib/ftdi_eve_touch_ui/pin_mappings.h | 154 ++++++++---------- 2 files changed, 72 insertions(+), 83 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b44e7c7a640b..4579ec66710d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1436,6 +1436,7 @@ //#define AO_EXP2_PINMAP // AlephObjects CLCD UI EXP2 mapping //#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping //#define S6_TFT_PINMAP // FYSETC S6 pin mapping + //#define F6_TFT_PINMAP // FYSETC F6 pin mapping //#define OTHER_PIN_LAYOUT // Define pins manually below #if ENABLED(OTHER_PIN_LAYOUT) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h index 208210b0804c..a5068fe97227 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h @@ -27,19 +27,19 @@ * without adding new pin definitions to the board. */ -#ifdef S6_TFT_PINMAP - #ifndef __MARLIN_FIRMWARE__ - #error "This pin mapping requires Marlin." - #endif +#include "../../../../inc/MarlinConfig.h" + +#if ENABLED(F6_TFT_PINMAP) // FYSETC F6 - ATmega2560 + + #define CLCD_SPI_CS 33 + #define CLCD_MOD_RESET 31 + +#elif ENABLED(S6_TFT_PINMAP) // FYSETC S6 - STM32F4 #define CLCD_SPI_CS PC7 #define CLCD_MOD_RESET PC6 -#endif -#ifdef CR10_TFT_PINMAP - #ifndef __MARLIN_FIRMWARE__ - #error "This pin mapping requires Marlin." - #endif +#elif ENABLED(CR10_TFT_PINMAP) // FYSETC S6 - STM32F4 - with TOUCH_UI_ULTIPANEL #define CLCD_USE_SOFT_SPI #define CLCD_SOFT_SPI_SCLK LCD_PINS_D4 // PORTA1 Pin 6 @@ -49,17 +49,13 @@ #define CLCD_MOD_RESET 11 // PORTD3 BTN_EN1 Pin 3 #define CLCD_AUX_0 10 // PORTD2 BTN_EN2 Pin 5 #define CLCD_AUX_1 BEEPER_PIN // PORTA4 Pin 1 -#endif -/** - * The AlephObjects pinout for re-purposing the UltraLCD - * connector EXP1 for software SPI (rev B, obsolete) - */ +#elif ENABLED(AO_EXP1_DEPRECATED_PINMAP) -#ifdef AO_EXP1_DEPRECATED_PINMAP - #ifndef __MARLIN_FIRMWARE__ - #error "This pin mapping requires Marlin." - #endif + /** + * This AlephObjects pinout re-purposes the UltraLCD + * connector EXP1 for Software SPI (rev B, obsolete) + */ #define CLCD_MOD_RESET LCD_PINS_D4 #define CLCD_SPI_CS LCD_PINS_D5 @@ -72,34 +68,30 @@ #define CLCD_SOFT_SPI_SCLK LCD_PINS_D7 #define CLCD_SOFT_SPI_MOSI LCD_PINS_D6 #define CLCD_SOFT_SPI_MISO LCD_PINS_RS -#endif -/** - * AO_EXP1_PINMAP - * - * The AlephObjects mapping for re-purposing the UltraLCD - * connector EXP1 for software SPI for display (rev C): - * - * EXP2: FTDI: SD -or- USB [1]: ULTRA_LCD: - * 1 MISO MISO MISO --> BEEPER - * 2 SCLK SCLK SCLK --> BTN_ENC - * 3 PD_N - - --> LCDE - * 4 - CS_N CS_N --> LCDRS - * 5 CS_N - - --> LCD4 - * 6 MOSI MOSI MOSI --> LCD5 - * 7 - SD_DET INT --> LCD6 - * 8 RESET - RESET --> LCD4 - * 9 GND GND GND --> GND - * 10 5V 5V 5V --> 5V - * - * [1] At the moment, Marlin does not support SD or USB - * functionality over software SPI. - */ - -#ifdef AO_EXP1_PINMAP - #ifndef __MARLIN_FIRMWARE__ - #error "This pin mapping requires Marlin." - #endif +#elif ENABLED(AO_EXP1_PINMAP) + + /** + * AO_EXP1_PINMAP with TOUCH_UI_ULTIPANEL + * + * This AlephObjects mapping re-purposes the UltraLCD + * connector EXP1 for Software SPI for display (rev C): + * + * EXP2: FTDI: SD -or- USB [1]: ULTRA_LCD: + * 1 MISO MISO MISO --> BEEPER + * 2 SCLK SCLK SCLK --> BTN_ENC + * 3 PD_N - - --> LCDE + * 4 - CS_N CS_N --> LCDRS + * 5 CS_N - - --> LCD4 + * 6 MOSI MOSI MOSI --> LCD5 + * 7 - SD_DET INT --> LCD6 + * 8 RESET - RESET --> LCD4 + * 9 GND GND GND --> GND + * 10 5V 5V 5V --> 5V + * + * [1] At the moment, Marlin does not support SD or USB + * functionality over software SPI. + */ #define CLCD_MOD_RESET LCD_PINS_ENABLE #define CLCD_SPI_CS LCD_PINS_D4 @@ -108,49 +100,45 @@ #define CLCD_SOFT_SPI_SCLK BTN_ENC #define CLCD_SOFT_SPI_MOSI LCD_PINS_D5 #define CLCD_SOFT_SPI_MISO BEEPER_PIN -#endif -/** - * AO_EXP2_PINMAP - * - * The AlephObjects mapping for re-purposing the UltraLCD - * connector EXP2 for hardware SPI for display and SD card - * or USB (rev C): - * - * EXP2: FTDI: SD -or- USB: ULTRA_LCD: - * 1 MISO MISO MISO --> MISO - * 2 SCLK SCLK SCLK --> SCLK - * 3 PD_N - - --> BTN_EN2 - * 4 - CS_N CS_N --> SD_CSEL - * 5 CS_N - - --> BTN_EN1 - * 6 MOSI MOSI MOSI --> MOSI - * 7 - SD_DET INT --> SD_DET - * 8 RESET - RESET --> RESET - * 9 GND GND GND --> GND - * 10 5V 5V 5V --> KILL [3] - * - * [1] This configuration allows daisy-chaining of the - * display and SD/USB on EXP2, except for [2] - * - * [2] The Ultimachine Einsy boards have a level shifter - * on MISO enabled by SD_CSEL chip select, hence it - * is not possible to run both the display and the - * SD/USB on EXP2. - * - * [3] Archim Rambo provides 5V on this pin. On any other - * board, divert this wire from the ribbon cable and - * connect it to 5V at an endstop. - */ - -#ifdef AO_EXP2_PINMAP - #ifndef __MARLIN_FIRMWARE__ - #error "This pin mapping requires Marlin." - #endif +#elif ENABLED(AO_EXP2_PINMAP) + + /** + * AO_EXP2_PINMAP with TOUCH_UI_ULTIPANEL + * + * The AlephObjects mapping for re-purposing the UltraLCD + * connector EXP2 for hardware SPI for display and SD card + * or USB (rev C): + * + * EXP2: FTDI: SD -or- USB: ULTRA_LCD: + * 1 MISO MISO MISO --> MISO + * 2 SCLK SCLK SCLK --> SCLK + * 3 PD_N - - --> BTN_EN2 + * 4 - CS_N CS_N --> SD_CSEL + * 5 CS_N - - --> BTN_EN1 + * 6 MOSI MOSI MOSI --> MOSI + * 7 - SD_DET INT --> SD_DET + * 8 RESET - RESET --> RESET + * 9 GND GND GND --> GND + * 10 5V 5V 5V --> KILL [3] + * + * [1] This configuration allows daisy-chaining of the + * display and SD/USB on EXP2, except for [2] + * + * [2] The Ultimachine Einsy boards have a level shifter + * on MISO enabled by SD_CSEL chip select, hence it + * is not possible to run both the display and the + * SD/USB on EXP2. + * + * [3] Archim Rambo provides 5V on this pin. On any other + * board, divert this wire from the ribbon cable and + * connect it to 5V at an endstop. + */ #define CLCD_SPI_CS BTN_EN1 #define CLCD_MOD_RESET BTN_EN2 - #if MB(EINSY_RAMBO, EINSY_RETRO) && DISABLED(SDSUPPORT) #define CLCD_SPI_EXTRA_CS SDSS #endif + #endif From e34684a9c7fac4b122e866e24f1599ad2dffd17d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 16 Jul 2020 22:36:49 -0500 Subject: [PATCH 166/483] Smaller SD EEPROM file on Ender 3 V2 --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 6153ddbe6871..4c9aa1627081 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -47,10 +47,11 @@ #if ENABLED(IIC_BL24CXX_EEPROM) #define IIC_EEPROM_SDA PA11 #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x4000 // 16Kb (24c16) + //#define MARLIN_EEPROM_SIZE 0x4000 // 16Kb (24c16) #endif #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX + #define MARLIN_EEPROM_SIZE 0x1000 // 4Kb // SPI //#define SPI_EEPROM // EEPROM on SPI-0 From f4aba996244604afd27cfcf6d5f2654aab597f56 Mon Sep 17 00:00:00 2001 From: Markus Towara Date: Fri, 17 Jul 2020 19:33:45 +0200 Subject: [PATCH 167/483] Use safe_delay for PSU_POWERUP_DELAY (#18680) Co-authored-by: Scott Lahteine --- Marlin/src/feature/power.cpp | 4 ++-- Marlin/src/gcode/control/M80_M81.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 5df016a2d21d..4ba3e30a243a 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -105,9 +105,9 @@ void Power::power_on() { lastPowerOn = millis(); if (!powersupply_on) { PSU_PIN_ON(); - delay(PSU_POWERUP_DELAY); + safe_delay(PSU_POWERUP_DELAY); restore_stepper_drivers(); - TERN_(HAS_TRINAMIC_CONFIG, delay(PSU_POWERUP_DELAY)); + TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); } } diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 6ba094902700..98efcce04dad 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -72,9 +72,9 @@ #endif #if DISABLED(AUTO_POWER_CONTROL) - delay(PSU_POWERUP_DELAY); + safe_delay(PSU_POWERUP_DELAY); restore_stepper_drivers(); - TERN_(HAS_TRINAMIC_CONFIG, delay(PSU_POWERUP_DELAY)); + TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); #endif TERN_(HAS_LCD_MENU, ui.reset_status()); From c2363a81b47a4c5ced63fa0765c67c0a4ccf462f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 17 Jul 2020 11:39:07 -0500 Subject: [PATCH 168/483] Fix E3V2 M0/M1 and wait_for_user --- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/lcd/dwin/rotary_encoder.cpp | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index e6376aec21cc..849add1df959 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -109,7 +109,7 @@ #if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) #define HAS_SOFTWARE_ENDSTOPS 1 #endif -#if ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER, HAS_ADC_BUTTONS) +#if ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER, HAS_ADC_BUTTONS, DWIN_CREALITY_LCD) #define HAS_RESUME_CONTINUE 1 #endif diff --git a/Marlin/src/lcd/dwin/rotary_encoder.cpp b/Marlin/src/lcd/dwin/rotary_encoder.cpp index 71a0772d5a9f..e4d60b4ce377 100644 --- a/Marlin/src/lcd/dwin/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/rotary_encoder.cpp @@ -49,9 +49,9 @@ ENCODER_Rate EncoderRate; /*蜂鸣器å“*/ void Encoder_tick(void) { - WRITE(BEEPER_PIN,1); + WRITE(BEEPER_PIN, 1); delay(10); - WRITE(BEEPER_PIN,0); + WRITE(BEEPER_PIN, 0); } /*ç¼–ç å™¨åˆå§‹åŒ– PB12:Encoder_A PB13:Encoder_B PB14:Encoder_C*/ @@ -88,7 +88,9 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) { #if PIN_EXISTS(LCD_LED) //LED_Action(); #endif - return ENCODER_DIFF_ENTER; + const bool was_waiting = wait_for_user; + wait_for_user = false; + return was_waiting ? ENCODER_DIFF_NO : ENCODER_DIFF_ENTER; } else return ENCODER_DIFF_NO; } From f51388f287f43f2bdf11662a0d6a54c9b4cef799 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 18 Jul 2020 00:09:19 +0000 Subject: [PATCH 169/483] [cron] Bump distribution date (2020-07-18) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f88eef1dd694..cd21807977a1 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-17" + #define STRING_DISTRIBUTION_DATE "2020-07-18" #endif /** From b9d4b0ddce6be756ce364eefc8647cf3aadc9da1 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 18 Jul 2020 19:23:42 -0300 Subject: [PATCH 170/483] Chitu V6 - Stepper Z2 pins (#18683) --- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index f8c1375cb477..a686b8af8311 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -73,6 +73,10 @@ #define Z_STEP_PIN PB9 #define Z_DIR_PIN PE0 +#define Z2_ENABLE_PIN PF3 +#define Z2_STEP_PIN PF5 +#define Z2_DIR_PIN PF1 + #define E0_ENABLE_PIN PB8 #define E0_STEP_PIN PB4 #define E0_DIR_PIN PB5 From 6f0885a3a39deb1fadf45b11b88410c5c14637a7 Mon Sep 17 00:00:00 2001 From: yufanyufan Date: Sat, 18 Jul 2020 15:26:00 -0700 Subject: [PATCH 171/483] Fix DGUS write variable endianness (#18689) --- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 4 ++++ Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index b3325703dc21..1cef323926be 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -1180,6 +1180,10 @@ void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t values } } +void DGUSDisplay::WriteVariable(uint16_t adr, uint16_t value) { + WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); +} + void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { const char* myvalues = static_cast(values); bool strend = !myvalues; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index 9eddfcf3b5b8..fea33c73d4fb 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -54,10 +54,7 @@ class DGUSDisplay { // Variable access. static void WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false); static void WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false); - template - static void WriteVariable(uint16_t adr, T value) { - WriteVariable(adr, static_cast(&value), sizeof(T)); - } + static void WriteVariable(uint16_t adr, uint16_t value); // Until now I did not need to actively read from the display. That's why there is no ReadVariable // (I extensively use the auto upload of the display) From afce012960e474c41e3b52ea75d19178cad6019b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus=20N=C3=A4veke?= Date: Sun, 19 Jul 2020 00:40:10 +0200 Subject: [PATCH 172/483] Trigorilla Pro board (#18692) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 157 ++++++++++++++++++ platformio.ini | 8 + 4 files changed, 168 insertions(+) create mode 100644 Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index e2c3c888f73f..3f692c12147d 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -311,6 +311,7 @@ #define BOARD_CHITU3D_V5 4030 // Chitu3D TronXY X5SA V5 Board #define BOARD_CHITU3D_V6 4031 // Chitu3D TronXY X5SA V5 Board #define BOARD_CREALITY_V4 4032 // Creality v4.x (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4033 // Trigorilla Pro (STM32F103ZET6) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index f81f8f42f23a..3e1e04404658 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -546,6 +546,8 @@ #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 env:chitu_f103_lvgl #elif MB(CREALITY_V4) #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality +#elif MB(TRIGORILLA_PRO) + #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro // // ARM Cortex-M4F diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h new file mode 100644 index 000000000000..0aec1f88c75c --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -0,0 +1,157 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * ANYCUBIC Trigorilla Pro (STM32F130ZET6) board pin assignments. + * It is the same used by the Tronxy X5SA thanks to ftoz1 for sharing it + * https://github.com/MarlinFirmware/Marlin/issues/14655 + * https://github.com/MarlinFirmware/Marlin/files/3401484/x5sa-main_board-2.pdf + */ + +#ifndef __STM32F1__ + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Trigorilla Pro supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Trigorilla Pro" +#define DISABLE_JTAG + +// +// EEPROM +// +#define FLASH_EEPROM_EMULATION +#if ENABLED(FLASH_EEPROM_EMULATION) + // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) + #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE) + #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE +#else + #define MARLIN_EEPROM_SIZE (0x800U) // On SD, Limit to 2KB, require this amount of RAM +#endif + +// +// Limit Switches +// +#define X_MAX_PIN PG10 +#define Y_MAX_PIN PA12 +#define Z_MAX_PIN PA14 +#define Z_MIN_PIN PA13 + +// +// Steppers +// +#define X_ENABLE_PIN PC13 +#define X_STEP_PIN PE5 +#define X_DIR_PIN PE6 + +#define Y_ENABLE_PIN PE4 +#define Y_STEP_PIN PE2 +#define Y_DIR_PIN PE3 + +#define Z_ENABLE_PIN PE1 +#define Z_STEP_PIN PB9 +#define Z_DIR_PIN PE0 + +#define E0_ENABLE_PIN PB8 +#define E0_STEP_PIN PB4 +#define E0_DIR_PIN PB5 + +#define E1_ENABLE_PIN PG8 +#define E1_STEP_PIN PC7 +#define E1_DIR_PIN PC6 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA1 // TH1 +#define TEMP_BED_PIN PA0 // TB1 + +// +// Heaters +// +#define HEATER_0_PIN PG12 // HEATER1 +#define HEATER_BED_PIN PG11 // HOT BED +#define HEATER_BED_INVERTING true + +// +// Fans +// +#define CONTROLLER_FAN_PIN PD6 // FAN +#define FAN_PIN PG13 // FAN +#define FAN1_PIN PG14 // FAN + +// +// Misc +// +#define BEEPER_PIN PB0 +#define LED_PIN PD3 +//#define POWER_LOSS_PIN PG2 // PG4 PW_DET +#define FIL_RUNOUT_PIN PA15 // MT_DET + +/** + * Note: MKS Robin TFT screens use various TFT controllers + * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) + * ILI9488 is not supported. + * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp + * + * If the screen stays white, disable 'LCD_RESET_PIN' to let the bootloader init the screen. + * + * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu + * because Marlin uses the reset as a failsafe to revive a glitchy LCD. + */ +#define LCD_RESET_PIN PF11 +#define LCD_BACKLIGHT_PIN PD13 +#define FSMC_CS_PIN PD7 // NE4 +#define FSMC_RS_PIN PD11 // A0 + +#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT +#define FSMC_DMA_DEV DMA2 +#define FSMC_DMA_CHANNEL DMA_CH5 + +#if ENABLED(TOUCH_BUTTONS) + #define TOUCH_CS_PIN PB7 // SPI2_NSS + #define TOUCH_SCK_PIN PA5 // SPI2_SCK + #define TOUCH_MISO_PIN PA6 // SPI2_MISO + #define TOUCH_MOSI_PIN PA7 // SPI2_MOSI +#endif + +// SPI1(PA7) & SPI3(PB5) not available +#define ENABLE_SPI2 + +#if ENABLED(SDIO_SUPPORT) + #define SCK_PIN PB13 // SPI2 ok + #define MISO_PIN PB14 // SPI2 ok + #define MOSI_PIN PB15 // SPI2 ok + #define SS_PIN PC11 // PB12 is X- ok + #define SD_DETECT_PIN -1 // SD_CD ok +#else + // SD as custom software SPI (SDIO pins) + #define SCK_PIN PC12 + #define MISO_PIN PC8 + #define MOSI_PIN PD2 + #define SS_PIN -1 + #define ONBOARD_SD_CS_PIN PC11 + #define SDSS PD2 + #define SD_DETECT_PIN -1 +#endif diff --git a/platformio.ini b/platformio.ini index 7cc3adaa90a9..762a66f920e9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -586,6 +586,14 @@ platform = ${common_stm32f1.platform} extends = env:mks_robin extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_pro.py + +# +# TRIGORILLA PRO (STM32F103ZET6) +# +[env:trigorilla_pro] +platform = ${common_stm32f1.platform} +extends = env:mks_robin + # # MKS Robin E3D (STM32F103RCT6) and # MKS Robin E3 with TMC2209 From a3795e3e48effb244c9f7a0a5b60402875efb368 Mon Sep 17 00:00:00 2001 From: cr20-123 <66994235+cr20-123@users.noreply.github.com> Date: Sat, 18 Jul 2020 18:41:47 -0400 Subject: [PATCH 173/483] Prettier BLTouch menu items (#18682) --- Marlin/Configuration_adv.h | 4 ++-- Marlin/src/lcd/language/language_en.h | 16 ++++++++-------- Marlin/src/lcd/language/language_es.h | 16 ++++++++-------- Marlin/src/lcd/language/language_fr.h | 14 +++++++------- Marlin/src/lcd/language/language_gl.h | 16 ++++++++-------- Marlin/src/lcd/language/language_hu.h | 16 ++++++++-------- Marlin/src/lcd/language/language_pl.h | 12 ++++++------ Marlin/src/lcd/language/language_ro.h | 16 ++++++++-------- Marlin/src/lcd/language/language_sk.h | 16 ++++++++-------- Marlin/src/lcd/language/language_tr.h | 14 +++++++------- Marlin/src/lcd/language/language_zh_CN.h | 16 ++++++++-------- 11 files changed, 78 insertions(+), 78 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 4579ec66710d..e57f7c529a1a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -645,8 +645,8 @@ * Do not activate settings that the probe might not understand. Clones might misunderstand * advanced commands. * - * Note: If the probe is not deploying, check a "Cmd: Reset" and "Cmd: Self-Test" and then - * check the wiring of the BROWN, RED and ORANGE wires. + * Note: If the probe is not deploying, do a "Reset" and "Self-Test" and then check the + * wiring of the BROWN, RED and ORANGE wires. * * Note: If the trigger signal of your probe is not being recognized, it has been very often * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable" diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index ba8cf1cfecb9..48c6e5b1a368 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -414,14 +414,14 @@ namespace Language_en { PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Probe Past Bed"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Skew Factor"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Stow"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Deploy"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Mode-Store"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Stow"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Deploy"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index bd63e6479e52..0af31f9a3c61 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -385,14 +385,14 @@ namespace Language_es { PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fuera cama"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Factor de desviación"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Auto-Prueba"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reiniciar"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Subir pistón"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Bajar pistón"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: Modo Software"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: Modo 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: Modo OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Modo almacenar"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Auto-Prueba"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reiniciar"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Subir pistón"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Bajar pistón"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Modo Software"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Modo 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Modo OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Modo almacenar"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Poner BLTouch a 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Poner BLTouch a OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Informe de drenaje"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 72cbfcf3c137..5205205ce6c3 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -372,13 +372,13 @@ namespace Language_fr { PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonde Z hors lit"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Facteur écart"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Ranger"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Déployer"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: Mode SW"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: Mode 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: Mode OD"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Ranger"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Déployer"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Mode SW"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Mode 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Mode OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Appliquer Mode"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Mise en 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Mise en OD"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 66187e8a6b72..6f4c5e5e711e 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -407,14 +407,14 @@ namespace Language_gl { PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda-Z fóra Cama"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Factor de Desviación"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Auto-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reiniciar"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Recoller"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Estender"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: Modo Software"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: Modo 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: Modo OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Modo Almacenar"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Auto-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reiniciar"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Recoller"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estender"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Modo Software"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Modo 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Modo OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Modo Almacenar"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Axustar BLTouch a 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Axustar BLTouch a OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Modo de Informe"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index de38cb52dae6..d84155f419f5 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -409,14 +409,14 @@ namespace Language_hu { PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z szonda tálcán kivül"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Ferdeség Faktor"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Önteszt"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Visszaállítás"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Elhelyez"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Telepít"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW-Mód"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V-Mód"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD-Mód"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Módok"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Önteszt"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Visszaállítás"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Elhelyez"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Telepít"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mód"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mód"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mód"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Módok"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V Mód"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD Mód"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Jelentés"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 9e77eb92d1c5..12bab2380411 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -360,12 +360,12 @@ namespace Language_pl { PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Self-Test"); PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Stow"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Deploy"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Mode-Store"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Stow"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Deploy"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 51f1a00101f1..de9c1106dea2 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -412,14 +412,14 @@ namespace Language_ro { PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Probe Past Bed"); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Skew Factor"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Stow"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Deploy"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Mode-Store"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Stow"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Deploy"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mode"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index a4c47951f1b5..982803b1734b 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -400,14 +400,14 @@ namespace Language_sk { PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z mimo podl."); PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Faktor skosenia"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Zasunúť"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Vysunúť"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: Režim SW"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: Režim 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: Režim OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Ulož. režim"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Zasunúť"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Vysunúť"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Režim SW"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Režim 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Režim OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Ulož. režim"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Prepnúť do 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Prepnúť do OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("ZobraziÅ¥ režim"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 9ff62d70d636..484ece89d510 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -385,13 +385,13 @@ namespace Language_tr { PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Çarpıklık Faktörü"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch K. Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: Kapat"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: Aç"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW-Modu"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V-Modu"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD-Modu"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: Mode-Store"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Kapat"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Aç"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Modu"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Modu"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Modu"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V Ayarla"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD Ayarla"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Drenaj Raporu"); diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 512d77aa2211..d0fd130a933c 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -411,14 +411,14 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z探针在热床之外"); //"Z probe out. bed" Z probe is not within the physical limits PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("å斜因数"); // "Skew Factor" PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); // "BLTouch" - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Cmd: 自检"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Cmd: é‡ç½®"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cmd: 装载"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Cmd: 部署"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Cmd: SW模å¼"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Cmd: 5V模å¼"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Cmd: OD模å¼"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Cmd: 模å¼ä¿å­˜"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("自检"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("é‡ç½®"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("装载"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("部署"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW模å¼"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V模å¼"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD模å¼"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("模å¼ä¿å­˜"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("设置BLTouch为5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("设置BLTouch为OD"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("报告Drain"); From d579b70b7e58b3cf49be668b5b87ea57a8971c9a Mon Sep 17 00:00:00 2001 From: Pascal de Bruijn Date: Sun, 19 Jul 2020 00:46:19 +0200 Subject: [PATCH 174/483] Return to Status on PID Autotune (#18695) --- Marlin/src/lcd/menu/menu_advanced.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index d5e0fcd85829..3def4689a5b9 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -187,6 +187,7 @@ void menu_cancelobject(); #endif ); queue.inject(cmd); + ui.return_to_status(); } #endif // PID_AUTOTUNE_MENU From 0ddef5544a12847eff9163996844c5cd329cecc0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 18 Jul 2020 18:54:44 -0500 Subject: [PATCH 175/483] Misc formatting, cleanup --- Marlin/src/feature/tmc_util.h | 2 +- .../screens/stress_test_screen.cpp | 39 +++++++++---------- Marlin/src/lcd/ultralcd.cpp | 8 ++-- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index de19ddf00a9c..6b7501723c86 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -35,7 +35,7 @@ #define CHOPPER_DEFAULT_36V { 5, 2, 4 } #define CHOPPER_PRUSAMK3_24V { 3, -2, 6 } #define CHOPPER_MARLIN_119 { 5, 2, 3 } -#define CHOPPER_09STEP_24V { 3, -1, 5 } +#define CHOPPER_09STEP_24V { 3, -1, 5 } #if ENABLED(MONITOR_DRIVER_STATUS) && !defined(MONITOR_DRIVER_STATUS_INTERVAL_MS) #define MONITOR_DRIVER_STATUS_INTERVAL_MS 500u diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp index 795878f1310e..bcb6c56766eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -87,9 +87,8 @@ void StressTestScreen::runTestOnBootup(bool enable) { } void StressTestScreen::startupCheck() { - if (LockScreen::get_hash() == 0xDEAD) { + if (LockScreen::get_hash() == 0xDEAD) GOTO_SCREEN(StressTestScreen); - } } void StressTestScreen::onEntry() { @@ -120,20 +119,20 @@ void StressTestScreen::onIdle() { reset_menu_timeout(); if (!commandsInQueue()) { - if (!isPositionKnown()) { - extern const char G28_STR[]; - injectCommands_P(G28_STR); - } - else { - injectCommands_P(PSTR( - "G0 X100 Y100 Z100 F6000\n" - "T0\nG4 S1" - #if EXTRUDERS > 1 - "\nT1\nG4 S1" - #endif - "\nG0 X150 Y150 Z150" - )); - } + if (!isPositionKnown()) { + extern const char G28_STR[]; + injectCommands_P(G28_STR); + } + else { + injectCommands_P(PSTR( + "G0 X100 Y100 Z100 F6000\n" + "T0\nG4 S1" + #if EXTRUDERS > 1 + "\nT1\nG4 S1" + #endif + "\nG0 X150 Y150 Z150" + )); + } } if (refresh_timer.elapsed(STRESS_TEST_CHANGE_INTERVAL)) { @@ -141,10 +140,10 @@ void StressTestScreen::onIdle() { } if (watchDogTestNow()) { - if (random(2) % 2) - iterativeLockup(); - else - recursiveLockup(); + if (random(2) % 2) + iterativeLockup(); + else + recursiveLockup(); } BaseScreen::onIdle(); diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index d9a18ba4eb64..b8524e774cc7 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -1524,17 +1524,17 @@ void MarlinUI::update() { const int8_t xdir = col < (LCD_WIDTH ) / 2 ? -1 : 1, ydir = row < (LCD_HEIGHT) / 2 ? -1 : 1; if (on_edit_screen) - encoderDiff = ENCODER_PULSES_PER_STEP * ydir; + encoderDiff = (ENCODER_PULSES_PER_STEP) * ydir; else if (screen_items > 0) { // Last 3 cols act as a scroll :-) if (col > (LCD_WIDTH) - 5) // 2 * LCD_HEIGHT to scroll to bottom of next page. (LCD_HEIGHT would only go 1 item down.) - encoderDiff = ENCODER_PULSES_PER_STEP * (encoderLine - encoderTopLine + 2 * (LCD_HEIGHT)) * ydir; + encoderDiff = (ENCODER_PULSES_PER_STEP) * (encoderLine - encoderTopLine + 2 * (LCD_HEIGHT)) * ydir; else - encoderDiff = ENCODER_PULSES_PER_STEP * (row - encoderPosition + encoderTopLine); + encoderDiff = (ENCODER_PULSES_PER_STEP) * (row - encoderPosition + encoderTopLine); } else if (!on_status_screen()) - encoderDiff = ENCODER_PULSES_PER_STEP * xdir; + encoderDiff = (ENCODER_PULSES_PER_STEP) * xdir; } #endif From e85d828b24102ef4204d4792dad24e320d42cfd9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 19 Jul 2020 00:36:28 +0000 Subject: [PATCH 176/483] [cron] Bump distribution date (2020-07-19) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index cd21807977a1..bc59d6ca073e 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-18" + #define STRING_DISTRIBUTION_DATE "2020-07-19" #endif /** From cfc36684aacf0ed9443e039d714de0410f52f7d2 Mon Sep 17 00:00:00 2001 From: yufanyufan Date: Sun, 19 Jul 2020 14:35:15 -0700 Subject: [PATCH 177/483] More customizable DGUSDisplay (#18700) --- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 1144 +---------------- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 217 ---- .../src/lcd/extui/lib/dgus/DGUSDisplayDef.h | 4 + .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 1144 +++++++++++++++++ .../lcd/extui/lib/dgus/DGUSScreenHandler.h | 246 ++++ .../src/lcd/extui/lib/dgus/DGUSVPVariable.h | 2 + .../extui/lib/dgus/fysetc/DGUSDisplayDef.cpp | 169 +-- .../extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp | 163 +-- .../extui/lib/dgus/origin/DGUSDisplayDef.cpp | 159 +-- Marlin/src/lcd/extui_dgus_lcd.cpp | 1 + buildroot/tests/FYSETC_F6_13-tests | 3 +- 11 files changed, 1669 insertions(+), 1583 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index 1cef323926be..989a06623a7b 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -59,1095 +59,8 @@ constexpr uint8_t DGUS_CMD_READVAR = 0x83; bool dguslcd_local_debug; // = false; #endif -#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - typedef struct { - ExtUI::extruder_t extruder; // which extruder to operate - uint8_t action; // load or unload - bool heated; // heating done ? - float purge_length; // the length to extrude before unload, prevent filament jam - } filament_data_t; - static filament_data_t filament_data; -#endif - -uint16_t DGUSScreenVariableHandler::ConfirmVP; - -#if ENABLED(SDSUPPORT) - int16_t DGUSScreenVariableHandler::top_file = 0; - int16_t DGUSScreenVariableHandler::file_to_print = 0; - static ExtUI::FileList filelist; -#endif - -void (*DGUSScreenVariableHandler::confirm_action_cb)() = nullptr; - -//DGUSScreenVariableHandler ScreenHandler; - -DGUSLCD_Screens DGUSScreenVariableHandler::current_screen; -DGUSLCD_Screens DGUSScreenVariableHandler::past_screens[NUM_PAST_SCREENS]; -uint8_t DGUSScreenVariableHandler::update_ptr; -uint16_t DGUSScreenVariableHandler::skipVP; -bool DGUSScreenVariableHandler::ScreenComplete; - -//DGUSDisplay dgusdisplay; - -rx_datagram_state_t DGUSDisplay::rx_datagram_state = DGUS_IDLE; -uint8_t DGUSDisplay::rx_datagram_len = 0; -bool DGUSDisplay::Initialized = false; -bool DGUSDisplay::no_reentrance = false; - #define dgusserial DGUS_SERIAL -// endianness swap -uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); } - -bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy) { - // DEBUG_ECHOPAIR("populate_VPVar ", VP); - const DGUS_VP_Variable *pvp = DGUSLCD_FindVPVar(VP); - // DEBUG_ECHOLNPAIR(" pvp ", (uint16_t )pvp); - if (!pvp) return false; - memcpy_P(ramcopy, pvp, sizeof(DGUS_VP_Variable)); - return true; -} - -void DGUSScreenVariableHandler::sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { - DGUS_VP_Variable ramcopy; - if (populate_VPVar(VP_MSGSTR1, &ramcopy)) { - ramcopy.memadr = (void*) line1; - l1inflash ? DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplay(ramcopy); - } - if (populate_VPVar(VP_MSGSTR2, &ramcopy)) { - ramcopy.memadr = (void*) line2; - l2inflash ? DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplay(ramcopy); - } - if (populate_VPVar(VP_MSGSTR3, &ramcopy)) { - ramcopy.memadr = (void*) line3; - l3inflash ? DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplay(ramcopy); - } - if (populate_VPVar(VP_MSGSTR4, &ramcopy)) { - ramcopy.memadr = (void*) line4; - l4inflash ? DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplay(ramcopy); - } -} - -void DGUSScreenVariableHandler::HandleUserConfirmationPopUp(uint16_t VP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1, bool l2, bool l3, bool l4) { - if (current_screen == DGUSLCD_SCREEN_CONFIRM) { - // Already showing a pop up, so we need to cancel that first. - PopToOldScreen(); - } - - ConfirmVP = VP; - sendinfoscreen(line1, line2, line3, line4, l1, l2, l3, l4); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_CONFIRM); -} - -void DGUSScreenVariableHandler::setstatusmessage(const char *msg) { - DGUS_VP_Variable ramcopy; - if (populate_VPVar(VP_M117, &ramcopy)) { - ramcopy.memadr = (void*) msg; - DGUSLCD_SendStringToDisplay(ramcopy); - } -} - -void DGUSScreenVariableHandler::setstatusmessagePGM(PGM_P const msg) { - DGUS_VP_Variable ramcopy; - if (populate_VPVar(VP_M117, &ramcopy)) { - ramcopy.memadr = (void*) msg; - DGUSLCD_SendStringToDisplayPGM(ramcopy); - } -} - -// Send an 8 bit or 16 bit value to the display. -void DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); - //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); - uint8_t *tmp = (uint8_t *) var.memadr; - uint16_t data_to_send = (tmp[0] << 8); - if (var.size >= 1) data_to_send |= tmp[1]; - dgusdisplay.WriteVariable(var.VP, data_to_send); - } -} - -// Send an uint8_t between 0 and 255 to the display, but scale to a percentage (0..100) -void DGUSScreenVariableHandler::DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); - //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); - uint16_t tmp = *(uint8_t *) var.memadr +1 ; // +1 -> avoid rounding issues for the display. - tmp = map(tmp, 0, 255, 0, 100); - uint16_t data_to_send = swap16(tmp); - dgusdisplay.WriteVariable(var.VP, data_to_send); - } -} - -// Send the current print progress to the display. -void DGUSScreenVariableHandler::DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var) { - //DEBUG_ECHOPAIR(" DGUSLCD_SendPrintProgressToDisplay ", var.VP); - uint16_t tmp = ExtUI::getProgress_percent(); - //DEBUG_ECHOLNPAIR(" data ", tmp); - uint16_t data_to_send = swap16(tmp); - dgusdisplay.WriteVariable(var.VP, data_to_send); -} - -// Send the current print time to the display. -// It is using a hex display for that: It expects BSD coded data in the format xxyyzz -void DGUSScreenVariableHandler::DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var) { - duration_t elapsed = print_job_timer.duration(); - char buf[32]; - elapsed.toString(buf); - dgusdisplay.WriteVariable(VP_PrintTime, buf, var.size, true); -} - -// Send an uint8_t between 0 and 100 to a variable scale to 0..255 -void DGUSScreenVariableHandler::DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr) { - if (var.memadr) { - uint16_t value = swap16(*(uint16_t*)val_ptr); - *(uint8_t*)var.memadr = map(constrain(value, 0, 100), 0, 100, 0, 255); - } -} - -// Sends a (RAM located) string to the DGUS Display -// (Note: The DGUS Display does not clear after the \0, you have to -// overwrite the remainings with spaces.// var.size has the display buffer size! -void DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var) { - char *tmp = (char*) var.memadr; - dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); -} - -// Sends a (flash located) string to the DGUS Display -// (Note: The DGUS Display does not clear after the \0, you have to -// overwrite the remainings with spaces.// var.size has the display buffer size! -void DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { - char *tmp = (char*) var.memadr; - dgusdisplay.WriteVariablePGM(var.VP, tmp, var.size, true); -} - -#if HAS_PID_HEATING - void DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var) { - float value = *(float *)var.memadr; - float valuesend = 0; - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_PID_P: valuesend = value; break; - case VP_E0_PID_I: valuesend = unscalePID_i(value); break; - case VP_E0_PID_D: valuesend = unscalePID_d(value); break; - #endif - #if HOTENDS >= 2 - case VP_E1_PID_P: valuesend = value; break; - case VP_E1_PID_I: valuesend = unscalePID_i(value); break; - case VP_E1_PID_D: valuesend = unscalePID_d(value); break; - #endif - #if HAS_HEATED_BED - case VP_BED_PID_P: valuesend = value; break; - case VP_BED_PID_I: valuesend = unscalePID_i(value); break; - case VP_BED_PID_D: valuesend = unscalePID_d(value); break; - #endif - } - - valuesend *= cpow(10, 1); - union { int16_t i; char lb[2]; } endian; - - char tmp[2]; - endian.i = valuesend; - tmp[0] = endian.lb[1]; - tmp[1] = endian.lb[0]; - dgusdisplay.WriteVariable(var.VP, tmp, 2); - } -#endif - -#if ENABLED(PRINTCOUNTER) - - // Send the accumulate print time to the display. - // It is using a hex display for that: It expects BSD coded data in the format xxyyzz - void DGUSScreenVariableHandler::DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var) { - printStatistics state = print_job_timer.getStats(); - char buf[21]; - duration_t elapsed = state.printTime; - elapsed.toString(buf); - dgusdisplay.WriteVariable(VP_PrintAccTime, buf, var.size, true); - } - - void DGUSScreenVariableHandler::DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var) { - printStatistics state = print_job_timer.getStats(); - char buf[21]; - sprintf_P(buf, PSTR("%u"), state.totalPrints); - dgusdisplay.WriteVariable(VP_PrintsTotal, buf, var.size, true); - } - -#endif - -// Send fan status value to the display. -#if HAS_FAN - void DGUSScreenVariableHandler::DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - DEBUG_ECHOPAIR(" DGUSLCD_SendFanStatusToDisplay ", var.VP); - DEBUG_ECHOLNPAIR(" data ", *(uint8_t *)var.memadr); - uint16_t data_to_send = 0; - if (*(uint8_t *) var.memadr) data_to_send = 1; - data_to_send = swap16(data_to_send); - dgusdisplay.WriteVariable(var.VP, data_to_send); - } - } -#endif - -// Send heater status value to the display. -void DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - DEBUG_ECHOPAIR(" DGUSLCD_SendHeaterStatusToDisplay ", var.VP); - DEBUG_ECHOLNPAIR(" data ", *(int16_t *)var.memadr); - uint16_t data_to_send = 0; - if (*(int16_t *) var.memadr) data_to_send = 1; - data_to_send = swap16(data_to_send); - dgusdisplay.WriteVariable(var.VP, data_to_send); - } -} - -#if ENABLED(DGUS_UI_WAITING) - void DGUSScreenVariableHandler::DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var) { - // In FYSETC UI design there are 10 statuses to loop - static uint16_t period = 0; - static uint16_t index = 0; - //DEBUG_ECHOPAIR(" DGUSLCD_SendWaitingStatusToDisplay ", var.VP); - //DEBUG_ECHOLNPAIR(" data ", swap16(index)); - if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) { - dgusdisplay.WriteVariable(var.VP, swap16(index)); - //DEBUG_ECHOLNPAIR(" data ", swap16(index)); - if (++index >= DGUS_UI_WAITING_STATUS) index = 0; - period = 0; - } - } -#endif - -#if ENABLED(SDSUPPORT) - - void DGUSScreenVariableHandler::ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr) { - // default action executed when there is a SD card, but not printing - if (ExtUI::isMediaInserted() && !ExtUI::isPrintingFromMedia()) { - ScreenChangeHook(var, val_ptr); - dgusdisplay.RequestScreen(current_screen); - return; - } - - // if we are printing, we jump to two screens after the requested one. - // This should host e.g a print pause / print abort / print resume dialog. - // This concept allows to recycle this hook for other file - if (ExtUI::isPrintingFromMedia() && !card.flag.abort_sd_printing) { - GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); - return; - } - - // Don't let the user in the dark why there is no reaction. - if (!ExtUI::isMediaInserted()) { - setstatusmessagePGM(GET_TEXT(MSG_NO_MEDIA)); - return; - } - if (card.flag.abort_sd_printing) { - setstatusmessagePGM(GET_TEXT(MSG_MEDIA_ABORTING)); - return; - } - } - - void DGUSScreenVariableHandler::DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable& var, void *val_ptr) { - auto old_top = top_file; - const int16_t scroll = (int16_t)swap16(*(uint16_t*)val_ptr); - if (scroll) { - top_file += scroll; - DEBUG_ECHOPAIR("new topfile calculated:", top_file); - if (top_file < 0) { - top_file = 0; - DEBUG_ECHOLNPGM("Top of filelist reached"); - } - else { - int16_t max_top = filelist.count() - DGUS_SD_FILESPERSCREEN; - NOLESS(max_top, 0); - NOMORE(top_file, max_top); - } - DEBUG_ECHOPAIR("new topfile adjusted:", top_file); - } - else if (!filelist.isAtRootDir()) { - filelist.upDir(); - top_file = 0; - ForceCompleteUpdate(); - } - - if (old_top != top_file) ForceCompleteUpdate(); - } - - void DGUSScreenVariableHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; - if (touched_nr > filelist.count()) return; - if (!filelist.seek(touched_nr)) return; - if (filelist.isDir()) { - filelist.changeDir(filelist.filename()); - top_file = 0; - ForceCompleteUpdate(); - return; - } - - #if ENABLED(DGUS_PRINT_FILENAME) - // Send print filename - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); - #endif - - // Setup Confirmation screen - file_to_print = touched_nr; - HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); - } - - void DGUSScreenVariableHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { - if (!filelist.seek(file_to_print)) return; - ExtUI::printFile(filelist.shortFilename()); - ScreenHandler.GotoScreen( - #if ENABLED(DGUS_LCD_UI_ORIGIN) - DGUSLCD_SCREEN_STATUS - #else - DGUSLCD_SCREEN_SDPRINTMANIPULATION - #endif - ); - } - - void DGUSScreenVariableHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { - if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. - switch (swap16(*(uint16_t*)val_ptr)) { - case 0: // Resume - if (ExtUI::isPrintingFromMediaPaused()) ExtUI::resumePrint(); - break; - case 1: // Pause - if (!ExtUI::isPrintingFromMediaPaused()) ExtUI::pausePrint(); - break; - case 2: // Abort - ScreenHandler.HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); - break; - } - } - - void DGUSScreenVariableHandler::DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr) { - ExtUI::stopPrint(); - GotoScreen(DGUSLCD_SCREEN_MAIN); - } - - void DGUSScreenVariableHandler::DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr) { - if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. - GotoScreen(DGUSLCD_SCREEN_SDPRINTTUNE); - } - - void DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { - uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; - if (target_line > DGUS_SD_FILESPERSCREEN) return; - char tmpfilename[VP_SD_FileName_LEN + 1] = ""; - var.memadr = (void*)tmpfilename; - if (filelist.seek(top_file + target_line)) - snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); - DGUSLCD_SendStringToDisplay(var); - } - - void DGUSScreenVariableHandler::SDCardInserted() { - top_file = 0; - filelist.refresh(); - auto cs = ScreenHandler.getCurrentScreen(); - if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDFILELIST); - } - - void DGUSScreenVariableHandler::SDCardRemoved() { - if (current_screen == DGUSLCD_SCREEN_SDFILELIST - || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) - || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION - ) ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN); - } - - void DGUSScreenVariableHandler::SDCardError() { - DGUSScreenVariableHandler::SDCardRemoved(); - ScreenHandler.sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), nullptr, true, true, true, true); - ScreenHandler.SetupConfirmAction(nullptr); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); - } - -#endif // SDSUPPORT - -void DGUSScreenVariableHandler::ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) { - DGUS_VP_Variable ramcopy; - if (!populate_VPVar(ConfirmVP, &ramcopy)) return; - if (ramcopy.set_by_display_handler) ramcopy.set_by_display_handler(ramcopy, val_ptr); -} - -const uint16_t* DGUSLCD_FindScreenVPMapList(uint8_t screen) { - const uint16_t *ret; - const struct VPMapping *map = VPMap; - while (ret = (uint16_t*) pgm_read_ptr(&(map->VPList))) { - if (pgm_read_byte(&(map->screen)) == screen) return ret; - map++; - } - return nullptr; -} - -const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp) { - const DGUS_VP_Variable *ret = ListOfVP; - do { - const uint16_t vpcheck = pgm_read_word(&(ret->VP)); - if (vpcheck == 0) break; - if (vpcheck == vp) return ret; - ++ret; - } while (1); - - DEBUG_ECHOLNPAIR("FindVPVar NOT FOUND ", vp); - return nullptr; -} - -void DGUSScreenVariableHandler::ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr) { - if (!ExtUI::isPrinting()) { - ScreenChangeHook(var, val_ptr); - dgusdisplay.RequestScreen(current_screen); - } -} - -void DGUSScreenVariableHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { - uint8_t *tmp = (uint8_t*)val_ptr; - - // The keycode in target is coded as , so 0x0100A means - // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, - // meaning "return to previous screen" - DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; - - if (target == DGUSLCD_SCREEN_POPUP) { - // special handling for popup is to return to previous menu - if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); - PopToOldScreen(); - return; - } - - UpdateNewScreen(target); - - #ifdef DEBUG_DGUSLCD - if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); - #endif -} - -void DGUSScreenVariableHandler::HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr) { - thermalManager.disable_all_heaters(); - ScreenHandler.ForceCompleteUpdate(); // hint to send all data. -} - -void DGUSScreenVariableHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t newvalue = swap16(*(uint16_t*)val_ptr); - uint16_t acceptedvalue; - - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_T_E0_Set: - thermalManager.setTargetHotend(newvalue, 0); - acceptedvalue = thermalManager.temp_hotend[0].target; - break; - #endif - #if HOTENDS >= 2 - case VP_T_E1_Set: - thermalManager.setTargetHotend(newvalue, 1); - acceptedvalue = thermalManager.temp_hotend[1].target; - break; - #endif - #if HAS_HEATED_BED - case VP_T_Bed_Set: - thermalManager.setTargetBed(newvalue); - acceptedvalue = thermalManager.temp_bed.target; - break; - #endif - } - - // reply to display the new value to update the view if the new value was rejected by the Thermal Manager. - if (newvalue != acceptedvalue && var.send_to_display_handler) var.send_to_display_handler(var); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel -} - -void DGUSScreenVariableHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) { - #if EXTRUDERS - uint16_t newvalue = swap16(*(uint16_t*)val_ptr); - uint8_t target_extruder; - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_Flowrate_E0: target_extruder = 0; break; - #endif - #if HOTENDS >= 2 - case VP_Flowrate_E1: target_extruder = 1; break; - #endif - } - - planner.set_flow(target_extruder, newvalue); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - #else - UNUSED(var); UNUSED(val_ptr); - #endif -} - -void DGUSScreenVariableHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleManualExtrude"); - - int16_t movevalue = swap16(*(uint16_t*)val_ptr); - float target = movevalue * 0.01f; - ExtUI::extruder_t target_extruder; - - switch (var.VP) { - #if HOTENDS >= 1 - case VP_MOVE_E0: target_extruder = ExtUI::extruder_t::E0; break; - #endif - #if HOTENDS >= 2 - case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E1; break; - #endif - default: return; - } - - target += ExtUI::getAxisPosition_mm(target_extruder); - ExtUI::setAxisPosition_mm(target, target_extruder); - skipVP = var.VP; -} - -#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - void DGUSScreenVariableHandler::HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleManualMoveOption"); - *(uint16_t*)var.memadr = swap16(*(uint16_t*)val_ptr); - } -#endif - -void DGUSScreenVariableHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleManualMove"); - - int16_t movevalue = swap16(*(uint16_t*)val_ptr); - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - if (movevalue) { - const uint16_t choice = *(uint16_t*)var.memadr; - movevalue = movevalue < 0 ? -choice : choice; - } - #endif - char axiscode; - unsigned int speed = 1500; //FIXME: get default feedrate for manual moves, dont hardcode. - - switch (var.VP) { - default: return; - - case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; - break; - - case VP_MOVE_Y: - axiscode = 'Y'; - if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; - break; - - case VP_MOVE_Z: - axiscode = 'Z'; - speed = 300; // default to 5mm/s - if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; - break; - - case VP_HOME_ALL: // only used for homing - axiscode = '\0'; - movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. - break; - } - - if (!movevalue) { - // homing - DEBUG_ECHOPAIR(" homing ", axiscode); - char buf[6] = "G28 X"; - buf[4] = axiscode; - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); - //DEBUG_ECHOLNPGM(" ✓"); - ScreenHandler.ForceCompleteUpdate(); - return; - } - else { - //movement - DEBUG_ECHOPAIR(" move ", axiscode); - bool old_relative_mode = relative_mode; - if (!relative_mode) { - //DEBUG_ECHOPGM(" G91"); - queue.enqueue_now_P(PSTR("G91")); - //DEBUG_ECHOPGM(" ✓ "); - } - char buf[32]; // G1 X9999.99 F12345 - unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); - char sign[]="\0"; - int16_t value = movevalue / 100; - if (movevalue < 0) { value = -value; sign[0] = '-'; } - int16_t fraction = ABS(movevalue) % 100; - snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); - //DEBUG_ECHOLNPGM(" ✓ "); - if (backup_speed != speed) { - snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); - queue.enqueue_one_now(buf); - //DEBUG_ECHOPAIR(" ", buf); - } - //while (!enqueue_and_echo_command(buf)) idle(); - //DEBUG_ECHOLNPGM(" ✓ "); - if (!old_relative_mode) { - //DEBUG_ECHOPGM("G90"); - queue.enqueue_now_P(PSTR("G90")); - //DEBUG_ECHOPGM(" ✓ "); - } - } - - ScreenHandler.ForceCompleteUpdate(); - DEBUG_ECHOLNPGM("manmv done."); - return; - - cannotmove: - DEBUG_ECHOLNPAIR(" cannot move ", axiscode); - return; -} - -void DGUSScreenVariableHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleMotorLockUnlock"); - - char buf[4]; - const int16_t lock = swap16(*(uint16_t*)val_ptr); - strcpy_P(buf, lock ? PSTR("M18") : PSTR("M17")); - - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); -} - -#if ENABLED(POWER_LOSS_RECOVERY) - - void DGUSScreenVariableHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t value = swap16(*(uint16_t*)val_ptr); - if (value) { - queue.inject_P(PSTR("M1000")); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); - } - else { - recovery.cancel(); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_STATUS); - } - } - -#endif - -void DGUSScreenVariableHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleSettings"); - uint16_t value = swap16(*(uint16_t*)val_ptr); - switch (value) { - default: break; - case 1: - TERN_(PRINTCOUNTER, print_job_timer.initStats()); - queue.inject_P(PSTR("M502\nM500")); - break; - case 2: queue.inject_P(PSTR("M501")); break; - case 3: queue.inject_P(PSTR("M500")); break; - } -} - -void DGUSScreenVariableHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); - - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw/10; - ExtUI::axis_t axis; - switch (var.VP) { - case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; - case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; - case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; - default: return; - } - DEBUG_ECHOLNPAIR_F("value:", value); - ExtUI::setAxisSteps_per_mm(value, axis); - DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; -} - -void DGUSScreenVariableHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); - - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw/10; - ExtUI::extruder_t extruder; - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; - #endif - #if HOTENDS >= 2 - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; - #endif - } - DEBUG_ECHOLNPAIR_F("value:", value); - ExtUI::setAxisSteps_per_mm(value,extruder); - DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; -} - -#if HAS_PID_HEATING - void DGUSScreenVariableHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR("V1:", rawvalue); - float value = (float)rawvalue / 10; - DEBUG_ECHOLNPAIR("V2:", value); - float newvalue = 0; - - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_PID_P: newvalue = value; break; - case VP_E0_PID_I: newvalue = scalePID_i(value); break; - case VP_E0_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HOTENDS >= 2 - case VP_E1_PID_P: newvalue = value; break; - case VP_E1_PID_I: newvalue = scalePID_i(value); break; - case VP_E1_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HAS_HEATED_BED - case VP_BED_PID_P: newvalue = value; break; - case VP_BED_PID_I: newvalue = scalePID_i(value); break; - case VP_BED_PID_D: newvalue = scalePID_d(value); break; - #endif - } - - DEBUG_ECHOLNPAIR_F("V3:", newvalue); - *(float *)var.memadr = newvalue; - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - } - - void DGUSScreenVariableHandler::HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandlePIDAutotune"); - - char buf[32] = {0}; - - switch (var.VP) { - default: break; - #if ENABLED(PIDTEMP) - #if HOTENDS >= 1 - case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 - sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E0); - break; - #endif - #if HOTENDS >= 2 - case VP_PID_AUTOTUNE_E1: - sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E1); - break; - #endif - #endif - #if ENABLED(PIDTEMPBED) - case VP_PID_AUTOTUNE_BED: - sprintf(buf, "M303 E-1 C5 S70 U1"); - break; - #endif - } - - if (buf[0]) queue.enqueue_one_now(buf); - - #if ENABLED(DGUS_UI_WAITING) - sendinfoscreen(PSTR("PID is autotuning"), PSTR("please wait"), NUL_STR, NUL_STR, true, true, true, true); - GotoScreen(DGUSLCD_SCREEN_WAITING); - #endif - } -#endif - -#if HAS_BED_PROBE - void DGUSScreenVariableHandler::HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleProbeOffsetZChanged"); - - const float offset = float(int16_t(swap16(*(uint16_t*)val_ptr))) / 100.0f; - ExtUI::setZOffset_mm(offset); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; - } -#endif - -#if ENABLED(BABYSTEPPING) - void DGUSScreenVariableHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); - - int16_t flag = swap16(*(uint16_t*)val_ptr); - int16_t steps = flag ? -20 : 20; - ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); - ScreenHandler.ForceCompleteUpdate(); - return; - } -#endif - -#if HAS_FAN - void DGUSScreenVariableHandler::HandleFanControl(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleFanControl"); - *(uint8_t*)var.memadr = *(uint8_t*)var.memadr > 0 ? 0 : 255; - } -#endif - -void DGUSScreenVariableHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleHeaterControl"); - - uint8_t preheat_temp = 0; - switch (var.VP) { - #if HOTENDS >= 1 - case VP_E0_CONTROL: - #endif - #if HOTENDS >= 2 - case VP_E1_CONTROL: - #endif - #if HOTENDS >= 3 - case VP_E2_CONTROL: - #endif - preheat_temp = PREHEAT_1_TEMP_HOTEND; - break; - - case VP_BED_CONTROL: - preheat_temp = PREHEAT_1_TEMP_BED; - break; - } - - *(int16_t*)var.memadr = *(int16_t*)var.memadr > 0 ? 0 : preheat_temp; -} - -#if ENABLED(DGUS_PREHEAT_UI) - - void DGUSScreenVariableHandler::HandlePreheat(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandlePreheat"); - - uint8_t e_temp = 0; - TERN_(HAS_HEATED_BED, uint8_t bed_temp = 0); - const uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); - switch (preheat_option) { - default: - case 0: // Preheat PLA - #if defined(PREHEAT_1_TEMP_HOTEND) && defined(PREHEAT_1_TEMP_BED) - e_temp = PREHEAT_1_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_1_TEMP_BED); - #endif - break; - case 1: // Preheat ABS - #if defined(PREHEAT_2_TEMP_HOTEND) && defined(PREHEAT_2_TEMP_BED) - e_temp = PREHEAT_2_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_2_TEMP_BED); - #endif - break; - case 2: // Preheat PET - #if defined(PREHEAT_3_TEMP_HOTEND) && defined(PREHEAT_3_TEMP_BED) - e_temp = PREHEAT_3_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_3_TEMP_BED); - #endif - break; - case 3: // Preheat FLEX - #if defined(PREHEAT_4_TEMP_HOTEND) && defined(PREHEAT_4_TEMP_BED) - e_temp = PREHEAT_4_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_4_TEMP_BED); - #endif - break; - case 7: break; // Custom preheat - case 9: break; // Cool down - } - - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 0); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 1); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif - } - - // Go to the preheat screen to show the heating progress - GotoScreen(DGUSLCD_SCREEN_PREHEAT); - } - -#endif - -#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - void DGUSScreenVariableHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleFilamentOption"); - - uint8_t e_temp = 0; - filament_data.heated = false; - uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); - if (preheat_option <= 8) // Load filament type - filament_data.action = 1; - else if (preheat_option >= 10) { // Unload filament type - preheat_option -= 10; - filament_data.action = 2; - filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; - } - else // Cancel filament operation - filament_data.action = 0; - - switch (preheat_option) { - case 0: // Load PLA - #ifdef PREHEAT_1_TEMP_HOTEND - e_temp = PREHEAT_1_TEMP_HOTEND; - #endif - break; - case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); - break; - case 2: // Load PET - #ifdef PREHEAT_3_TEMP_HOTEND - e_temp = PREHEAT_3_TEMP_HOTEND; - #endif - break; - case 3: // Load FLEX - #ifdef PREHEAT_4_TEMP_HOTEND - e_temp = PREHEAT_4_TEMP_HOTEND; - #endif - break; - case 9: // Cool down - default: - e_temp = 0; - break; - } - - if (filament_data.action == 0) { // Go back to utility screen - #if HOTENDS >= 1 - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); - #endif - #if HOTENDS >= 2 - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); - #endif - GotoScreen(DGUSLCD_SCREEN_UTILITY); - } - else { // Go to the preheat screen to show the heating progress - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - } - GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); - } - } - - void DGUSScreenVariableHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { - DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); - if (filament_data.action <= 0) return; - - // If we close to the target temperature, we can start load or unload the filament - if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ - thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { - float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; - - if (filament_data.action == 1) { // load filament - if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); - filament_data.heated = true; - } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder)+movevalue; - } - else { // unload filament - if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); - filament_data.heated = true; - } - // Before unloading extrude to prevent jamming - if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; - filament_data.purge_length -= movevalue; - } - else - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; - } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); - } - } -#endif - -void DGUSScreenVariableHandler::UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup) { - DEBUG_ECHOLNPAIR("SetNewScreen: ", newscreen); - - if (!popup) { - memmove(&past_screens[1], &past_screens[0], sizeof(past_screens) - 1); - past_screens[0] = current_screen; - } - - current_screen = newscreen; - skipVP = 0; - ForceCompleteUpdate(); -} - -void DGUSScreenVariableHandler::PopToOldScreen() { - DEBUG_ECHOLNPAIR("PopToOldScreen s=", past_screens[0]); - GotoScreen(past_screens[0], true); - memmove(&past_screens[0], &past_screens[1], sizeof(past_screens) - 1); - past_screens[sizeof(past_screens) - 1] = DGUSLCD_SCREEN_MAIN; -} - -void DGUSScreenVariableHandler::UpdateScreenVPData() { - DEBUG_ECHOPAIR(" UpdateScreenVPData Screen: ", current_screen); - - const uint16_t *VPList = DGUSLCD_FindScreenVPMapList(current_screen); - if (!VPList) { - DEBUG_ECHOLNPAIR(" NO SCREEN FOR: ", current_screen); - ScreenComplete = true; - return; // nothing to do, likely a bug or boring screen. - } - - // Round-robin updating of all VPs. - VPList += update_ptr; - - bool sent_one = false; - do { - uint16_t VP = pgm_read_word(VPList); - DEBUG_ECHOPAIR(" VP: ", VP); - if (!VP) { - update_ptr = 0; - DEBUG_ECHOLNPGM(" UpdateScreenVPData done"); - ScreenComplete = true; - return; // Screen completed. - } - - if (VP == skipVP) { skipVP = 0; continue; } - - DGUS_VP_Variable rcpy; - if (populate_VPVar(VP, &rcpy)) { - uint8_t expected_tx = 6 + rcpy.size; // expected overhead is 6 bytes + payload. - // Send the VP to the display, but try to avoid overrunning the Tx Buffer. - // But send at least one VP, to avoid getting stalled. - if (rcpy.send_to_display_handler && (!sent_one || expected_tx <= dgusdisplay.GetFreeTxBuffer())) { - //DEBUG_ECHOPAIR(" calling handler for ", rcpy.VP); - sent_one = true; - rcpy.send_to_display_handler(rcpy); - } - else { - //auto x=dgusdisplay.GetFreeTxBuffer(); - //DEBUG_ECHOLNPAIR(" tx almost full: ", x); - //DEBUG_ECHOPAIR(" update_ptr ", update_ptr); - ScreenComplete = false; - return; // please call again! - } - } - - } while (++update_ptr, ++VPList, true); -} - -void DGUSDisplay::loop() { - // protect against recursion… ProcessRx() may indirectly call idle() when injecting gcode commands. - if (!no_reentrance) { - no_reentrance = true; - ProcessRx(); - no_reentrance = false; - } -} - void DGUSDisplay::InitDisplay() { dgusserial.begin(DGUS_BAUDRATE); @@ -1199,40 +112,6 @@ void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t val } } -void DGUSScreenVariableHandler::GotoScreen(DGUSLCD_Screens screen, bool ispopup) { - dgusdisplay.RequestScreen(screen); - UpdateNewScreen(screen, ispopup); -} - -bool DGUSScreenVariableHandler::loop() { - dgusdisplay.loop(); - - const millis_t ms = millis(); - static millis_t next_event_ms = 0; - - if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { - next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - UpdateScreenVPData(); - } - - #if ENABLED(SHOW_BOOTSCREEN) - static bool booted = false; - if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) - booted = true; - if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) { - booted = true; - GotoScreen(DGUSLCD_SCREEN_MAIN); - } - #endif - return IsScreenComplete(); -} - -void DGUSDisplay::RequestScreen(DGUSLCD_Screens screen) { - DEBUG_ECHOLNPAIR("GotoScreen ", screen); - const unsigned char gotoscreen[] = { 0x5A, 0x01, (unsigned char) (screen >> 8U), (unsigned char) (screen & 0xFFU) }; - WriteVariable(0x84, gotoscreen, sizeof(gotoscreen)); -} - void DGUSDisplay::ProcessRx() { #if ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS) @@ -1340,7 +219,30 @@ void DGUSDisplay::WritePGM(const char str[], uint8_t len) { while (len--) dgusserial.write(pgm_read_byte(str++)); } +void DGUSDisplay::loop() { + // protect against recursion… ProcessRx() may indirectly call idle() when injecting gcode commands. + if (!no_reentrance) { + no_reentrance = true; + ProcessRx(); + no_reentrance = false; + } +} + +rx_datagram_state_t DGUSDisplay::rx_datagram_state = DGUS_IDLE; +uint8_t DGUSDisplay::rx_datagram_len = 0; +bool DGUSDisplay::Initialized = false; +bool DGUSDisplay::no_reentrance = false; + // A SW memory barrier, to ensure GCC does not overoptimize loops #define sw_barrier() asm volatile("": : :"memory"); +bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy) { + // DEBUG_ECHOPAIR("populate_VPVar ", VP); + const DGUS_VP_Variable *pvp = DGUSLCD_FindVPVar(VP); + // DEBUG_ECHOLNPAIR(" pvp ", (uint16_t )pvp); + if (!pvp) return false; + memcpy_P(ramcopy, pvp, sizeof(DGUS_VP_Variable)); + return true; +} + #endif // HAS_DGUS_LCD diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index fea33c73d4fb..fd83451228dd 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -90,223 +90,6 @@ extern DGUSDisplay dgusdisplay; // compile-time x^y constexpr float cpow(const float x, const int y) { return y == 0 ? 1.0 : x * cpow(x, y - 1); } -class DGUSScreenVariableHandler { -public: - DGUSScreenVariableHandler() = default; - - static bool loop(); - - /// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen - /// The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - - /// "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); - /// The same for messages from Flash - static void setstatusmessagePGM(PGM_P const msg); - // Callback for VP "Display wants to change screen on idle printer" - static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); - // Callback for VP "Screen has been changed" - static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); - // Callback for VP "All Heaters Off" - static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); - // Hook for "Change this temperature" - static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); - // Hook for "Change Flowrate" - static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - // Hook for manual move option - static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for manual move. - static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); - // Hook for manual extrude. - static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); - // Hook for motor lock and unlook - static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(POWER_LOSS_RECOVERY) - // Hook for power loss recovery. - static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for settings - static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); - static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); - static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); - #if HAS_PID_HEATING - // Hook for "Change this temperature PID para" - static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); - // Hook for PID autotune - static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if HAS_BED_PROBE - // Hook for "Change probe offset z" - static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if ENABLED(BABYSTEPPING) - // Hook for live z adjust action - static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if HAS_FAN - // Hook for fan control - static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for heater control - static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(DGUS_PREHEAT_UI) - // Hook for preheat - static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - // Hook for filament load and unload filament option - static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); - // Hook for filament load and unload - static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); - #endif - - #if ENABLED(SDSUPPORT) - // Callback for VP "Display wants to change screen when there is a SD card" - static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); - /// Scroll buttons on the file listing screen. - static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); - /// File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); - /// start print after confirmation received. - static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); - /// User hit the pause, resume or abort button. - static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); - /// User confirmed the abort action - static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); - /// User hit the tune button - static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); - /// Send a single filename to the display. - static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); - /// Marlin informed us that a new SD has been inserted. - static void SDCardInserted(); - /// Marlin informed us that the SD Card has been removed(). - static void SDCardRemoved(); - /// Marlin informed us about a bad SD Card. - static void SDCardError(); - #endif - - // OK Button the Confirm screen. - static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); - - // Update data after went to new screen (by display or by GotoScreen) - // remember: store the last-displayed screen, so it can get returned to. - // (e.g for pop up messages) - static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); - - // Recall the remembered screen. - static void PopToOldScreen(); - - // Make the display show the screen and update all VPs in it. - static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); - - static void UpdateScreenVPData(); - - // Helpers to convert and transfer data to the display. - static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); - static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); - static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); - #if ENABLED(PRINTCOUNTER) - static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); - #endif - #if HAS_FAN - static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); - #endif - static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); - #if ENABLED(DGUS_UI_WAITING) - static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); - #endif - - /// Send a value from 0..100 to a variable with a range from 0..255 - static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); - - template - static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { - if (!var.memadr) return; - union { unsigned char tmp[sizeof(T)]; T t; } x; - unsigned char *ptr = (unsigned char*)val_ptr; - LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; - *(T*)var.memadr = x.t; - } - - /// Send a float value to the display. - /// Display will get a 4-byte integer scaled to the number of digits: - /// Tell the display the number of digits and it cheats by displaying a dot between... - template - static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - float f = *(float *)var.memadr; - f *= cpow(10, decimals); - union { long l; char lb[4]; } endian; - - char tmp[4]; - endian.l = f; - tmp[0] = endian.lb[3]; - tmp[1] = endian.lb[2]; - tmp[2] = endian.lb[1]; - tmp[3] = endian.lb[0]; - dgusdisplay.WriteVariable(var.VP, tmp, 4); - } - } - - /// Send a float value to the display. - /// Display will get a 2-byte integer scaled to the number of digits: - /// Tell the display the number of digits and it cheats by displaying a dot between... - template - static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - float f = *(float *)var.memadr; - DEBUG_ECHOLNPAIR_F(" >> ", f, 6); - f *= cpow(10, decimals); - union { int16_t i; char lb[2]; } endian; - - char tmp[2]; - endian.i = f; - tmp[0] = endian.lb[1]; - tmp[1] = endian.lb[0]; - dgusdisplay.WriteVariable(var.VP, tmp, 2); - } - } - - /// Force an update of all VP on the current screen. - static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } - /// Has all VPs sent to the screen - static inline bool IsScreenComplete() { return ScreenComplete; } - - static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } - - static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } - -private: - static DGUSLCD_Screens current_screen; ///< currently on screen - static constexpr uint8_t NUM_PAST_SCREENS = 4; - static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; ///< LIFO with past screens for the "back" button. - - static uint8_t update_ptr; ///< Last sent entry in the VPList for the actual screen. - static uint16_t skipVP; ///< When updating the screen data, skip this one, because the user is interacting with it. - static bool ScreenComplete; ///< All VPs sent to screen? - - static uint16_t ConfirmVP; ///< context for confirm screen (VP that will be emulated-sent on "OK"). - - #if ENABLED(SDSUPPORT) - static int16_t top_file; ///< file on top of file chooser - static int16_t file_to_print; ///< touched file to be confirmed - #endif - - static void (*confirm_action_cb)(); -}; - -extern DGUSScreenVariableHandler ScreenHandler; - /// Find the flash address of a DGUS_VP_Variable for the VP. extern const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp); diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h index 7af1ffefa7ba..39ed3174f07e 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h @@ -25,6 +25,8 @@ #include "DGUSVPVariable.h" +#include + // This file defines the interaction between Marlin and the display firmware. // information on which screen which VP is displayed @@ -41,6 +43,8 @@ extern const struct VPMapping VPMap[]; // List of VPs handled by Marlin / The Display. extern const struct DGUS_VP_Variable ListOfVP[]; +#include "../../../../inc/MarlinConfig.h" + #if ENABLED(DGUS_LCD_UI_ORIGIN) #include "origin/DGUSDisplayDef.h" #elif ENABLED(DGUS_LCD_UI_FYSETC) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp new file mode 100644 index 000000000000..6ff578832695 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -0,0 +1,1144 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_DGUS_LCD + +#include "DGUSScreenHandler.h" +#include "DGUSDisplay.h" +#include "DGUSVPVariable.h" +#include "DGUSDisplayDef.h" + +#include "../../ui_api.h" +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" +#include "../../../../module/motion.h" +#include "../../../../gcode/queue.h" +#include "../../../../module/planner.h" +#include "../../../../sd/cardreader.h" +#include "../../../../libs/duration_t.h" +#include "../../../../module/printcounter.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +uint16_t DGUSScreenHandler::ConfirmVP; + +#if ENABLED(SDSUPPORT) + int16_t DGUSScreenHandler::top_file = 0; + int16_t DGUSScreenHandler::file_to_print = 0; + static ExtUI::FileList filelist; +#endif + +void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; + +//DGUSScreenHandler ScreenHandler; + +DGUSLCD_Screens DGUSScreenHandler::current_screen; +DGUSLCD_Screens DGUSScreenHandler::past_screens[NUM_PAST_SCREENS]; +uint8_t DGUSScreenHandler::update_ptr; +uint16_t DGUSScreenHandler::skipVP; +bool DGUSScreenHandler::ScreenComplete; + +//DGUSDisplay dgusdisplay; + +// endianness swap +uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); } + +void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { + DGUS_VP_Variable ramcopy; + if (populate_VPVar(VP_MSGSTR1, &ramcopy)) { + ramcopy.memadr = (void*) line1; + l1inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); + } + if (populate_VPVar(VP_MSGSTR2, &ramcopy)) { + ramcopy.memadr = (void*) line2; + l2inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); + } + if (populate_VPVar(VP_MSGSTR3, &ramcopy)) { + ramcopy.memadr = (void*) line3; + l3inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); + } + if (populate_VPVar(VP_MSGSTR4, &ramcopy)) { + ramcopy.memadr = (void*) line4; + l4inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); + } +} + +void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1, bool l2, bool l3, bool l4) { + if (current_screen == DGUSLCD_SCREEN_CONFIRM) { + // Already showing a pop up, so we need to cancel that first. + PopToOldScreen(); + } + + ConfirmVP = VP; + sendinfoscreen(line1, line2, line3, line4, l1, l2, l3, l4); + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_CONFIRM); +} + +void DGUSScreenHandler::setstatusmessage(const char *msg) { + DGUS_VP_Variable ramcopy; + if (populate_VPVar(VP_M117, &ramcopy)) { + ramcopy.memadr = (void*) msg; + DGUSLCD_SendStringToDisplay(ramcopy); + } +} + +void DGUSScreenHandler::setstatusmessagePGM(PGM_P const msg) { + DGUS_VP_Variable ramcopy; + if (populate_VPVar(VP_M117, &ramcopy)) { + ramcopy.memadr = (void*) msg; + DGUSLCD_SendStringToDisplayPGM(ramcopy); + } +} + +// Send an 8 bit or 16 bit value to the display. +void DGUSScreenHandler::DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); + //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); + uint8_t *tmp = (uint8_t *) var.memadr; + uint16_t data_to_send = (tmp[0] << 8); + if (var.size >= 1) data_to_send |= tmp[1]; + dgusdisplay.WriteVariable(var.VP, data_to_send); + } +} + +// Send an uint8_t between 0 and 255 to the display, but scale to a percentage (0..100) +void DGUSScreenHandler::DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); + //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); + uint16_t tmp = *(uint8_t *) var.memadr +1 ; // +1 -> avoid rounding issues for the display. + tmp = map(tmp, 0, 255, 0, 100); + uint16_t data_to_send = swap16(tmp); + dgusdisplay.WriteVariable(var.VP, data_to_send); + } +} + +// Send the current print progress to the display. +void DGUSScreenHandler::DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var) { + //DEBUG_ECHOPAIR(" DGUSLCD_SendPrintProgressToDisplay ", var.VP); + uint16_t tmp = ExtUI::getProgress_percent(); + //DEBUG_ECHOLNPAIR(" data ", tmp); + uint16_t data_to_send = swap16(tmp); + dgusdisplay.WriteVariable(var.VP, data_to_send); +} + +// Send the current print time to the display. +// It is using a hex display for that: It expects BSD coded data in the format xxyyzz +void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var) { + duration_t elapsed = print_job_timer.duration(); + char buf[32]; + elapsed.toString(buf); + dgusdisplay.WriteVariable(VP_PrintTime, buf, var.size, true); +} + +// Send an uint8_t between 0 and 100 to a variable scale to 0..255 +void DGUSScreenHandler::DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr) { + if (var.memadr) { + uint16_t value = swap16(*(uint16_t*)val_ptr); + *(uint8_t*)var.memadr = map(constrain(value, 0, 100), 0, 100, 0, 255); + } +} + +// Sends a (RAM located) string to the DGUS Display +// (Note: The DGUS Display does not clear after the \0, you have to +// overwrite the remainings with spaces.// var.size has the display buffer size! +void DGUSScreenHandler::DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var) { + char *tmp = (char*) var.memadr; + dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); +} + +// Sends a (flash located) string to the DGUS Display +// (Note: The DGUS Display does not clear after the \0, you have to +// overwrite the remainings with spaces.// var.size has the display buffer size! +void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { + char *tmp = (char*) var.memadr; + dgusdisplay.WriteVariablePGM(var.VP, tmp, var.size, true); +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var) { + float value = *(float *)var.memadr; + float valuesend = 0; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: valuesend = value; break; + case VP_E0_PID_I: valuesend = unscalePID_i(value); break; + case VP_E0_PID_D: valuesend = unscalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: valuesend = value; break; + case VP_E1_PID_I: valuesend = unscalePID_i(value); break; + case VP_E1_PID_D: valuesend = unscalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: valuesend = value; break; + case VP_BED_PID_I: valuesend = unscalePID_i(value); break; + case VP_BED_PID_D: valuesend = unscalePID_d(value); break; + #endif + } + + valuesend *= cpow(10, 1); + union { int16_t i; char lb[2]; } endian; + + char tmp[2]; + endian.i = valuesend; + tmp[0] = endian.lb[1]; + tmp[1] = endian.lb[0]; + dgusdisplay.WriteVariable(var.VP, tmp, 2); + } +#endif + +#if ENABLED(PRINTCOUNTER) + + // Send the accumulate print time to the display. + // It is using a hex display for that: It expects BSD coded data in the format xxyyzz + void DGUSScreenHandler::DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var) { + printStatistics state = print_job_timer.getStats(); + char buf[21]; + duration_t elapsed = state.printTime; + elapsed.toString(buf); + dgusdisplay.WriteVariable(VP_PrintAccTime, buf, var.size, true); + } + + void DGUSScreenHandler::DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var) { + printStatistics state = print_job_timer.getStats(); + char buf[21]; + sprintf_P(buf, PSTR("%u"), state.totalPrints); + dgusdisplay.WriteVariable(VP_PrintsTotal, buf, var.size, true); + } + +#endif + +// Send fan status value to the display. +#if HAS_FAN + void DGUSScreenHandler::DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + DEBUG_ECHOPAIR(" DGUSLCD_SendFanStatusToDisplay ", var.VP); + DEBUG_ECHOLNPAIR(" data ", *(uint8_t *)var.memadr); + uint16_t data_to_send = 0; + if (*(uint8_t *) var.memadr) data_to_send = 1; + data_to_send = swap16(data_to_send); + dgusdisplay.WriteVariable(var.VP, data_to_send); + } + } +#endif + +// Send heater status value to the display. +void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + DEBUG_ECHOPAIR(" DGUSLCD_SendHeaterStatusToDisplay ", var.VP); + DEBUG_ECHOLNPAIR(" data ", *(int16_t *)var.memadr); + uint16_t data_to_send = 0; + if (*(int16_t *) var.memadr) data_to_send = 1; + data_to_send = swap16(data_to_send); + dgusdisplay.WriteVariable(var.VP, data_to_send); + } +} + +#if ENABLED(DGUS_UI_WAITING) + void DGUSScreenHandler::DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var) { + // In FYSETC UI design there are 10 statuses to loop + static uint16_t period = 0; + static uint16_t index = 0; + //DEBUG_ECHOPAIR(" DGUSLCD_SendWaitingStatusToDisplay ", var.VP); + //DEBUG_ECHOLNPAIR(" data ", swap16(index)); + if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) { + dgusdisplay.WriteVariable(var.VP, swap16(index)); + //DEBUG_ECHOLNPAIR(" data ", swap16(index)); + if (++index >= DGUS_UI_WAITING_STATUS) index = 0; + period = 0; + } + } +#endif + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr) { + // default action executed when there is a SD card, but not printing + if (ExtUI::isMediaInserted() && !ExtUI::isPrintingFromMedia()) { + ScreenChangeHook(var, val_ptr); + dgusdisplay.RequestScreen(current_screen); + return; + } + + // if we are printing, we jump to two screens after the requested one. + // This should host e.g a print pause / print abort / print resume dialog. + // This concept allows to recycle this hook for other file + if (ExtUI::isPrintingFromMedia() && !card.flag.abort_sd_printing) { + GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + return; + } + + // Don't let the user in the dark why there is no reaction. + if (!ExtUI::isMediaInserted()) { + setstatusmessagePGM(GET_TEXT(MSG_NO_MEDIA)); + return; + } + if (card.flag.abort_sd_printing) { + setstatusmessagePGM(GET_TEXT(MSG_MEDIA_ABORTING)); + return; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable& var, void *val_ptr) { + auto old_top = top_file; + const int16_t scroll = (int16_t)swap16(*(uint16_t*)val_ptr); + if (scroll) { + top_file += scroll; + DEBUG_ECHOPAIR("new topfile calculated:", top_file); + if (top_file < 0) { + top_file = 0; + DEBUG_ECHOLNPGM("Top of filelist reached"); + } + else { + int16_t max_top = filelist.count() - DGUS_SD_FILESPERSCREEN; + NOLESS(max_top, 0); + NOMORE(top_file, max_top); + } + DEBUG_ECHOPAIR("new topfile adjusted:", top_file); + } + else if (!filelist.isAtRootDir()) { + filelist.upDir(); + top_file = 0; + ForceCompleteUpdate(); + } + + if (old_top != top_file) ForceCompleteUpdate(); + } + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr)) return; + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + ScreenHandler.GotoScreen( + #if ENABLED(DGUS_LCD_UI_ORIGIN) + DGUSLCD_SCREEN_STATUS + #else + DGUSLCD_SCREEN_SDPRINTMANIPULATION + #endif + ); + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: // Resume + if (ExtUI::isPrintingFromMediaPaused()) ExtUI::resumePrint(); + break; + case 1: // Pause + if (!ExtUI::isPrintingFromMediaPaused()) ExtUI::pausePrint(); + break; + case 2: // Abort + ScreenHandler.HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr) { + ExtUI::stopPrint(); + GotoScreen(DGUSLCD_SCREEN_MAIN); + } + + void DGUSScreenHandler::DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr) { + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + GotoScreen(DGUSLCD_SCREEN_SDPRINTTUNE); + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + if (filelist.seek(top_file + target_line)) + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); + DGUSLCD_SendStringToDisplay(var); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = ScreenHandler.getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN); + } + + void DGUSScreenHandler::SDCardError() { + DGUSScreenHandler::SDCardRemoved(); + ScreenHandler.sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), nullptr, true, true, true, true); + ScreenHandler.SetupConfirmAction(nullptr); + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) { + DGUS_VP_Variable ramcopy; + if (!populate_VPVar(ConfirmVP, &ramcopy)) return; + if (ramcopy.set_by_display_handler) ramcopy.set_by_display_handler(ramcopy, val_ptr); +} + +const uint16_t* DGUSLCD_FindScreenVPMapList(uint8_t screen) { + const uint16_t *ret; + const struct VPMapping *map = VPMap; + while (ret = (uint16_t*) pgm_read_ptr(&(map->VPList))) { + if (pgm_read_byte(&(map->screen)) == screen) return ret; + map++; + } + return nullptr; +} + +const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp) { + const DGUS_VP_Variable *ret = ListOfVP; + do { + const uint16_t vpcheck = pgm_read_word(&(ret->VP)); + if (vpcheck == 0) break; + if (vpcheck == vp) return ret; + ++ret; + } while (1); + + DEBUG_ECHOLNPAIR("FindVPVar NOT FOUND ", vp); + return nullptr; +} + +void DGUSScreenHandler::ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr) { + if (!ExtUI::isPrinting()) { + ScreenChangeHook(var, val_ptr); + dgusdisplay.RequestScreen(current_screen); + } +} + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + if (target == DGUSLCD_SCREEN_POPUP) { + // special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr) { + thermalManager.disable_all_heaters(); + ScreenHandler.ForceCompleteUpdate(); // hint to send all data. +} + +void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t newvalue = swap16(*(uint16_t*)val_ptr); + uint16_t acceptedvalue; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_T_E0_Set: + thermalManager.setTargetHotend(newvalue, 0); + acceptedvalue = thermalManager.temp_hotend[0].target; + break; + #endif + #if HOTENDS >= 2 + case VP_T_E1_Set: + thermalManager.setTargetHotend(newvalue, 1); + acceptedvalue = thermalManager.temp_hotend[1].target; + break; + #endif + #if HAS_HEATED_BED + case VP_T_Bed_Set: + thermalManager.setTargetBed(newvalue); + acceptedvalue = thermalManager.temp_bed.target; + break; + #endif + } + + // reply to display the new value to update the view if the new value was rejected by the Thermal Manager. + if (newvalue != acceptedvalue && var.send_to_display_handler) var.send_to_display_handler(var); + ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel +} + +void DGUSScreenHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) { + #if EXTRUDERS + uint16_t newvalue = swap16(*(uint16_t*)val_ptr); + uint8_t target_extruder; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_Flowrate_E0: target_extruder = 0; break; + #endif + #if HOTENDS >= 2 + case VP_Flowrate_E1: target_extruder = 1; break; + #endif + } + + planner.set_flow(target_extruder, newvalue); + ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + #else + UNUSED(var); UNUSED(val_ptr); + #endif +} + +void DGUSScreenHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualExtrude"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + float target = movevalue * 0.01f; + ExtUI::extruder_t target_extruder; + + switch (var.VP) { + #if HOTENDS >= 1 + case VP_MOVE_E0: target_extruder = ExtUI::extruder_t::E0; break; + #endif + #if HOTENDS >= 2 + case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E1; break; + #endif + default: return; + } + + target += ExtUI::getAxisPosition_mm(target_extruder); + ExtUI::setAxisPosition_mm(target, target_extruder); + skipVP = var.VP; +} + +#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + void DGUSScreenHandler::HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMoveOption"); + *(uint16_t*)var.memadr = swap16(*(uint16_t*)val_ptr); + } +#endif + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + if (movevalue) { + const uint16_t choice = *(uint16_t*)var.memadr; + movevalue = movevalue < 0 ? -choice : choice; + } + #endif + char axiscode; + unsigned int speed = 1500; //FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { + default: return; + + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_HOME_ALL: // only used for homing + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + break; + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + char buf[6] = "G28 X"; + buf[4] = axiscode; + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ScreenHandler.ForceCompleteUpdate(); + return; + } + else { + //movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[]="\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓ "); + if (backup_speed != speed) { + snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + queue.enqueue_one_now(buf); + //DEBUG_ECHOPAIR(" ", buf); + } + //while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ScreenHandler.ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMotorLockUnlock"); + + char buf[4]; + const int16_t lock = swap16(*(uint16_t*)val_ptr); + strcpy_P(buf, lock ? PSTR("M18") : PSTR("M17")); + + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); +} + +#if ENABLED(POWER_LOSS_RECOVERY) + + void DGUSScreenHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value = swap16(*(uint16_t*)val_ptr); + if (value) { + queue.inject_P(PSTR("M1000")); + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + } + else { + recovery.cancel(); + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_STATUS); + } + } + +#endif + +void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleSettings"); + uint16_t value = swap16(*(uint16_t*)val_ptr); + switch (value) { + default: break; + case 1: + TERN_(PRINTCOUNTER, print_job_timer.initStats()); + queue.inject_P(PSTR("M502\nM500")); + break; + case 2: queue.inject_P(PSTR("M501")); break; + case 3: queue.inject_P(PSTR("M500")); break; + } +} + +void DGUSScreenHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw/10; + ExtUI::axis_t axis; + switch (var.VP) { + case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; + case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; + case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; + default: return; + } + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::setAxisSteps_per_mm(value, axis); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); + ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw/10; + ExtUI::extruder_t extruder; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HOTENDS >= 2 + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #endif + } + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::setAxisSteps_per_mm(value,extruder); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); + ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } + + void DGUSScreenHandler::HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandlePIDAutotune"); + + char buf[32] = {0}; + + switch (var.VP) { + default: break; + #if ENABLED(PIDTEMP) + #if HOTENDS >= 1 + case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 + sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E0); + break; + #endif + #if HOTENDS >= 2 + case VP_PID_AUTOTUNE_E1: + sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E1); + break; + #endif + #endif + #if ENABLED(PIDTEMPBED) + case VP_PID_AUTOTUNE_BED: + sprintf(buf, "M303 E-1 C5 S70 U1"); + break; + #endif + } + + if (buf[0]) queue.enqueue_one_now(buf); + + #if ENABLED(DGUS_UI_WAITING) + sendinfoscreen(PSTR("PID is autotuning"), PSTR("please wait"), NUL_STR, NUL_STR, true, true, true, true); + GotoScreen(DGUSLCD_SCREEN_WAITING); + #endif + } +#endif + +#if HAS_BED_PROBE + void DGUSScreenHandler::HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleProbeOffsetZChanged"); + + const float offset = float(int16_t(swap16(*(uint16_t*)val_ptr))) / 100.0f; + ExtUI::setZOffset_mm(offset); + ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; + } +#endif + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + + int16_t flag = swap16(*(uint16_t*)val_ptr); + int16_t steps = flag ? -20 : 20; + ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); + ScreenHandler.ForceCompleteUpdate(); + return; + } +#endif + +#if HAS_FAN + void DGUSScreenHandler::HandleFanControl(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFanControl"); + *(uint8_t*)var.memadr = *(uint8_t*)var.memadr > 0 ? 0 : 255; + } +#endif + +void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleHeaterControl"); + + uint8_t preheat_temp = 0; + switch (var.VP) { + #if HOTENDS >= 1 + case VP_E0_CONTROL: + #endif + #if HOTENDS >= 2 + case VP_E1_CONTROL: + #endif + #if HOTENDS >= 3 + case VP_E2_CONTROL: + #endif + preheat_temp = PREHEAT_1_TEMP_HOTEND; + break; + + case VP_BED_CONTROL: + preheat_temp = PREHEAT_1_TEMP_BED; + break; + } + + *(int16_t*)var.memadr = *(int16_t*)var.memadr > 0 ? 0 : preheat_temp; +} + +#if ENABLED(DGUS_PREHEAT_UI) + + void DGUSScreenHandler::HandlePreheat(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandlePreheat"); + + uint8_t e_temp = 0; + TERN_(HAS_HEATED_BED, uint8_t bed_temp = 0); + const uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + switch (preheat_option) { + default: + case 0: // Preheat PLA + #if defined(PREHEAT_1_TEMP_HOTEND) && defined(PREHEAT_1_TEMP_BED) + e_temp = PREHEAT_1_TEMP_HOTEND; + TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_1_TEMP_BED); + #endif + break; + case 1: // Preheat ABS + #if defined(PREHEAT_2_TEMP_HOTEND) && defined(PREHEAT_2_TEMP_BED) + e_temp = PREHEAT_2_TEMP_HOTEND; + TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_2_TEMP_BED); + #endif + break; + case 2: // Preheat PET + #if defined(PREHEAT_3_TEMP_HOTEND) && defined(PREHEAT_3_TEMP_BED) + e_temp = PREHEAT_3_TEMP_HOTEND; + TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_3_TEMP_BED); + #endif + break; + case 3: // Preheat FLEX + #if defined(PREHEAT_4_TEMP_HOTEND) && defined(PREHEAT_4_TEMP_BED) + e_temp = PREHEAT_4_TEMP_HOTEND; + TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_4_TEMP_BED); + #endif + break; + case 7: break; // Custom preheat + case 9: break; // Cool down + } + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_BED_PREHEAT: + thermalManager.setTargetHotend(e_temp, 0); + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_BED_PREHEAT: + thermalManager.setTargetHotend(e_temp, 1); + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); + break; + #endif + } + + // Go to the preheat screen to show the heating progress + GotoScreen(DGUSLCD_SCREEN_PREHEAT); + } + +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + typedef struct { + ExtUI::extruder_t extruder; // which extruder to operate + uint8_t action; // load or unload + bool heated; // heating done ? + float purge_length; // the length to extrude before unload, prevent filament jam + } filament_data_t; + + static filament_data_t filament_data; + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) // Load filament type + filament_data.action = 1; + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else // Cancel filament operation + filament_data.action = 0; + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder)+movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif + +void DGUSScreenHandler::UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup) { + DEBUG_ECHOLNPAIR("SetNewScreen: ", newscreen); + + if (!popup) { + memmove(&past_screens[1], &past_screens[0], sizeof(past_screens) - 1); + past_screens[0] = current_screen; + } + + current_screen = newscreen; + skipVP = 0; + ForceCompleteUpdate(); +} + +void DGUSScreenHandler::PopToOldScreen() { + DEBUG_ECHOLNPAIR("PopToOldScreen s=", past_screens[0]); + GotoScreen(past_screens[0], true); + memmove(&past_screens[0], &past_screens[1], sizeof(past_screens) - 1); + past_screens[sizeof(past_screens) - 1] = DGUSLCD_SCREEN_MAIN; +} + +void DGUSScreenHandler::UpdateScreenVPData() { + DEBUG_ECHOPAIR(" UpdateScreenVPData Screen: ", current_screen); + + const uint16_t *VPList = DGUSLCD_FindScreenVPMapList(current_screen); + if (!VPList) { + DEBUG_ECHOLNPAIR(" NO SCREEN FOR: ", current_screen); + ScreenComplete = true; + return; // nothing to do, likely a bug or boring screen. + } + + // Round-robin updating of all VPs. + VPList += update_ptr; + + bool sent_one = false; + do { + uint16_t VP = pgm_read_word(VPList); + DEBUG_ECHOPAIR(" VP: ", VP); + if (!VP) { + update_ptr = 0; + DEBUG_ECHOLNPGM(" UpdateScreenVPData done"); + ScreenComplete = true; + return; // Screen completed. + } + + if (VP == skipVP) { skipVP = 0; continue; } + + DGUS_VP_Variable rcpy; + if (populate_VPVar(VP, &rcpy)) { + uint8_t expected_tx = 6 + rcpy.size; // expected overhead is 6 bytes + payload. + // Send the VP to the display, but try to avoid overrunning the Tx Buffer. + // But send at least one VP, to avoid getting stalled. + if (rcpy.send_to_display_handler && (!sent_one || expected_tx <= dgusdisplay.GetFreeTxBuffer())) { + //DEBUG_ECHOPAIR(" calling handler for ", rcpy.VP); + sent_one = true; + rcpy.send_to_display_handler(rcpy); + } + else { + //auto x=dgusdisplay.GetFreeTxBuffer(); + //DEBUG_ECHOLNPAIR(" tx almost full: ", x); + //DEBUG_ECHOPAIR(" update_ptr ", update_ptr); + ScreenComplete = false; + return; // please call again! + } + } + + } while (++update_ptr, ++VPList, true); +} + +void DGUSScreenHandler::GotoScreen(DGUSLCD_Screens screen, bool ispopup) { + dgusdisplay.RequestScreen(screen); + UpdateNewScreen(screen, ispopup); +} + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + booted = true; + if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) { + booted = true; + GotoScreen(DGUSLCD_SCREEN_MAIN); + } + #endif + return IsScreenComplete(); +} + +void DGUSDisplay::RequestScreen(DGUSLCD_Screens screen) { + DEBUG_ECHOLNPAIR("GotoScreen ", screen); + const unsigned char gotoscreen[] = { 0x5A, 0x01, (unsigned char) (screen >> 8U), (unsigned char) (screen & 0xFFU) }; + WriteVariable(0x84, gotoscreen, sizeof(gotoscreen)); +} + +#endif // HAS_DGUS_LCD diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h new file mode 100644 index 000000000000..d5b1450e2f09 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h @@ -0,0 +1,246 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "DGUSDisplay.h" +#include "DGUSVPVariable.h" + +#include "../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + /// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + /// The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + /// "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + /// The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + /// Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + /// File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + /// start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + /// User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + /// User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + /// User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + /// Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + /// Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + /// Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + /// Marlin informed us about a bad SD Card. + static void SDCardError(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + /// Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + /// Send a float value to the display. + /// Display will get a 4-byte integer scaled to the number of digits: + /// Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + union { long l; char lb[4]; } endian; + + char tmp[4]; + endian.l = f; + tmp[0] = endian.lb[3]; + tmp[1] = endian.lb[2]; + tmp[2] = endian.lb[1]; + tmp[3] = endian.lb[0]; + dgusdisplay.WriteVariable(var.VP, tmp, 4); + } + } + + /// Send a float value to the display. + /// Display will get a 2-byte integer scaled to the number of digits: + /// Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + union { int16_t i; char lb[2]; } endian; + + char tmp[2]; + endian.i = f; + tmp[0] = endian.lb[1]; + tmp[1] = endian.lb[0]; + dgusdisplay.WriteVariable(var.VP, tmp, 2); + } + } + + /// Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + /// Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; ///< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; ///< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; ///< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; ///< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; ///< All VPs sent to screen? + + static uint16_t ConfirmVP; ///< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; ///< file on top of file chooser + static int16_t file_to_print; ///< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +extern DGUSScreenHandler ScreenHandler; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h b/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h index 30555bbb9f3a..58621cfd571e 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h @@ -21,6 +21,8 @@ */ #pragma once +#include + /** * DGUSVPVariable.h * diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp index 71ae60434408..e5826a9180b7 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp @@ -28,6 +28,7 @@ #include "../DGUSDisplayDef.h" #include "../DGUSDisplay.h" +#include "../DGUSScreenHandler.h" #include "../../../../../module/temperature.h" #include "../../../../../module/motion.h" @@ -325,159 +326,159 @@ const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Helper to detect touch events - VPHELPER(VP_SCREENCHANGE, nullptr, DGUSScreenVariableHandler::ScreenChangeHook, nullptr), - VPHELPER(VP_SCREENCHANGE_ASK, nullptr, DGUSScreenVariableHandler::ScreenChangeHookIfIdle, nullptr), + VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), #if ENABLED(SDSUPPORT) - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, DGUSScreenVariableHandler::ScreenChangeHookIfSD, nullptr), + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), #endif - VPHELPER(VP_CONFIRMED, nullptr, DGUSScreenVariableHandler::ScreenConfirmedOK, nullptr), + VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), - VPHELPER(VP_TEMP_ALL_OFF, nullptr, &DGUSScreenVariableHandler::HandleAllHeatersOff, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMoveOption, nullptr), + VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), #endif #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), #else - VPHELPER(VP_MOVE_X, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, &ScreenHandler.HandleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &DGUSScreenVariableHandler::HandleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &DGUSScreenVariableHandler::HandlePowerLossRecovery, nullptr), + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), #endif - VPHELPER(VP_SETTINGS, nullptr, &DGUSScreenVariableHandler::HandleSettings, nullptr), + VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), #if ENABLED(SINGLE_Z_CALIBRATION) - VPHELPER(VP_Z_CALIBRATE, nullptr, &DGUSScreenVariableHandler::HandleZCalibration, nullptr), + VPHELPER(VP_Z_CALIBRATE, nullptr, &ScreenHandler.HandleZCalibration, nullptr), #endif #if ENABLED(FIRST_LAYER_CAL) - VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &DGUSScreenVariableHandler::HandleFirstLayerCal, nullptr), + VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &ScreenHandler.HandleFirstLayerCal, nullptr), #endif - { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr - { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplay }, + { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay }, // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_EPos, &destination.e, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_MOVE_E0, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), - VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, &DGUSScreenVariableHandler::HandlePreheat, nullptr), + VPHELPER(VP_E0_BED_PREHEAT, nullptr, &ScreenHandler.HandlePreheat, nullptr), #endif #if ENABLED(PIDTEMP) - VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &DGUSScreenVariableHandler::HandlePIDAutotune, nullptr), + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &DGUSScreenVariableHandler::HandleFilamentOption, &DGUSScreenVariableHandler::HandleFilamentLoadUnload), + VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), #endif #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_MOVE_E1, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), - VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #if ENABLED(PIDTEMP) - VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, &DGUSScreenVariableHandler::HandlePIDAutotune, nullptr), + VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), #endif - VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, &DGUSScreenVariableHandler::HandleFilamentOption, &DGUSScreenVariableHandler::HandleFilamentLoadUnload), + VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #if ENABLED(PIDTEMPBED) - VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, &DGUSScreenVariableHandler::HandlePIDAutotune, nullptr), + VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), #endif #endif // Fan Data #if HAS_FAN #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], DGUSScreenVariableHandler::DGUSLCD_PercentageToUint8, &DGUSScreenVariableHandler::DGUSLCD_SendPercentageToDisplay), \ - VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &DGUSScreenVariableHandler::HandleFanControl, nullptr), \ - VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendFanStatusToDisplay), + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, &ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &ScreenHandler.HandleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &ScreenHandler.DGUSLCD_SendFanStatusToDisplay), REPEAT(FAN_COUNT, FAN_VPHELPER) #endif // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, DGUSScreenVariableHandler::DGUSLCD_SetValueDirectly, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay ), + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), // Position Data - VPHELPER(VP_XPos, ¤t_position.x, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_YPos, ¤t_position.y, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_ZPos, ¤t_position.z, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_XPos, ¤t_position.x, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintProgressToDisplay ), + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintTimeToDisplay), + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay), #if ENABLED(PRINTCOUNTER) - VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintAccTimeToDisplay), - VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintsTotalToDisplay), + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintAccTimeToDisplay), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintsTotalToDisplay), #endif - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #if HOTENDS >= 1 - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], DGUSScreenVariableHandler::HandleStepPerMMExtruderChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #endif #if HOTENDS >= 2 - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], DGUSScreenVariableHandler::HandleStepPerMMExtruderChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #endif // SDCard File listing. #if ENABLED(SDSUPPORT) - VPHELPER(VP_SD_ScrollEvent, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ScrollFilelist, nullptr), - VPHELPER(VP_SD_FileSelected, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_FileSelected, nullptr), - VPHELPER(VP_SD_FileSelectConfirm, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_StartPrint, nullptr), - VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename), - VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename), - VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename), - VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename), - VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename), - VPHELPER(VP_SD_ResumePauseAbort, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ResumePauseAbort, nullptr), - VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ReallyAbort, nullptr), - VPHELPER(VP_SD_Print_Setting, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_PrintTune, nullptr), + VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, ScreenHandler.DGUSLCD_SD_ResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, DGUSScreenVariableHandler::HandleProbeOffsetZChanged, &DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, DGUSScreenVariableHandler::HandleLiveAdjustZ, nullptr), + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), #endif #endif #endif #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendWaitingStatusToDisplay), + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), #endif // Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content. - { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, VPHELPER(0, 0, 0, 0) // must be last entry. }; diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp index 62cd67d2cb54..d5ac981e5b5d 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp @@ -28,6 +28,7 @@ #include "../DGUSDisplayDef.h" #include "../DGUSDisplay.h" +#include "../DGUSScreenHandler.h" #include "../../../../../module/temperature.h" #include "../../../../../module/motion.h" @@ -328,155 +329,155 @@ const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Helper to detect touch events - VPHELPER(VP_SCREENCHANGE, nullptr, DGUSScreenVariableHandler::ScreenChangeHook, nullptr), - VPHELPER(VP_SCREENCHANGE_ASK, nullptr, DGUSScreenVariableHandler::ScreenChangeHookIfIdle, nullptr), + VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), #if ENABLED(SDSUPPORT) - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, DGUSScreenVariableHandler::ScreenChangeHookIfSD, nullptr), + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), #endif - VPHELPER(VP_CONFIRMED, nullptr, DGUSScreenVariableHandler::ScreenConfirmedOK, nullptr), + VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), - VPHELPER(VP_TEMP_ALL_OFF, nullptr, &DGUSScreenVariableHandler::HandleAllHeatersOff, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMoveOption, nullptr), + VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), #endif #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), #else - VPHELPER(VP_MOVE_X, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, &ScreenHandler.HandleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &DGUSScreenVariableHandler::HandleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &DGUSScreenVariableHandler::HandlePowerLossRecovery, nullptr), + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), #endif - VPHELPER(VP_SETTINGS, nullptr, &DGUSScreenVariableHandler::HandleSettings, nullptr), + VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), #if ENABLED(SINGLE_Z_CALIBRATION) - VPHELPER(VP_Z_CALIBRATE, nullptr, &DGUSScreenVariableHandler::HandleZCalibration, nullptr), + VPHELPER(VP_Z_CALIBRATE, nullptr, &ScreenHandler.HandleZCalibration, nullptr), #endif #if ENABLED(FIRST_LAYER_CAL) - VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &DGUSScreenVariableHandler::HandleFirstLayerCal, nullptr), + VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &ScreenHandler.HandleFirstLayerCal, nullptr), #endif - { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr - { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplay }, + { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay }, // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_EPos, &destination.e, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_MOVE_E0, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), - VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, &DGUSScreenVariableHandler::HandlePreheat, nullptr), + VPHELPER(VP_E0_BED_PREHEAT, nullptr, &ScreenHandler.HandlePreheat, nullptr), #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &DGUSScreenVariableHandler::HandleFilamentOption, &DGUSScreenVariableHandler::HandleFilamentLoadUnload), + VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), #endif #if ENABLED(PIDTEMP) - VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &DGUSScreenVariableHandler::HandlePIDAutotune, nullptr), + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), #endif #endif #if HOTENDS >= 2 VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, nullptr, DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_MOVE_E1, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), - VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #if ENABLED(PIDTEMP) - VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, &DGUSScreenVariableHandler::HandlePIDAutotune, nullptr), + VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), #endif #endif // Fan Data #if HAS_FAN #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], DGUSScreenVariableHandler::DGUSLCD_PercentageToUint8, &DGUSScreenVariableHandler::DGUSLCD_SendPercentageToDisplay), \ - VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &DGUSScreenVariableHandler::HandleFanControl, nullptr), \ - VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendFanStatusToDisplay), + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, &ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &ScreenHandler.HandleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &ScreenHandler.DGUSLCD_SendFanStatusToDisplay), REPEAT(FAN_COUNT, FAN_VPHELPER) #endif // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, DGUSScreenVariableHandler::DGUSLCD_SetValueDirectly, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay ), + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), // Position Data - VPHELPER(VP_XPos, ¤t_position.x, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_YPos, ¤t_position.y, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_ZPos, ¤t_position.z, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_XPos, ¤t_position.x, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintProgressToDisplay ), + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintTimeToDisplay ), + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay ), #if ENABLED(PRINTCOUNTER) - VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintAccTimeToDisplay ), - VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintsTotalToDisplay ), + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintAccTimeToDisplay ), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintsTotalToDisplay ), #endif - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #if HOTENDS >= 1 - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], DGUSScreenVariableHandler::HandleStepPerMMExtruderChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #endif #if HOTENDS >= 2 - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], DGUSScreenVariableHandler::HandleStepPerMMExtruderChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #endif // SDCard File listing. #if ENABLED(SDSUPPORT) - VPHELPER(VP_SD_ScrollEvent, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ScrollFilelist, nullptr), - VPHELPER(VP_SD_FileSelected, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_FileSelected, nullptr), - VPHELPER(VP_SD_FileSelectConfirm, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_StartPrint, nullptr), - VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER(VP_SD_ResumePauseAbort, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ResumePauseAbort, nullptr), - VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ReallyAbort, nullptr), - VPHELPER(VP_SD_Print_Setting, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_PrintTune, nullptr), + VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, ScreenHandler.DGUSLCD_SD_ResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, DGUSScreenVariableHandler::HandleProbeOffsetZChanged, &DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, DGUSScreenVariableHandler::HandleLiveAdjustZ, nullptr), + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), #endif #endif #endif #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendWaitingStatusToDisplay), + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), #endif // Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content. - { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, VPHELPER(0, 0, 0, 0) // must be last entry. }; diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index b6a7fca903b2..73ee1a62d331 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -28,6 +28,7 @@ #include "../DGUSDisplayDef.h" #include "../DGUSDisplay.h" +#include "../DGUSScreenHandler.h" #include "../../../../../module/temperature.h" #include "../../../../../module/motion.h" @@ -153,152 +154,152 @@ const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Helper to detect touch events - VPHELPER(VP_SCREENCHANGE, nullptr, DGUSScreenVariableHandler::ScreenChangeHook, nullptr), - VPHELPER(VP_SCREENCHANGE_ASK, nullptr, DGUSScreenVariableHandler::ScreenChangeHookIfIdle, nullptr), + VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), #if ENABLED(SDSUPPORT) - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, DGUSScreenVariableHandler::ScreenChangeHookIfSD, nullptr), + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), #endif - VPHELPER(VP_CONFIRMED, nullptr, DGUSScreenVariableHandler::ScreenConfirmedOK, nullptr), + VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), - VPHELPER(VP_TEMP_ALL_OFF, nullptr, &DGUSScreenVariableHandler::HandleAllHeatersOff, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMoveOption, nullptr), + VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), #endif #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, &DGUSScreenVariableHandler::HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), #else - VPHELPER(VP_MOVE_X, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, nullptr, &DGUSScreenVariableHandler::HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, &ScreenHandler.HandleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &DGUSScreenVariableHandler::HandleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &DGUSScreenVariableHandler::HandlePowerLossRecovery, nullptr), + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), #endif - VPHELPER(VP_SETTINGS, nullptr, &DGUSScreenVariableHandler::HandleSettings, nullptr), + VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), - { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr - { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplay }, + { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay }, // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, nullptr, DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_EPos, &destination.e, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_MOVE_E0, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), - VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, &DGUSScreenVariableHandler::HandlePreheat, nullptr), + VPHELPER(VP_E0_BED_PREHEAT, nullptr, &ScreenHandler.HandlePreheat, nullptr), #endif #if ENABLED(PIDTEMP) - VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &DGUSScreenVariableHandler::HandlePIDAutotune, nullptr), + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &DGUSScreenVariableHandler::HandleFilamentOption, &DGUSScreenVariableHandler::HandleFilamentLoadUnload), + VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), #endif #endif #if HOTENDS >= 2 VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, nullptr, DGUSScreenVariableHandler::HandleFlowRateChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_MOVE_E1, nullptr, &DGUSScreenVariableHandler::HandleManualExtrude, nullptr), - VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #if ENABLED(PIDTEMP) - VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, &DGUSScreenVariableHandler::HandlePIDAutotune, nullptr), + VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), #endif #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, DGUSScreenVariableHandler::HandleTemperatureChanged, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &DGUSScreenVariableHandler::HandleHeaterControl, nullptr), - VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendHeaterStatusToDisplay), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #if ENABLED(PIDTEMPBED) - VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, DGUSScreenVariableHandler::HandleTemperaturePIDChanged, DGUSScreenVariableHandler::DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), #endif #endif // Fan Data #if HAS_FAN #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], DGUSScreenVariableHandler::DGUSLCD_PercentageToUint8, &DGUSScreenVariableHandler::DGUSLCD_SendPercentageToDisplay), \ - VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &DGUSScreenVariableHandler::HandleFanControl, nullptr), \ - VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &DGUSScreenVariableHandler::DGUSLCD_SendFanStatusToDisplay), + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, &ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &ScreenHandler.HandleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &ScreenHandler.DGUSLCD_SendFanStatusToDisplay), REPEAT(FAN_COUNT, FAN_VPHELPER) #endif // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, DGUSScreenVariableHandler::DGUSLCD_SetValueDirectly, &DGUSScreenVariableHandler::DGUSLCD_SendWordValueToDisplay ), + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), // Position Data - VPHELPER(VP_XPos, ¤t_position.x, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_YPos, ¤t_position.y, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_ZPos, ¤t_position.z, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_XPos, ¤t_position.x, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintProgressToDisplay ), + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintTimeToDisplay ), + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay ), #if ENABLED(PRINTCOUNTER) - VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintAccTimeToDisplay ), - VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendPrintsTotalToDisplay ), + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintAccTimeToDisplay ), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintsTotalToDisplay ), #endif - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], DGUSScreenVariableHandler::HandleStepPerMMChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #if HOTENDS >= 1 - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], DGUSScreenVariableHandler::HandleStepPerMMExtruderChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #endif #if HOTENDS >= 2 - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], DGUSScreenVariableHandler::HandleStepPerMMExtruderChanged, DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), #endif // SDCard File listing. #if ENABLED(SDSUPPORT) - VPHELPER(VP_SD_ScrollEvent, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ScrollFilelist, nullptr), - VPHELPER(VP_SD_FileSelected, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_FileSelected, nullptr), - VPHELPER(VP_SD_FileSelectConfirm, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_StartPrint, nullptr), - VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_SendFilename ), - VPHELPER(VP_SD_ResumePauseAbort, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ResumePauseAbort, nullptr), - VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_ReallyAbort, nullptr), - VPHELPER(VP_SD_Print_Setting, nullptr, DGUSScreenVariableHandler::DGUSLCD_SD_PrintTune, nullptr), + VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, ScreenHandler.DGUSLCD_SD_ResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, DGUSScreenVariableHandler::HandleProbeOffsetZChanged, &DGUSScreenVariableHandler::DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, DGUSScreenVariableHandler::HandleLiveAdjustZ, nullptr), + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), #endif #endif #endif #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, DGUSScreenVariableHandler::DGUSLCD_SendWaitingStatusToDisplay), + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), #endif // Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content. - { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &DGUSScreenVariableHandler::DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, VPHELPER(0, 0, 0, 0) // must be last entry. }; diff --git a/Marlin/src/lcd/extui_dgus_lcd.cpp b/Marlin/src/lcd/extui_dgus_lcd.cpp index 56308f08d6d3..e2d307d5357b 100644 --- a/Marlin/src/lcd/extui_dgus_lcd.cpp +++ b/Marlin/src/lcd/extui_dgus_lcd.cpp @@ -33,6 +33,7 @@ #include "extui/ui_api.h" #include "extui/lib/dgus/DGUSDisplay.h" #include "extui/lib/dgus/DGUSDisplayDef.h" +#include "extui/lib/dgus/DGUSScreenHandler.h" extern const char NUL_STR[]; diff --git a/buildroot/tests/FYSETC_F6_13-tests b/buildroot/tests/FYSETC_F6_13-tests index 5ddbac554e73..631a11778502 100644 --- a/buildroot/tests/FYSETC_F6_13-tests +++ b/buildroot/tests/FYSETC_F6_13-tests @@ -11,7 +11,8 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_FYSETC_F6_13 -exec_test $1 $2 "Default Configuration" +opt_enable DGUS_LCD_UI_FYSETC +exec_test $1 $2 "FYSETC F6 1.3 with DGUS" # clean up restore_configs From d96691f8ad6a1a35f0dcba686edd8cb1fbaf7fe5 Mon Sep 17 00:00:00 2001 From: Mark Langezaal Date: Mon, 20 Jul 2020 00:20:35 +0200 Subject: [PATCH 178/483] Fix encoder reverse, partial steps handling (#18694) --- Marlin/src/lcd/ultralcd.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index b8524e774cc7..bed72b19a399 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -896,7 +896,30 @@ void MarlinUI::update() { if (TERN0(REPRAPWORLD_KEYPAD, handle_keypad())) RESET_STATUS_TIMEOUT(); - const float abs_diff = ABS(encoderDiff); + uint8_t abs_diff = ABS(encoderDiff); + + #if ENCODER_PULSES_PER_STEP > 1 + // When reversing the encoder direction, a movement step can be missed because + // encoderDiff has a non-zero residual value, making the controller unresponsive. + // The fix clears the residual value when the encoder is reversed. + // Also check if past half the threshold to compensate for missed single steps. + static int8_t lastEncoderDiff; + int8_t prevDiff = lastEncoderDiff; + lastEncoderDiff = encoderDiff; // Store before updating encoderDiff to save actual steps + + // When not past threshold, and reversing... or past half the threshold + if (WITHIN(abs_diff, 1, (ENCODER_PULSES_PER_STEP) - 1) // Not past threshold + && (abs_diff > (ENCODER_PULSES_PER_STEP) / 2 // Passed half the threshold? Done! Call it a full step. + || (ABS(encoderDiff - prevDiff) >= (ENCODER_PULSES_PER_STEP) // A big change when abs_diff is small implies reverse + && ABS(prevDiff) < (ENCODER_PULSES_PER_STEP) // ...especially when starting from a partial or no step. + ) + ) + ) { + abs_diff = ENCODER_PULSES_PER_STEP; + encoderDiff = (encoderDiff < 0 ? -1 : 1) * abs_diff; // Treat as full step + } + #endif + const bool encoderPastThreshold = (abs_diff >= (ENCODER_PULSES_PER_STEP)); if (encoderPastThreshold || lcd_clicked) { if (encoderPastThreshold) { @@ -906,7 +929,7 @@ void MarlinUI::update() { int32_t encoderMultiplier = 1; if (encoderRateMultiplierEnabled) { - const float encoderMovementSteps = abs_diff / (ENCODER_PULSES_PER_STEP); + const float encoderMovementSteps = float(abs_diff) / (ENCODER_PULSES_PER_STEP); if (lastEncoderMovementMillis) { // Note that the rate is always calculated between two passes through the From 12ebb7115563bff96af4306486adf51f185e85d8 Mon Sep 17 00:00:00 2001 From: cccc Date: Mon, 20 Jul 2020 06:23:52 +0800 Subject: [PATCH 179/483] Update Chinese (cn) language (#18705) --- Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h | 51 ++++++++----------- Marlin/src/lcd/language/language_zh_CN.h | 28 +++++----- 2 files changed, 36 insertions(+), 43 deletions(-) diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h index e1d36478236f..de697cbef46d 100644 --- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h +++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h @@ -5,9 +5,6 @@ */ #include -const u8g_fntpgm_uint8_t fontpage_64_157_157[26] U8G_FONT_SECTION("fontpage_64_157_157") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x07,0x00,0x00, - 0x00,0x05,0x03,0x03,0x06,0x00,0x04,0xd8,0x48,0x90}; const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; @@ -252,10 +249,12 @@ const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x08,0x00,0xff,0x80,0x08, 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; -const u8g_fntpgm_uint8_t fontpage_165_160_160[45] U8G_FONT_SECTION("fontpage_165_160_160") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x20,0x00,0xfd,0xe0,0x25,0x20,0x25, - 0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0x20,0x55,0xe0,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_165_159_160[73] U8G_FONT_SECTION("fontpage_165_159_160") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x01,0x00,0xf9,0x00,0x27,0xe0,0x21, + 0x20,0x21,0x20,0x21,0x20,0x3a,0x20,0xc2,0x20,0x04,0x20,0x18,0xc0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x20,0x00,0x20,0x00,0xfd,0xe0,0x25,0x20,0x25,0x20,0x25,0x20,0x25, + 0x20,0x25,0x20,0x45,0x20,0x55,0xe0,0x89,0x20}; const u8g_fntpgm_uint8_t fontpage_165_168_168[45] U8G_FONT_SECTION("fontpage_165_168_168") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x79,0x00,0x01,0x00,0x03,0xe0,0xfd, @@ -298,6 +297,10 @@ const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7d,0xe0,0x91,0x20,0x11,0x20,0xff, 0x20,0x11,0x20,0x5d,0x20,0x51,0x20,0x51,0xa0,0x5d,0x40,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_167_139_139[45] U8G_FONT_SECTION("fontpage_167_139_139") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x20,0x00,0x22,0x00,0x22,0x00,0x22, + 0x00,0x3f,0xc0,0x22,0x00,0x22,0x80,0x42,0x40,0x42,0x00,0xbf,0xe0}; const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x00,0x2f,0xc0,0x28,0x40,0x2f, @@ -378,10 +381,6 @@ const u8g_fntpgm_uint8_t fontpage_172_232_232[45] U8G_FONT_SECTION("fontpage_172 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7b,0xc0,0x04, 0x80,0xff,0xe0,0x11,0x00,0xfb,0xe0,0x4a,0x40,0x4a,0x40,0x7b,0xc0}; -const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, - 0x40,0xa7,0xc0,0xe4,0x40,0x07,0xc0,0x04,0x40,0x07,0xc0,0x0c,0x60}; const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, @@ -496,10 +495,6 @@ const u8g_fntpgm_uint8_t fontpage_183_171_171[45] U8G_FONT_SECTION("fontpage_183 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x80,0x40,0x3f,0x00,0x21, 0x00,0x3f,0x00,0x00,0x00,0x7f,0x80,0x40,0x80,0x7f,0x80,0x40,0x80}; -const u8g_fntpgm_uint8_t fontpage_183_185_185[45] U8G_FONT_SECTION("fontpage_183_185_185") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x91,0x20,0x24,0x80,0x4a, - 0x40,0x11,0x00,0x20,0x80,0xdf,0x60,0x11,0x00,0x11,0x00,0x1f,0x00}; const u8g_fntpgm_uint8_t fontpage_183_249_249[45] U8G_FONT_SECTION("fontpage_183_249_249") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x00,0x80,0xf0,0x80,0x1f,0xe0,0x90,0x80,0x50, @@ -832,6 +827,10 @@ const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xfc,0x00,0x24,0x00,0x27, 0xc0,0x74,0x40,0x6e,0x40,0xa5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_207_151_151[45] U8G_FONT_SECTION("fontpage_207_151_151") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, + 0x00,0x6b,0x80,0xa5,0x40,0xa9,0x20,0x21,0x00,0x21,0x00,0x21,0x00}; const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, @@ -1022,10 +1021,6 @@ const u8g_fntpgm_uint8_t fontpage_243_187_187[45] U8G_FONT_SECTION("fontpage_243 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x2a,0x80,0x24,0x80,0x2a, 0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x49,0x40,0x5f,0x40,0x40,0xc0}; -const u8g_fntpgm_uint8_t fontpage_243_239_239[45] U8G_FONT_SECTION("fontpage_243_239_239") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0xe3,0xe0,0x22,0x20,0xfa,0x20,0x22, - 0x20,0x73,0xe0,0x68,0x00,0xa2,0x40,0xa2,0x40,0x24,0x20,0x28,0x20}; const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xe3,0xe0,0x24,0x20,0xfa,0x40,0x21, @@ -1050,10 +1045,6 @@ const u8g_fntpgm_uint8_t fontpage_247_128_128[45] U8G_FONT_SECTION("fontpage_247 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x27,0xc0,0x50, 0x40,0x4f,0x40,0x49,0x40,0x4f,0x40,0x49,0x40,0x4f,0x40,0x40,0xc0}; -const u8g_fntpgm_uint8_t fontpage_247_161_161[45] U8G_FONT_SECTION("fontpage_247_161_161") = { - 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, - 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x52,0x80,0xff,0xe0,0x80, - 0x20,0x3f,0x80,0x20,0x80,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0}; const u8g_fntpgm_uint8_t fontpage_247_177_177[45] U8G_FONT_SECTION("fontpage_247_177_177") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x4a,0x80,0x94,0x40,0x7f, @@ -1424,6 +1415,10 @@ const u8g_fntpgm_uint8_t fontpage_306_241_241[45] U8G_FONT_SECTION("fontpage_306 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x00,0x47,0xc0,0x7c,0x40,0x97,0x40,0xad, 0x40,0x25,0x40,0x27,0x40,0x24,0xc0,0x2c,0x20,0x34,0x20,0x23,0xe0}; +const u8g_fntpgm_uint8_t fontpage_308_236_236[45] U8G_FONT_SECTION("fontpage_308_236_236") = { + 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xec,0xec,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0x80,0x00,0x80,0x10,0x80,0x11,0x00,0x21, + 0x00,0x3f,0xe0,0x00,0x20,0x00,0x20,0xff,0x20,0x00,0x20,0x00,0xc0}; const u8g_fntpgm_uint8_t fontpage_308_241_241[45] U8G_FONT_SECTION("fontpage_308_241_241") = { 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf3,0xe0,0x12,0x00,0x52,0x20,0x53,0x20,0x52, @@ -1450,7 +1445,6 @@ const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510 #define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(64, 157, 157, fontpage_64_157_157), // 'â€' -- 'â€' FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' @@ -1508,7 +1502,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' FONTDATA_ITEM(164, 242, 242, fontpage_164_242_242), // '割' -- '割' FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' - FONTDATA_ITEM(165, 160, 160, fontpage_165_160_160), // '加' -- '加' + FONTDATA_ITEM(165, 159, 160, fontpage_165_159_160), // '功' -- '加' FONTDATA_ITEM(165, 168, 168, fontpage_165_168_168), // '动' -- '动' FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' FONTDATA_ITEM(166, 199, 199, fontpage_166_199_199), // 'å‡' -- 'å‡' @@ -1519,6 +1513,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(166, 240, 241, fontpage_166_240_241), // 'å°' -- 'å±' FONTDATA_ITEM(166, 244, 244, fontpage_166_244_244), // 'å´' -- 'å´' FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // 'å¸' -- 'å¸' + FONTDATA_ITEM(167, 139, 139, fontpage_167_139_139), // '压' -- '压' FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' FONTDATA_ITEM(167, 204, 205, fontpage_167_204_205), // 'åŒ' -- 'å' FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // 'å–' -- 'å–' @@ -1538,7 +1533,6 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(171, 183, 183, fontpage_171_183_183), // 'å–·' -- 'å–·' FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' FONTDATA_ITEM(172, 232, 232, fontpage_172_232_232), // '器' -- '器' - FONTDATA_ITEM(172, 244, 244, fontpage_172_244_244), // 'å™´' -- 'å™´' FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // 'å› ' -- 'å› ' FONTDATA_ITEM(173, 250, 250, fontpage_173_250_250), // '固' -- '固' @@ -1567,7 +1561,6 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(183, 154, 154, fontpage_183_154_154), // '定' -- '定' FONTDATA_ITEM(183, 162, 162, fontpage_183_162_162), // '客' -- '客' FONTDATA_ITEM(183, 171, 171, fontpage_183_171_171), // '宫' -- '宫' - FONTDATA_ITEM(183, 185, 185, fontpage_183_185_185), // '容' -- '容' FONTDATA_ITEM(183, 249, 249, fontpage_183_249_249), // '对' -- '对' FONTDATA_ITEM(184, 134, 134, fontpage_184_134_134), // 'å°†' -- 'å°†' FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // 'å°' -- 'å°' @@ -1650,6 +1643,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(206, 225, 225, fontpage_206_225_225), // 'æ¡' -- 'æ¡' FONTDATA_ITEM(206, 229, 229, fontpage_206_229_229), // 'æ¥' -- 'æ¥' FONTDATA_ITEM(206, 255, 255, fontpage_206_255_255), // 'æ¿' -- 'æ¿' + FONTDATA_ITEM(207, 151, 151, fontpage_207_151_151), // 'æž—' -- 'æž—' FONTDATA_ITEM(207, 241, 241, fontpage_207_241_241), // '柱' -- '柱' FONTDATA_ITEM(208, 161, 161, fontpage_208_161_161), // 'æ ¡' -- 'æ ¡' FONTDATA_ITEM(208, 188, 188, fontpage_208_188_188), // 'æ ¼' -- 'æ ¼' @@ -1697,14 +1691,12 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' FONTDATA_ITEM(240, 238, 238, fontpage_240_238_238), // 'ç¡®' -- 'ç¡®' FONTDATA_ITEM(243, 187, 187, fontpage_243_187_187), // '离' -- '离' - FONTDATA_ITEM(243, 239, 239, fontpage_243_239_239), // '积' -- '积' FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // '移' -- '移' FONTDATA_ITEM(244, 250, 250, fontpage_244_250_250), // '空' -- '空' FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' FONTDATA_ITEM(246, 172, 172, fontpage_246_172_172), // '第' -- '第' FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // 'ç­‰' -- 'ç­‰' FONTDATA_ITEM(247, 128, 128, fontpage_247_128_128), // '简' -- '简' - FONTDATA_ITEM(247, 161, 161, fontpage_247_161_161), // '管' -- '管' FONTDATA_ITEM(247, 177, 177, fontpage_247_177_177), // 'ç®±' -- 'ç®±' FONTDATA_ITEM(248, 251, 251, fontpage_248_251_251), // 'ç±»' -- 'ç±»' FONTDATA_ITEM(250, 162, 162, fontpage_250_162_162), // 'ç´¢' -- 'ç´¢' @@ -1797,6 +1789,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { FONTDATA_ITEM(305, 157, 157, fontpage_305_157_157), // 'é¢' -- 'é¢' FONTDATA_ITEM(305, 206, 206, fontpage_305_206_206), // '风' -- '风' FONTDATA_ITEM(306, 241, 241, fontpage_306_241_241), // '饱' -- '饱' + FONTDATA_ITEM(308, 236, 236, fontpage_308_236_236), // '马' -- '马' FONTDATA_ITEM(308, 241, 241, fontpage_308_241_241), // '驱' -- '驱' FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' FONTDATA_ITEM(317, 196, 196, fontpage_317_196_196), // '黄' -- '黄' diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index d0fd130a933c..c5b1b844068a 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -223,7 +223,7 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("白饱和度"); // "White Intensity") PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness") - PROGMEM Language_Str MSG_MOVING = _UxGT("移动 ..."); // "Moving...") + PROGMEM Language_Str MSG_MOVING = _UxGT("移动..."); // "Moving...") PROGMEM Language_Str MSG_FREE_XY = _UxGT("释放 XY"); // "Free XY") PROGMEM Language_Str MSG_MOVE_X = _UxGT("移动X"); //"Move X" PROGMEM Language_Str MSG_MOVE_Y = _UxGT("移动Y"); //"Move Y" @@ -306,17 +306,17 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("频率最大"); PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("进给速度"); PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("轴步数/mm"); //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("轴步数/mm"); //"Asteps/mm" - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("轴步数/mm"); //"Bsteps/mm" - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("轴步数/mm"); //"Csteps/mm" - PROGMEM Language_Str MSG_E_STEPS = _UxGT("挤出机步数/mm"); //"Esteps/mm" - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("挤出机~步数/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("步数/mm"); //"Asteps/mm" + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("步数/mm"); //"Bsteps/mm" + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("步数/mm"); //"Csteps/mm" + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E 步数/mm"); //"Esteps/mm" + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* 步数/mm"); PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("温度"); //"Temperature" PROGMEM Language_Str MSG_MOTION = _UxGT("è¿åŠ¨"); //"Motion" PROGMEM Language_Str MSG_FILAMENT = _UxGT("æ–™ä¸"); //"Filament" menu_advanced_filament - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); //"E in mm3" volumetric_enabled - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E 在 mm³"); //"E in mm3" volumetric_enabled + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E é™åˆ¶ 在 mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E é™åˆ¶ *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("ä¸æ–™ç›´å¾„"); //"Fil. Dia." PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("ä¸æ–™ç›´å¾„ *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("å¸è½½ mm"); // "Unload mm" @@ -394,10 +394,10 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("风扇时间"); PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("自动开"); PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("自动关"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Tool Migration"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migration"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Last Extruder"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrate to *"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("工具è¿ç§»"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("自动è¿ç§»"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("上一个挤出机"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("è¿ç§»è‡³ *"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("æ›´æ¢ä¸æ–™"); //"Change filament" PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("æ›´æ¢ä¸æ–™ *"); //"Change filament" PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("装载ä¸æ–™"); // "Load filament" @@ -421,7 +421,7 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("模å¼ä¿å­˜"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("设置BLTouch为5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("设置BLTouch为OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("报告Drain"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("报告开æ¼"); PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("å±é™©: 错误的设置将引起æŸå! 是å¦ç»§ç»­?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("åˆå§‹åŒ–TouchMI"); From 1c94033f7c0ecae200174f251d7cfceab5b7048f Mon Sep 17 00:00:00 2001 From: yufanyufan Date: Sun, 19 Jul 2020 15:34:36 -0700 Subject: [PATCH 180/483] Fix endian DGUS WriteVariable (#18703) --- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 21 +++++++++++++++++++ Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 3 +++ .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 18 +++++++--------- .../lcd/extui/lib/dgus/DGUSScreenHandler.h | 18 ++-------------- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index 989a06623a7b..fec06290b47f 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -94,9 +94,30 @@ void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t values } void DGUSDisplay::WriteVariable(uint16_t adr, uint16_t value) { + value = (value & 0xffU) << 8U | (value >> 8U); WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); } +void DGUSDisplay::WriteVariable(uint16_t adr, int16_t value) { + value = (value & 0xffU) << 8U | (value >> 8U); + WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); +} + +void DGUSDisplay::WriteVariable(uint16_t adr, uint8_t value) { + WriteVariable(adr, static_cast(&value), sizeof(uint8_t)); +} + +void DGUSDisplay::WriteVariable(uint16_t adr, long value) { + union { long l; char lb[4]; } endian; + char tmp[4]; + endian.l = value; + tmp[0] = endian.lb[3]; + tmp[1] = endian.lb[2]; + tmp[2] = endian.lb[1]; + tmp[3] = endian.lb[0]; + WriteVariable(adr, static_cast(&tmp), sizeof(long)); +} + void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { const char* myvalues = static_cast(values); bool strend = !myvalues; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index fd83451228dd..54d68eacd24e 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -54,7 +54,10 @@ class DGUSDisplay { // Variable access. static void WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false); static void WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false); + static void WriteVariable(uint16_t adr, int16_t value); static void WriteVariable(uint16_t adr, uint16_t value); + static void WriteVariable(uint16_t adr, uint8_t value); + static void WriteVariable(uint16_t adr, long value); // Until now I did not need to actively read from the display. That's why there is no ReadVariable // (I extensively use the auto upload of the display) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 6ff578832695..d5958d2b202d 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -118,10 +118,10 @@ void DGUSScreenHandler::DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); - uint8_t *tmp = (uint8_t *) var.memadr; - uint16_t data_to_send = (tmp[0] << 8); - if (var.size >= 1) data_to_send |= tmp[1]; - dgusdisplay.WriteVariable(var.VP, data_to_send); + if (var.size > 1) + dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + else + dgusdisplay.WriteVariable(var.VP, *(int8_t*)var.memadr); } } @@ -132,8 +132,7 @@ void DGUSScreenHandler::DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var) { //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); uint16_t tmp = *(uint8_t *) var.memadr +1 ; // +1 -> avoid rounding issues for the display. tmp = map(tmp, 0, 255, 0, 100); - uint16_t data_to_send = swap16(tmp); - dgusdisplay.WriteVariable(var.VP, data_to_send); + dgusdisplay.WriteVariable(var.VP, tmp); } } @@ -142,8 +141,7 @@ void DGUSScreenHandler::DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var //DEBUG_ECHOPAIR(" DGUSLCD_SendPrintProgressToDisplay ", var.VP); uint16_t tmp = ExtUI::getProgress_percent(); //DEBUG_ECHOLNPAIR(" data ", tmp); - uint16_t data_to_send = swap16(tmp); - dgusdisplay.WriteVariable(var.VP, data_to_send); + dgusdisplay.WriteVariable(var.VP, tmp); } // Send the current print time to the display. @@ -242,7 +240,6 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { DEBUG_ECHOLNPAIR(" data ", *(uint8_t *)var.memadr); uint16_t data_to_send = 0; if (*(uint8_t *) var.memadr) data_to_send = 1; - data_to_send = swap16(data_to_send); dgusdisplay.WriteVariable(var.VP, data_to_send); } } @@ -255,7 +252,6 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) DEBUG_ECHOLNPAIR(" data ", *(int16_t *)var.memadr); uint16_t data_to_send = 0; if (*(int16_t *) var.memadr) data_to_send = 1; - data_to_send = swap16(data_to_send); dgusdisplay.WriteVariable(var.VP, data_to_send); } } @@ -268,7 +264,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) //DEBUG_ECHOPAIR(" DGUSLCD_SendWaitingStatusToDisplay ", var.VP); //DEBUG_ECHOLNPAIR(" data ", swap16(index)); if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) { - dgusdisplay.WriteVariable(var.VP, swap16(index)); + dgusdisplay.WriteVariable(var.VP, index); //DEBUG_ECHOLNPAIR(" data ", swap16(index)); if (++index >= DGUS_UI_WAITING_STATUS) index = 0; period = 0; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h index d5b1450e2f09..a7274fc2f873 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h @@ -184,15 +184,7 @@ class DGUSScreenHandler { if (var.memadr) { float f = *(float *)var.memadr; f *= cpow(10, decimals); - union { long l; char lb[4]; } endian; - - char tmp[4]; - endian.l = f; - tmp[0] = endian.lb[3]; - tmp[1] = endian.lb[2]; - tmp[2] = endian.lb[1]; - tmp[3] = endian.lb[0]; - dgusdisplay.WriteVariable(var.VP, tmp, 4); + dgusdisplay.WriteVariable(var.VP, (long)f); } } @@ -205,13 +197,7 @@ class DGUSScreenHandler { float f = *(float *)var.memadr; DEBUG_ECHOLNPAIR_F(" >> ", f, 6); f *= cpow(10, decimals); - union { int16_t i; char lb[2]; } endian; - - char tmp[2]; - endian.i = f; - tmp[0] = endian.lb[1]; - tmp[1] = endian.lb[0]; - dgusdisplay.WriteVariable(var.VP, tmp, 2); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); } } From 12bc63913cb5c05adffd5ea22fcb8837d2cd34fb Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 19 Jul 2020 15:41:36 -0700 Subject: [PATCH 181/483] Fix BLTouch PWM reliability in HAL/STM32 (#18702) --- Marlin/src/HAL/STM32/HAL.cpp | 2 +- Marlin/src/HAL/STM32/Servo.cpp | 24 ++++++++++++++++-- Marlin/src/HAL/STM32/Servo.h | 1 + Marlin/src/HAL/STM32/timers.cpp | 44 ++++++++++++++++++++++----------- Marlin/src/HAL/STM32/timers.h | 3 ++- 5 files changed, 56 insertions(+), 18 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index c09592a5645c..1430182fc366 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -79,7 +79,7 @@ void HAL_init() { while (!LL_PWR_IsActiveFlag_BRR()); // Wait until backup regulator is initialized #endif - SetSoftwareSerialTimerInterruptPriority(); + SetTimerInterruptPriorities(); TERN_(EMERGENCY_PARSER, USB_Hook_init()); } diff --git a/Marlin/src/HAL/STM32/Servo.cpp b/Marlin/src/HAL/STM32/Servo.cpp index 5fb8e3cd6ae7..0a79d474d44a 100644 --- a/Marlin/src/HAL/STM32/Servo.cpp +++ b/Marlin/src/HAL/STM32/Servo.cpp @@ -33,6 +33,18 @@ static libServo *servos[NUM_SERVOS] = {0}; constexpr millis_t servoDelay[] = SERVO_DELAY; static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); +// Initialize to the default timer priority. This will be overridden by a call from timers.cpp. +// This allows all timer interrupt priorities to be managed from a single location in the HAL. +static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO); + +// This must be called after the STM32 Servo class has intialized the timer. +// It may only be needed after the first call to attach(), but it is possible +// that is is necessary after every detach() call. To be safe this is currently +// called after every call to attach(). +static void fixServoTimerInterruptPriority() { + NVIC_SetPriority(getTimerUpIrq(TIMER_SERVO), servo_interrupt_priority); +} + libServo::libServo() : delay(servoDelay[servoCount]), was_attached_before_pause(false), @@ -44,13 +56,17 @@ libServo::libServo() int8_t libServo::attach(const int pin) { if (servoCount >= MAX_SERVOS) return -1; if (pin > 0) servo_pin = pin; - return stm32_servo.attach(servo_pin); + auto result = stm32_servo.attach(servo_pin); + fixServoTimerInterruptPriority(); + return result; } int8_t libServo::attach(const int pin, const int min, const int max) { if (servoCount >= MAX_SERVOS) return -1; if (pin > 0) servo_pin = pin; - return stm32_servo.attach(servo_pin, min, max); + auto result = stm32_servo.attach(servo_pin, min, max); + fixServoTimerInterruptPriority(); + return result; } void libServo::move(const int value) { @@ -86,5 +102,9 @@ void libServo::resume_all_servos() { if (servo) servo->resume(); } +void libServo::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { + servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority); +} + #endif // HAS_SERVOS #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/Servo.h b/Marlin/src/HAL/STM32/Servo.h index 50ae1a9b946e..534cb97e39f7 100644 --- a/Marlin/src/HAL/STM32/Servo.h +++ b/Marlin/src/HAL/STM32/Servo.h @@ -41,6 +41,7 @@ class libServo { static void pause_all_servos(); static void resume_all_servos(); + static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); private: Servo stm32_servo; diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index 5383c82212d4..e98a6a556093 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -29,26 +29,41 @@ #define NUM_HARDWARE_TIMERS 2 +// Default timer priorities. Override by specifying alternate priorities in the board pins file. +// The TONE timer is not present here, as it currently cannot be set programmatically. It is set +// by defining TIM_IRQ_PRIO in the variant.h or platformio.ini file, which adjusts the default +// priority for STM32 HardwareTimer objects. +#define SWSERIAL_TIMER_IRQ_PRIO_DEFAULT 1 // Requires tight bit timing to communicate reliably with TMC drivers +#define SERVO_TIMER_IRQ_PRIO_DEFAULT 1 // Requires tight PWM timing to control a BLTouch reliably +#define STEP_TIMER_IRQ_PRIO_DEFAULT 2 +#define TEMP_TIMER_IRQ_PRIO_DEFAULT 14 // Low priority avoids interference with other hardware and timers + #ifndef STEP_TIMER_IRQ_PRIO - #define STEP_TIMER_IRQ_PRIO 2 + #define STEP_TIMER_IRQ_PRIO STEP_TIMER_IRQ_PRIO_DEFAULT #endif #ifndef TEMP_TIMER_IRQ_PRIO - #define TEMP_TIMER_IRQ_PRIO 14 // 14 = after hardware ISRs -#endif - -// Ensure the default timer priority is somewhere between the STEP and TEMP priorities. -// The STM32 framework defaults to interrupt 14 for all timers. This should be increased so that -// timing-sensitive operations such as speaker output are note impacted by the long-running -// temperature ISR. This must be defined in the platformio.ini file or the board's variant.h, -// so that it will be consumed by framework code. -#if !(TIM_IRQ_PRIO > STEP_TIMER_IRQ_PRIO && TIM_IRQ_PRIO < TEMP_TIMER_IRQ_PRIO) - #error "Default timer interrupt priority is unspecified or set to a value which may degrade performance." + #define TEMP_TIMER_IRQ_PRIO TEMP_TIMER_IRQ_PRIO_DEFAULT #endif - #if HAS_TMC_SW_SERIAL #include #ifndef SWSERIAL_TIMER_IRQ_PRIO - #define SWSERIAL_TIMER_IRQ_PRIO 1 + #define SWSERIAL_TIMER_IRQ_PRIO SWSERIAL_TIMER_IRQ_PRIO_DEFAULT + #endif +#endif +#if HAS_SERVOS + #include "Servo.h" + #ifndef SERVO_TIMER_IRQ_PRIO + #define SERVO_TIMER_IRQ_PRIO SERVO_TIMER_IRQ_PRIO_DEFAULT + #endif +#endif +#if ENABLED(SPEAKER) + // Ensure the default timer priority is somewhere between the STEP and TEMP priorities. + // The STM32 framework defaults to interrupt 14 for all timers. This should be increased so that + // timing-sensitive operations such as speaker output are not impacted by the long-running + // temperature ISR. This must be defined in the platformio.ini file or the board's variant.h, + // so that it will be consumed by framework code. + #if !(TIM_IRQ_PRIO > STEP_TIMER_IRQ_PRIO && TIM_IRQ_PRIO < TEMP_TIMER_IRQ_PRIO) + #error "Default timer interrupt priority is unspecified or set to a value which may degrade performance." #endif #endif @@ -189,8 +204,9 @@ TIM_TypeDef * HAL_timer_device(const uint8_t timer_num) { return nullptr; } -void SetSoftwareSerialTimerInterruptPriority() { +void SetTimerInterruptPriorities() { TERN_(HAS_TMC_SW_SERIAL, SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIO, 0)); + TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIO, 0)); } #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/timers.h b/Marlin/src/HAL/STM32/timers.h index d6b333ef9cfc..23a379973c5e 100644 --- a/Marlin/src/HAL/STM32/timers.h +++ b/Marlin/src/HAL/STM32/timers.h @@ -86,8 +86,9 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num); void HAL_timer_disable_interrupt(const uint8_t timer_num); bool HAL_timer_interrupt_enabled(const uint8_t timer_num); +// Configure timer priorities for peripherals such as Software Serial or Servos. // Exposed here to allow all timer priority information to reside in timers.cpp -void SetSoftwareSerialTimerInterruptPriority(); +void SetTimerInterruptPriorities(); //TIM_TypeDef* HAL_timer_device(const uint8_t timer_num); no need to be public for now. not public = not used externally From 805fb4cb1b837dbe983602f56f067417e7e00929 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 20 Jul 2020 00:09:07 +0000 Subject: [PATCH 182/483] [cron] Bump distribution date (2020-07-20) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index bc59d6ca073e..ad9d310a53d7 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-19" + #define STRING_DISTRIBUTION_DATE "2020-07-20" #endif /** From c6233b1ea8701026d7605be79c0609fdf96c2aca Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 20 Jul 2020 04:41:23 +0200 Subject: [PATCH 183/483] SAMD51: More reliable Servo/BLTouch PWM (#18710) --- Marlin/src/HAL/SAMD51/timers.cpp | 4 +++- Marlin/src/HAL/SAMD51/timers.h | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/SAMD51/timers.cpp b/Marlin/src/HAL/SAMD51/timers.cpp index a404e35dac87..3b73f196f7a7 100644 --- a/Marlin/src/HAL/SAMD51/timers.cpp +++ b/Marlin/src/HAL/SAMD51/timers.cpp @@ -23,7 +23,9 @@ // -------------------------------------------------------------------------- // Includes // -------------------------------------------------------------------------- + #include "../../inc/MarlinConfig.h" +#include "ServoTimers.h" // for SERVO_TC // -------------------------------------------------------------------------- // Local defines @@ -39,7 +41,7 @@ const tTimerConfig TimerConfig[NUM_HARDWARE_TIMERS+1] = { { {.pTc=TC0}, TC0_IRQn, TC_PRIORITY(0) }, // 0 - stepper (assigned priority 2) { {.pTc=TC1}, TC1_IRQn, TC_PRIORITY(1) }, // 1 - stepper (needed by 32 bit timers) { {.pTc=TC2}, TC2_IRQn, 5 }, // 2 - tone (reserved by framework and fixed assigned priority 5) - { {.pTc=TC3}, TC3_IRQn, TC_PRIORITY(3) }, // 3 - servo (no interrupts used) + { {.pTc=TC3}, TC3_IRQn, TC_PRIORITY(3) }, // 3 - servo (assigned priority 1) { {.pTc=TC4}, TC4_IRQn, TC_PRIORITY(4) }, // 4 - software serial (no interrupts used) { {.pTc=TC5}, TC5_IRQn, TC_PRIORITY(5) }, { {.pTc=TC6}, TC6_IRQn, TC_PRIORITY(6) }, diff --git a/Marlin/src/HAL/SAMD51/timers.h b/Marlin/src/HAL/SAMD51/timers.h index 392b8946f5fa..40ad910cb896 100644 --- a/Marlin/src/HAL/SAMD51/timers.h +++ b/Marlin/src/HAL/SAMD51/timers.h @@ -59,8 +59,9 @@ typedef uint32_t hal_timer_t; #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) -#define TC_PRIORITY(t) (t == STEP_TIMER_NUM || t == PULSE_TIMER_NUM) ? 2 \ - : (t == TEMP_TIMER_NUM) ? 6 \ +#define TC_PRIORITY(t) t == SERVO_TC ? 1 \ + : (t == STEP_TIMER_NUM || t == PULSE_TIMER_NUM) ? 2 \ + : (t == TEMP_TIMER_NUM) ? 6 \ : 7 #define _TC_HANDLER(t) void TC##t##_Handler() From 4a55bdb1656de2fc63d3d93f53ff50a1e1ce393d Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 19 Jul 2020 23:42:30 -0300 Subject: [PATCH 184/483] Only download & compile required libraries (#18699) --- Marlin/src/core/drivers.h | 7 + Marlin/src/feature/touch/xpt2046.cpp | 5 +- Marlin/src/inc/SanityCheck.h | 5 +- Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp | 4 - Marlin/src/module/stepper/TMC26X.cpp | 4 +- Marlin/src/pins/pins.h | 6 +- .../scripts/common-features-dependencies.h | 50 ++++++ .../scripts/common-features-dependencies.py | 135 +++++++++++++++ platformio.ini | 156 +++++++++--------- 9 files changed, 285 insertions(+), 87 deletions(-) create mode 100644 buildroot/share/PlatformIO/scripts/common-features-dependencies.h create mode 100644 buildroot/share/PlatformIO/scripts/common-features-dependencies.py diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h index 707926791b2a..0936b7b499db 100644 --- a/Marlin/src/core/drivers.h +++ b/Marlin/src/core/drivers.h @@ -176,6 +176,13 @@ #define HAS_TMC_SPI 1 #endif +// +// TMC26XX Stepper Drivers +// +#if HAS_DRIVER(TMC26X) + #define HAS_TMC26X 1 +#endif + // // L64XX Stepper Drivers // diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index 879d88bab3bb..d5926d8f5c17 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -23,7 +23,10 @@ #include "xpt2046.h" #include "../../inc/MarlinConfig.h" -#include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. +#if ENABLED(FSMC_GRAPHICAL_TFT) + #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. +#endif + /* * Draw and Touch processing diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index dd80cae4ff70..2654233485d3 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2205,12 +2205,15 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(MKS_12864OLED_SSD1306) \ + ENABLED(U8GLIB_SH1106_EINSTART) \ + ENABLED(OVERLORD_OLED) \ + + ENABLED(FYSETC_242_OLED_12864) \ + ENABLED(DGUS_LCD_UI_ORIGIN) \ + ENABLED(DGUS_LCD_UI_FYSETC) \ + ENABLED(DGUS_LCD_UI_HIPRECY) \ + ENABLED(MALYAN_LCD) \ + ENABLED(TOUCH_UI_FTDI_EVE) \ - + ENABLED(FSMC_GRAPHICAL_TFT) + + ENABLED(FSMC_GRAPHICAL_TFT) \ + + ENABLED(TFT_LVGL_UI) \ + + ENABLED(SPI_GRAPHICAL_TFT) #error "Please select no more than one LCD controller option." #endif diff --git a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp index 444780868a8d..9ba9b871ecca 100644 --- a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp +++ b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp @@ -23,10 +23,6 @@ #include -#ifndef LCD_CLASS - #include - #define LCD_CLASS LiquidCrystal -#endif extern LCD_CLASS lcd; int lcd_glyph_height() { return 1; } diff --git a/Marlin/src/module/stepper/TMC26X.cpp b/Marlin/src/module/stepper/TMC26X.cpp index 08c0b3e7828f..9d9178b240ae 100644 --- a/Marlin/src/module/stepper/TMC26X.cpp +++ b/Marlin/src/module/stepper/TMC26X.cpp @@ -30,7 +30,7 @@ // // TMC26X Driver objects and inits // -#if HAS_DRIVER(TMC26X) +#if HAS_TMC26X #include "TMC26X.h" @@ -141,4 +141,4 @@ void tmc26x_init_to_defaults() { #endif } -#endif // TMC26X +#endif // HAS_TMC26X diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 3e1e04404658..61db5a77f527 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -507,7 +507,7 @@ #elif MB(MKS_ROBIN_MINI) #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini #elif MB(MKS_ROBIN_NANO) - #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano env:mks_robin_nano35 + #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano #elif MB(MKS_ROBIN_LITE) #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite #elif MB(BTT_SKR_MINI_V1_1) @@ -541,9 +541,9 @@ #elif MB(CCROBOT_MEEB_3DP) #include "stm32f1/pins_CCROBOT_MEEB_3DP.h" // STM32F1 env:STM32F103RC_meeb #elif MB(CHITU3D_V5) - #include "stm32f1/pins_CHITU3D_V5.h" // STM32F1 env:chitu_f103 env:chitu_v5_gpio_init env:chitu_f103_lvgl + #include "stm32f1/pins_CHITU3D_V5.h" // STM32F1 env:chitu_f103 env:chitu_v5_gpio_init #elif MB(CHITU3D_V6) - #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 env:chitu_f103_lvgl + #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 #elif MB(CREALITY_V4) #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality #elif MB(TRIGORILLA_PRO) diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.h b/buildroot/share/PlatformIO/scripts/common-features-dependencies.h new file mode 100644 index 000000000000..44d690fc1010 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * The purpose of this file is just include Marlin Configuration files, + * to discover which FEATURES are enabled, without any HAL include. + * Used by common-features-dependencies.py + */ + +#ifndef __MARLIN_FIRMWARE__ +#define __MARLIN_FIRMWARE__ +#endif + +// +// Prefix header to acquire configurations +// +#include + +#include "../../../../Marlin/src/core/boards.h" +#include "../../../../Marlin/src/core/macros.h" +#include "../../../../Marlin/Configuration.h" + +#include "../../../../Marlin/Version.h" + +#include "../../../../Marlin/src/inc/Conditionals_LCD.h" + +#include "../../../../Marlin/src/core/drivers.h" +#include "../../../../Marlin/Configuration_adv.h" + +#include "../../../../Marlin/src/inc/Conditionals_adv.h" diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py new file mode 100644 index 000000000000..e88afd748851 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py @@ -0,0 +1,135 @@ +# +# common-features-dependencies.py +# Convenience script to check dependencies and add libs and sources for Marlin Enabled Features +# +import subprocess +import os +import re +try: + import configparser +except ImportError: + import ConfigParser as configparser +from platformio.managers.package import PackageManager + +Import("env") + +FEATURE_DEPENDENCIES = {} + +def load_config(): + config = configparser.ConfigParser() + config.read("platformio.ini") + items = config.items('features') + for key in items: + deps = re.sub(',\\s*', '\n', key[1]).strip().split('\n') + if not key[0].upper() in FEATURE_DEPENDENCIES: + FEATURE_DEPENDENCIES[key[0].upper()] = { + 'lib_deps': [] + } + for dep in deps: + parts = dep.split('=') + name = parts.pop(0) + rest = '='.join(parts) + if name == 'extra_scripts': + FEATURE_DEPENDENCIES[key[0].upper()]['extra_scripts'] = rest + elif name == 'src_filter': + FEATURE_DEPENDENCIES[key[0].upper()]['src_filter'] = rest + else: + FEATURE_DEPENDENCIES[key[0].upper()]['lib_deps'] += [dep] + +def install_features_dependencies(): + load_config() + for feature in FEATURE_DEPENDENCIES: + if not env.MarlinFeatureIsEnabled(feature): + continue + + if 'lib_deps' in FEATURE_DEPENDENCIES[feature]: + print("Adding lib_deps for %s... " % feature) + + # deps to add + deps_to_add = {} + for dep in FEATURE_DEPENDENCIES[feature]['lib_deps']: + name, _, _ = PackageManager.parse_pkg_uri(dep) + deps_to_add[name] = dep + + # first check if the env already have the dep + deps = env.GetProjectOption("lib_deps") + for dep in deps: + name, _, _ = PackageManager.parse_pkg_uri(dep) + if name in deps_to_add: + del deps_to_add[name] + + # check if we need ignore any lib + lib_ignore = env.GetProjectOption("lib_ignore") + for dep in deps: + name, _, _ = PackageManager.parse_pkg_uri(dep) + if name in deps_to_add: + del deps_to_add[name] + + # any left? + if len(deps_to_add) <= 0: + continue + + # add only the missing deps + proj = env.GetProjectConfig() + proj.set("env:" + env["PIOENV"], "lib_deps", deps + list(deps_to_add.values())) + + if 'extra_scripts' in FEATURE_DEPENDENCIES[feature]: + print("Executing extra_scripts for %s... " % feature) + env.SConscript(FEATURE_DEPENDENCIES[feature]['extra_scripts'], exports="env") + + if 'src_filter' in FEATURE_DEPENDENCIES[feature]: + print("Adding src_filter for %s... " % feature) + proj = env.GetProjectConfig() + src_filter = env.GetProjectOption("src_filter") + + # first we need to remove the references to the same folder + my_srcs = re.findall( r'[+-](<.*?>)', FEATURE_DEPENDENCIES[feature]['src_filter']) + cur_srcs = re.findall( r'[+-](<.*?>)', src_filter[0]) + for d in my_srcs: + if d in cur_srcs: + src_filter[0] = re.sub(r'[+-]' + d, '', src_filter[0]) + + src_filter[0] = FEATURE_DEPENDENCIES[feature]['src_filter'] + ' ' + src_filter[0] + proj.set("env:" + env["PIOENV"], "src_filter", src_filter) + env.Replace(SRC_FILTER=src_filter) + +# load marlin features +def load_marlin_features(): + if "MARLIN_FEATURES" in env: + return + + # procces defines + # print(env.Dump()) + build_flags = env.get('BUILD_FLAGS') + build_flags = env.ParseFlagsExtended(build_flags) + cmd = [] + # build flags from board.json + # if 'BOARD' in env: + # cmd += [env.BoardConfig().get("build.extra_flags")] + for s in build_flags['CPPDEFINES']: + if isinstance(s, tuple): + cmd += ['-D' + s[0] + '=' + str(s[1])] + else: + cmd += ['-D' + s] + # cmd += ['-w -dM -E -x c++ Marlin/src/inc/MarlinConfigPre.h'] + cmd += ['-w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-features-dependencies.h'] + cmd = [env.get('CXX')] + cmd + cmd = ' '.join(cmd) + print(cmd) + define_list = subprocess.check_output(cmd, shell=True).splitlines() + marlin_features = {} + for define in define_list: + feature = define[8:].strip().decode().split(' ') + feature, definition = feature[0], ' '.join(feature[1:]) + marlin_features[feature] = definition + env["MARLIN_FEATURES"] = marlin_features + +def MarlinFeatureIsEnabled(env, feature): + load_marlin_features() + return feature in env["MARLIN_FEATURES"] + +# add a method for others scripts to check if a feature is enabled +env.AddMethod(MarlinFeatureIsEnabled) + +# install all dependencies for features enabled in Configuration.h +install_features_dependencies() diff --git a/platformio.ini b/platformio.ini index 762a66f920e9..0bc559b09b68 100644 --- a/platformio.ini +++ b/platformio.ini @@ -25,25 +25,37 @@ include_dir = Marlin # The 'common' values are used for most Marlin builds # [common] -default_src_filter = + - - + -extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py +default_src_filter = + - - + - +extra_scripts = + pre:buildroot/share/PlatformIO/scripts/common-features-dependencies.py + pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants lib_deps = - LiquidCrystal@1.5.0 - TMCStepper@~0.7.1 - Adafruit MAX31865 library@~1.1.0 - Adafruit NeoPixel@1.5.0 - U8glib-HAL@0.4.1 - Arduino-L6470@0.8.0 - SlowSoftI2CMaster - LiquidTWI2@1.2.7 - SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip + +# +# Feature Dependencies +# +[features] +TFT_LVGL_UI = MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip + src_filter=+ +HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 +SR_LCD_2W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip +SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip +DIGIPOT_MCP4018 = SlowSoftI2CMaster +DIGIPOT_MCP4451 = SlowSoftI2CMaster +HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip +HAS_L64XX = Arduino-L6470@0.8.0 +NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 +MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 +HAS_GRAPHICAL_LCD = U8glib-HAL@0.4.1 +HAS_CHARACTER_LCD = LiquidCrystal@1.5.0, LiquidTWI2@1.2.7 # # Default values apply to all 'env:' prefixed environments # [env] framework = arduino +extra_scripts = ${common.extra_scripts} build_flags = ${common.build_flags} lib_deps = ${common.lib_deps} monitor_speed = 250000 @@ -69,8 +81,6 @@ monitor_speed = 250000 # [common_avr8] board_build.f_cpu = 16000000L -lib_deps = ${common.lib_deps} - TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip src_filter = ${common.default_src_filter} + # @@ -157,7 +167,6 @@ board_upload.maximum_size = 126976 platform = atmelavr extends = common_avr8 board = sanguino_atmega1284p -lib_ignore = TMCStepper upload_speed = 57600 board_upload.maximum_size = 126976 @@ -168,7 +177,6 @@ board_upload.maximum_size = 126976 platform = atmelavr extends = common_avr8 board = sanguino_atmega1284p -lib_ignore = TMCStepper upload_speed = 115200 # @@ -191,7 +199,6 @@ build_unflags = -g -ggdb platform = teensy extends = common_avr8 board = at90usb1286 -lib_ignore = TMCStepper # # AT90USB1286 boards using DFU bootloader @@ -243,7 +250,8 @@ board = due src_filter = ${common.default_src_filter} + build_flags = ${common.build_flags} -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON -extra_scripts = Marlin/src/HAL/DUE/upload_extra_script.py +extra_scripts = ${common.extra_scripts} + Marlin/src/HAL/DUE/upload_extra_script.py [env:DUE_archim] platform = ${common_DUE_archim.platform} @@ -268,7 +276,6 @@ build_flags = ${common_DUE_archim.build_flags} -funwind-tables -mpoke-function platform = atmelsam board = adafruit_grandcentral_m4 build_flags = ${common.build_flags} -std=gnu++17 -extra_scripts = ${common.extra_scripts} build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} @@ -290,7 +297,8 @@ platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0. board = nxp_lpc1768 lib_ldf_mode = off lib_compat_mode = strict -extra_scripts = Marlin/src/HAL/LPC1768/upload_extra_script.py +extra_scripts = ${common.extra_scripts} + Marlin/src/HAL/LPC1768/upload_extra_script.py src_filter = ${common.default_src_filter} + lib_deps = Servo LiquidCrystal@1.0.0 @@ -298,7 +306,8 @@ lib_deps = Servo TMCStepper@~0.7.1 Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -build_flags = -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g ${common.build_flags} +build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g +lib_ignore = LiquidTWI2 # debug options for backtrace #-funwind-tables #-mpoke-function-name @@ -328,7 +337,6 @@ board = nxp_lpc1769 [common_stm32] platform = ststm32@~6.1.0 platform_packages = framework-arduinoststm32@>=4.10700,<4.10800 -lib_deps = ${common.lib_deps} lib_ignore = SoftwareSerial build_flags = ${common.build_flags} -IMarlin/src/HAL/STM32 -std=gnu++14 @@ -348,7 +356,6 @@ build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + lib_ignore = - Adafruit NeoPixel SPI lib_deps = ${common.lib_deps} SoftwareSerialM @@ -379,8 +386,9 @@ build_flags = ${common_stm32f1.build_flags} -DUSE_USB_COMPOSITE -DVECT_TAB_OFFSET=0x2000 -DGENERIC_BOOTLOADER -extra_scripts = pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py - buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py + buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py lib_deps = TMCStepper@~0.7.1 Adafruit MAX31865 library@~1.1.0 @@ -402,7 +410,8 @@ upload_protocol = dfu [env:STM32F103RC_fysetc] platform = ${common_stm32f1.platform} extends = env:STM32F103RC -extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 lib_ldf_mode = chain debug_tool = stlink @@ -420,7 +429,8 @@ upload_protocol = serial [env:STM32F103RC_btt] platform = ${common_stm32f1.platform} extends = env:STM32F103RC -extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 monitor_speed = 115200 @@ -462,7 +472,8 @@ monitor_speed = 115200 [env:STM32F103RE_btt] platform = ${common_stm32f1.platform} extends = env:STM32F103RE -extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 debug_tool = stlink upload_protocol = stlink @@ -526,7 +537,8 @@ upload_protocol = serial platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 build_unflags = ${common_stm32f1.build_unflags} @@ -541,7 +553,8 @@ lib_ignore = ${common_stm32f1.lib_ignore} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_mini.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_mini.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE @@ -553,20 +566,11 @@ platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE platform_packages = tool-stm32duino -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_nano.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -# -# MKS Robin Nano (STM32F103VET6) - MKS UI (LVGL) -# -[env:mks_robin_nano35] -platform = ${common_stm32f1.platform} -extends = env:mks_robin_nano -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano35.py -lib_deps = ${common_stm32f1.lib_deps} - MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip - # # MKS Robin (STM32F103ZET6) # @@ -574,7 +578,8 @@ lib_deps = ${common_stm32f1.lib_deps} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103ZE -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin.py build_flags = ${common_stm32f1.build_flags} -DSS_TIMER=4 -DSTM32_XL_DENSITY @@ -584,7 +589,8 @@ build_flags = ${common_stm32f1.build_flags} [env:mks_robin_pro] platform = ${common_stm32f1.platform} extends = env:mks_robin -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_pro.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_pro.py # @@ -603,7 +609,8 @@ platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC platform_packages = tool-stm32duino -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_e3.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_e3.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 @@ -614,7 +621,8 @@ build_flags = ${common_stm32f1.build_flags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_lite.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_lite.py # @@ -624,7 +632,8 @@ extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_lite.py platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_lite3.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_lite3.py # # JGAurora A5S A1 (STM32F103ZET6) @@ -633,7 +642,8 @@ extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_lite3.py platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103ZE -extra_scripts = buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py build_flags = ${common_stm32f1.build_flags} -DSTM32F1xx -DSTM32_XL_DENSITY @@ -648,7 +658,7 @@ build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103CB -D__STM32F1__=1 -std=c++1y -DSERIAL_USB -ffunction-sections -fdata-sections -Wl,--gc-sections -DDEBUG_LEVEL=0 -D__MARLIN_FIRMWARE__ lib_ignore = ${common_stm32f1.lib_ignore} - LiquidCrystal, LiquidTWI2, TMCStepper, U8glib-HAL, SoftwareSerialM + SoftwareSerialM # # Malyan M200 v2 (STM32F070RB) @@ -660,7 +670,7 @@ board = malyanM200v2 build_flags = ${common_stm32.build_flags} -DSTM32F0xx -DUSB_PRODUCT=\"STM32F070RB\" -DHAL_PCD_MODULE_ENABLED -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing -std=gnu11 -std=gnu++11 -DCUSTOM_STARTUP_FILE -lib_ignore = LiquidCrystal, LiquidTWI2, Adafruit NeoPixel, TMCStepper, U8glib-HAL, SoftwareSerial +lib_ignore = SoftwareSerial # # Malyan M300 (STM32F070CB) @@ -672,7 +682,6 @@ build_flags = ${common.build_flags} -DUSBCON -DUSBD_VID=0x0483 "-DUSB_MANUFACTURER=\"Unknown\"" "-DUSB_PRODUCT=\"MALYAN_M300\"" -DHAL_PCD_MODULE_ENABLED -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED src_filter = ${common.default_src_filter} + -lib_ignore = LiquidCrystal, LiquidTWI2, Adafruit NeoPixel, TMCStepper, U8glib-HAL # # Chitu boards like Tronxy X5s (STM32F103ZET6) @@ -681,7 +690,8 @@ lib_ignore = LiquidCrystal, LiquidTWI2, Adafruit NeoPixel, TMCStepper, U8glib-H platform = ${common_stm32f1.platform} extends = common_stm32f1 board = CHITU_F103 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-features-dependencies.py + pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/chitu_crypt.py build_flags = ${common_stm32f1.build_flags} -DSTM32F1xx -DSTM32_XL_DENSITY @@ -697,17 +707,6 @@ platform = ${common_stm32f1.platform} extends = env:chitu_f103 build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX -# -# Chitu boards like Tronxy X5SA (STM32F103ZET6) using TFT LVGL UI -# -[env:chitu_f103_lvgl] -platform = ${common_stm32f1.platform} -extends = env:chitu_f103 -src_filter = ${common.default_src_filter} + -lib_deps = ${common.lib_deps} - SoftwareSerialM - MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip - # # Creality (STM32F103RET6) # @@ -717,9 +716,9 @@ extends = common_stm32f1 board = genericSTM32F103RC build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DSTM32_XL_DENSITY -DTEMP_TIMER_CHAN=4 -extra_scripts = buildroot/share/PlatformIO/scripts/creality.py +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/creality.py lib_ignore = ${common_stm32f1.lib_ignore} - LiquidCrystal, LiquidTWI2, U8glib-HAL, Adafruit_MAX31865, Arduino-L6470, SailfishLCD, SlowSoftI2CMaster debug_tool = jlink upload_protocol = jlink monitor_speed = 115200 @@ -736,9 +735,10 @@ build_flags = ${common_stm32.build_flags} -DTARGET_STM32F4 -DARDUINO_STEVAL -DSTM32F401xE -DUSB_PRODUCT=\"STEVAL_F401VE\" -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS -extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py -lib_ignore = Adafruit NeoPixel, TMCStepper, SailfishLCD, SlowSoftI2CMaster, SoftwareSerial +lib_ignore = SoftwareSerial # # FLYF407ZG @@ -750,7 +750,8 @@ board = FLYF407ZG build_flags = ${common_stm32.build_flags} -DSTM32F4 -DUSB_PRODUCT=\"STM32F407ZG\" -DTARGET_STM32F4 -DVECT_TAB_OFFSET=0x8000 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py # # FYSETC S6 (STM32F446VET6 ARM Cortex-M4) @@ -764,7 +765,8 @@ board = fysetc_s6 build_flags = ${common_stm32.build_flags} -DTARGET_STM32F4 -DVECT_TAB_OFFSET=0x10000 -DHAL_PCD_MODULE_ENABLED '-DUSB_PRODUCT="FYSETC_S6"' -extra_scripts = pre:buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py debug_tool = stlink upload_protocol = dfu upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" @@ -782,8 +784,9 @@ build_flags = ${common_stm32.build_flags} -DTARGET_STM32F4 -DARDUINO_BLACK_F407VE -DUSB_PRODUCT=\"BLACK_F407VE\" -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS -extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -lib_ignore = Adafruit NeoPixel, TMCStepper, SailfishLCD, SlowSoftI2CMaster, SoftwareSerial +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +lib_ignore = SoftwareSerial # # BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) @@ -795,7 +798,8 @@ board = BigTree_SKR_Pro build_flags = ${common_stm32.build_flags} -DUSB_PRODUCT=\"STM32F407ZG\" -DTARGET_STM32F4 -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py #upload_protocol = stlink #upload_command = "$PROJECT_PACKAGES_DIR/tool-stm32duino/stlink/ST-LINK_CLI.exe" -c SWD -P "$BUILD_DIR/firmware.bin" 0x8008000 -Rst -Run debug_tool = stlink @@ -808,7 +812,8 @@ debug_init_break = platform = ststm32@>=5.7.0,<6.2.0 extends = common_stm32 board = BigTree_GTR_v1 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py build_flags = ${common_stm32.build_flags} -DUSB_PRODUCT=\"STM32F407IG\" -DTARGET_STM32F4 -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 @@ -827,8 +832,8 @@ build_flags = ${common_stm32.build_flags} -DHAVE_HWSERIAL3 -DPIN_SERIAL2_RX=PD_6 -DPIN_SERIAL2_TX=PD_5 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -lib_ignore = Adafruit NeoPixel, SailfishLCD, SlowSoftI2CMaster, SoftwareSerial +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py # # Lerdge base @@ -838,7 +843,8 @@ platform = ${common_stm32.platform} extends = common_stm32 board = LERDGE board_build.offset = 0x10000 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py buildroot/share/PlatformIO/scripts/lerdge.py build_flags = ${common_stm32.build_flags} @@ -919,7 +925,6 @@ platform = teensy board = teensy31 lib_deps = ${common.lib_deps} TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip -lib_ignore = Adafruit NeoPixel src_filter = ${common.default_src_filter} + # @@ -930,7 +935,6 @@ platform = teensy board = teensy35 lib_deps = ${common.lib_deps} TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip -lib_ignore = Adafruit NeoPixel src_filter = ${common.default_src_filter} + # From a847f37d43e4571ddc848172caa71e49c087eebe Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 19 Jul 2020 19:53:29 -0700 Subject: [PATCH 185/483] Reduce Step Smoothing ceiling to 50% CPU usage (#18719) --- Marlin/src/module/stepper.cpp | 6 +++--- Marlin/src/module/stepper.h | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 16ff134923db..2a9e4dae2119 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2099,11 +2099,11 @@ uint32_t Stepper::block_phase_isr() { #if ENABLED(ADAPTIVE_STEP_SMOOTHING) uint8_t oversampling = 0; // Assume no axis smoothing (via oversampling) // Decide if axis smoothing is possible - uint32_t max_rate = current_block->nominal_rate; // Get the maximum rate (maximum event speed) + uint32_t max_rate = current_block->nominal_rate; // Get the step event rate while (max_rate < MIN_STEP_ISR_FREQUENCY) { // As long as more ISRs are possible... max_rate <<= 1; // Try to double the rate - if (max_rate >= MAX_STEP_ISR_FREQUENCY_1X) break; // Don't exceed the estimated ISR limit - ++oversampling; // Increase the oversampling (used for left-shift) + if (max_rate < MIN_STEP_ISR_FREQUENCY) // Don't exceed the estimated ISR limit + ++oversampling; // Increase the oversampling (used for left-shift) } oversampling_factor = oversampling; // For all timer interval calculations #else diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 6ae5076cd244..4665f2dc012e 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -229,8 +229,10 @@ #define MAX_STEP_ISR_FREQUENCY_2X ((F_CPU) / ISR_EXECUTION_CYCLES(2)) #define MAX_STEP_ISR_FREQUENCY_1X ((F_CPU) / ISR_EXECUTION_CYCLES(1)) -// The minimum allowable frequency for step smoothing will be 1/10 of the maximum nominal frequency (in Hz) -#define MIN_STEP_ISR_FREQUENCY MAX_STEP_ISR_FREQUENCY_1X +// The minimum step ISR rate used by ADAPTIVE_STEP_SMOOTHING to target 50% CPU usage +// This does not account for the possibility of multi-stepping. +// Perhaps DISABLE_MULTI_STEPPING should be required with ADAPTIVE_STEP_SMOOTHING. +#define MIN_STEP_ISR_FREQUENCY (MAX_STEP_ISR_FREQUENCY_1X / 2) // // Stepper class definition From 0a86291e66f0c33d399b8698dd0e7d41e628181b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 19 Jul 2020 22:06:45 -0500 Subject: [PATCH 186/483] Fix some LVGL warnings --- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 1 - Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 52e83204e980..af0d1f440ce5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -400,7 +400,6 @@ void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { volatile uint16_t *p_index; //int res; char *cur_name; - uint16_t Color; cur_name = strrchr(path, '/'); card.openFileRead(cur_name); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 54c030f96711..3fa626762528 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -590,7 +590,7 @@ unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { #endif #if USE_XPT2046 - #ifndef XPT2046_HOR_RES 480 + #ifndef XPT2046_HOR_RES #define XPT2046_HOR_RES 480 #endif #ifndef XPT2046_VER_RES From cea097df833767271950a210d265be1d7a534295 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 20 Jul 2020 06:52:15 -0300 Subject: [PATCH 187/483] Patch auto-deps for Windows CXX (#18721) --- .../scripts/common-features-dependencies.py | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py index e88afd748851..778004744f21 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py @@ -93,6 +93,29 @@ def install_features_dependencies(): proj.set("env:" + env["PIOENV"], "src_filter", src_filter) env.Replace(SRC_FILTER=src_filter) +# search the current compiler, considering the OS +def search_compiler(): + if env['PLATFORM'] == 'win32': + # the first path have the compiler + compiler_path = None + for path in env['ENV']['PATH'].split(';'): + if re.search(r'platformio\\packages.*\\bin', path): + compiler_path = path + break + if compiler_path == None: + print("Could not find the g++ path") + return None + + print(compiler_path) + for file in os.listdir(compiler_path): + if file.endswith("g++.exe"): + return file + print("Could not find the g++") + return None + else: + return env.get('CXX') + + # load marlin features def load_marlin_features(): if "MARLIN_FEATURES" in env: @@ -102,7 +125,10 @@ def load_marlin_features(): # print(env.Dump()) build_flags = env.get('BUILD_FLAGS') build_flags = env.ParseFlagsExtended(build_flags) - cmd = [] + + cxx = search_compiler() + cmd = [cxx] + # build flags from board.json # if 'BOARD' in env: # cmd += [env.BoardConfig().get("build.extra_flags")] @@ -113,7 +139,6 @@ def load_marlin_features(): cmd += ['-D' + s] # cmd += ['-w -dM -E -x c++ Marlin/src/inc/MarlinConfigPre.h'] cmd += ['-w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-features-dependencies.h'] - cmd = [env.get('CXX')] + cmd cmd = ' '.join(cmd) print(cmd) define_list = subprocess.check_output(cmd, shell=True).splitlines() From 3aecd922984b140d2e7b4295025d2352c6744500 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 21 Jul 2020 00:19:36 +0000 Subject: [PATCH 188/483] [cron] Bump distribution date (2020-07-21) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ad9d310a53d7..b5ce78172269 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-20" + #define STRING_DISTRIBUTION_DATE "2020-07-21" #endif /** From e78f1237eac17cd53ecd2ed698f2310e65b36e22 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 20 Jul 2020 21:51:06 -0500 Subject: [PATCH 189/483] Matching mat.bed_temp condition --- Marlin/src/gcode/lcd/M145.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index a3e81788d2aa..f935170a9b56 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -45,7 +45,7 @@ void GcodeSuite::M145() { if (parser.seenval('H')) mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT)); #endif - #if TEMP_SENSOR_BED != 0 + #if HAS_HEATED_BED if (parser.seenval('B')) mat.bed_temp = constrain(parser.value_int(), BED_MINTEMP, BED_MAX_TARGET); #endif From 9ca070fa10f18e7c37133cfb37b0e756bb024ffa Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 21 Jul 2020 04:33:58 -0300 Subject: [PATCH 190/483] Ignore unused (but downloaded) libraries (#18728) --- .../scripts/common-features-dependencies.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py index 778004744f21..1612904638b1 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py @@ -36,6 +36,36 @@ def load_config(): else: FEATURE_DEPENDENCIES[key[0].upper()]['lib_deps'] += [dep] +def get_all_known_libs(): + known_libs = [] + for feature in FEATURE_DEPENDENCIES: + if not 'lib_deps' in FEATURE_DEPENDENCIES[feature]: + continue + for dep in FEATURE_DEPENDENCIES[feature]['lib_deps']: + name, _, _ = PackageManager.parse_pkg_uri(dep) + known_libs.append(name) + return known_libs + +def get_all_env_libs(): + env_libs = [] + lib_deps = env.GetProjectOption("lib_deps") + for dep in lib_deps: + name, _, _ = PackageManager.parse_pkg_uri(dep) + env_libs.append(name) + return env_libs + +# We need to ignore all non-used libs, +# so if a lib folder lay forgotten in .pio/lib_deps, it +# will not break compiling +def force_ignore_unused_libs(): + env_libs = get_all_env_libs() + known_libs = get_all_known_libs() + diff = (list(set(known_libs) - set(env_libs))) + lib_ignore = env.GetProjectOption("lib_ignore") + diff + print("Ignoring libs: ", lib_ignore) + proj = env.GetProjectConfig() + proj.set("env:" + env["PIOENV"], "lib_ignore", lib_ignore) + def install_features_dependencies(): load_config() for feature in FEATURE_DEPENDENCIES: @@ -158,3 +188,4 @@ def MarlinFeatureIsEnabled(env, feature): # install all dependencies for features enabled in Configuration.h install_features_dependencies() +force_ignore_unused_libs() From f1ffca1d2d37982747a09050131825b4feaaff48 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 21 Jul 2020 11:07:56 +0300 Subject: [PATCH 191/483] Use development version of PlatformIO (#18724) --- .github/workflows/test-builds.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index e47cfa83950f..4dd483499b6a 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -105,7 +105,7 @@ jobs: - name: Install PlatformIO run: | - pip install -U https://github.com/platformio/platformio-core/archive/master.zip + pip install -U https://github.com/platformio/platformio-core/archive/develop.zip platformio update - name: Check out the PR From 2a72f491e4fcea46a00fc8ee095c96c198c142c5 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 21 Jul 2020 05:09:33 -0300 Subject: [PATCH 192/483] Fix build for Windows path edge case --- .../scripts/common-features-dependencies.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py index 1612904638b1..a04f2e0eea63 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py @@ -127,19 +127,13 @@ def install_features_dependencies(): def search_compiler(): if env['PLATFORM'] == 'win32': # the first path have the compiler - compiler_path = None for path in env['ENV']['PATH'].split(';'): - if re.search(r'platformio\\packages.*\\bin', path): - compiler_path = path - break - if compiler_path == None: - print("Could not find the g++ path") - return None - - print(compiler_path) - for file in os.listdir(compiler_path): - if file.endswith("g++.exe"): - return file + if not re.search(r'platformio\\packages.*\\bin', path): + continue + #print(path) + for file in os.listdir(path): + if file.endswith("g++.exe"): + return file print("Could not find the g++") return None else: From f34024af3457d1d5e2f6b4d7fe83f5b00f8fb597 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 21 Jul 2020 05:15:20 -0300 Subject: [PATCH 193/483] Filter some unused Marlin/src subfolders (#18729) --- .../scripts/common-features-dependencies.py | 21 ++++++++----------- platformio.ini | 6 ++++++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py index a04f2e0eea63..72abfdd67b56 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py @@ -96,12 +96,10 @@ def install_features_dependencies(): del deps_to_add[name] # any left? - if len(deps_to_add) <= 0: - continue - - # add only the missing deps - proj = env.GetProjectConfig() - proj.set("env:" + env["PIOENV"], "lib_deps", deps + list(deps_to_add.values())) + if len(deps_to_add) > 0: + # add only the missing deps + proj = env.GetProjectConfig() + proj.set("env:" + env["PIOENV"], "lib_deps", deps + list(deps_to_add.values())) if 'extra_scripts' in FEATURE_DEPENDENCIES[feature]: print("Executing extra_scripts for %s... " % feature) @@ -110,17 +108,16 @@ def install_features_dependencies(): if 'src_filter' in FEATURE_DEPENDENCIES[feature]: print("Adding src_filter for %s... " % feature) proj = env.GetProjectConfig() - src_filter = env.GetProjectOption("src_filter") - + src_filter = ' '.join(env.GetProjectOption("src_filter")) # first we need to remove the references to the same folder my_srcs = re.findall( r'[+-](<.*?>)', FEATURE_DEPENDENCIES[feature]['src_filter']) - cur_srcs = re.findall( r'[+-](<.*?>)', src_filter[0]) + cur_srcs = re.findall( r'[+-](<.*?>)', src_filter) for d in my_srcs: if d in cur_srcs: - src_filter[0] = re.sub(r'[+-]' + d, '', src_filter[0]) + src_filter = re.sub(r'[+-]' + d, '', src_filter) - src_filter[0] = FEATURE_DEPENDENCIES[feature]['src_filter'] + ' ' + src_filter[0] - proj.set("env:" + env["PIOENV"], "src_filter", src_filter) + src_filter = FEATURE_DEPENDENCIES[feature]['src_filter'] + ' ' + src_filter + proj.set("env:" + env["PIOENV"], "src_filter", [src_filter]) env.Replace(SRC_FILTER=src_filter) # search the current compiler, considering the OS diff --git a/platformio.ini b/platformio.ini index 0bc559b09b68..865755d73fe1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,6 +26,7 @@ include_dir = Marlin # [common] default_src_filter = + - - + - + - - - - - extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-features-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -48,7 +49,12 @@ HAS_L64XX = Arduino-L6470@0.8.0 NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 HAS_GRAPHICAL_LCD = U8glib-HAL@0.4.1 + src_filter=+ HAS_CHARACTER_LCD = LiquidCrystal@1.5.0, LiquidTWI2@1.2.7 +TOUCH_UI_FTDI_EVE = src_filter=+ +HAS_DGUS_LCD = src_filter=+ +DWIN_CREALITY_LCD = src_filter=+ +HAS_LCD_MENU = src_filter=+ # # Default values apply to all 'env:' prefixed environments From 469f63f74d4ee65db5288e4b69e1dd784eac0bf3 Mon Sep 17 00:00:00 2001 From: yufanyufan Date: Tue, 21 Jul 2020 01:19:25 -0700 Subject: [PATCH 194/483] New DGUS UI var / definition syntax (#18718) --- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 4 ++++ Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 17 +++++++++++++++++ .../extui/lib/dgus/origin/DGUSDisplayDef.cpp | 7 +++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index fec06290b47f..c79d7e027ef0 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -107,6 +107,10 @@ void DGUSDisplay::WriteVariable(uint16_t adr, uint8_t value) { WriteVariable(adr, static_cast(&value), sizeof(uint8_t)); } +void DGUSDisplay::WriteVariable(uint16_t adr, int8_t value) { + WriteVariable(adr, static_cast(&value), sizeof(int8_t)); +} + void DGUSDisplay::WriteVariable(uint16_t adr, long value) { union { long l; char lb[4]; } endian; char tmp[4]; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index 54d68eacd24e..7f635798886e 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -57,8 +57,21 @@ class DGUSDisplay { static void WriteVariable(uint16_t adr, int16_t value); static void WriteVariable(uint16_t adr, uint16_t value); static void WriteVariable(uint16_t adr, uint8_t value); + static void WriteVariable(uint16_t adr, int8_t value); static void WriteVariable(uint16_t adr, long value); + // Utility functions for bridging ui_api and dbus + template + static void SetVariable(DGUS_VP_Variable &var) { + WriteVariable(var.VP, (WireType)Getter(selector)); + } + + template + static void GetVariable(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t newvalue = swap16(*(uint16_t*)val_ptr); + Setter(newvalue, selector); + } + // Until now I did not need to actively read from the display. That's why there is no ReadVariable // (I extensively use the auto upload of the display) @@ -83,11 +96,15 @@ class DGUSDisplay { static void WritePGM(const char str[], uint8_t len); static void ProcessRx(); + static inline uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); } static rx_datagram_state_t rx_datagram_state; static uint8_t rx_datagram_len; static bool Initialized, no_reentrance; }; +#define GET_VARIABLE(f, t, V...) (&DGUSDisplay::GetVariable) +#define SET_VARIABLE(f, t, V...) (&DGUSDisplay::SetVariable) + extern DGUSDisplay dgusdisplay; // compile-time x^y diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index 73ee1a62d331..616ff04d7cb5 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -35,10 +35,12 @@ #include "../../../../../module/planner.h" #include "../../../../ultralcd.h" +#include "../../../ui_api.h" #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) uint16_t distanceToMove = 10; #endif +using namespace ExtUI; const uint16_t VPList_Boot[] PROGMEM = { VP_MARLIN_VERSION, @@ -190,8 +192,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_T_E0_Is, nullptr, nullptr, SET_VARIABLE(getActualTemp_celsius, E0, long)), + VPHELPER(VP_T_E0_Set, nullptr, GET_VARIABLE(setTargetTemp_celsius, E0), + SET_VARIABLE(getTargetTemp_celsius, E0)), VPHELPER(VP_Flowrate_E0, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), From 6027055695f6fa49b857bec0552bf362e0b2bb56 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 21 Jul 2020 04:00:39 -0500 Subject: [PATCH 195/483] Optimize LCD, Wifi, etc. libraries (#18730) --- Marlin/src/gcode/host/M360.cpp | 3 +- Marlin/src/inc/Conditionals_LCD.h | 8 ++++ Marlin/src/lcd/HD44780/ultralcd_HD44780.h | 31 +++++------- Marlin/src/pins/pins.h | 1 - .../scripts/common-features-dependencies.py | 21 ++++---- buildroot/tests/esp32-tests | 3 +- platformio.ini | 48 +++++-------------- 7 files changed, 47 insertions(+), 68 deletions(-) diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 63a0b6dfc44f..146abe24d4a7 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -115,8 +115,7 @@ void GcodeSuite::M360() { xyz_pos_t cmin = dmin, cmax = dmax; apply_motion_limits(cmin); apply_motion_limits(cmax); - const xyz_pos_t lmin = dmin.asLogical(), lmax = dmax.asLogical(), - wmin = cmin.asLogical(), wmax = cmax.asLogical(); + const xyz_pos_t wmin = cmin.asLogical(), wmax = cmax.asLogical(); PGMSTR(MIN_STR, "Min"); PGMSTR(MAX_STR, "Max"); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 10755c180ea0..972d1042ee42 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -399,6 +399,14 @@ #endif #endif +#if ENABLED(SR_LCD_3W_NL) + // Feature checks for SR_LCD_3W_NL +#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) + #define USES_LIQUIDTWI2 +#elif ANY(HAS_CHARACTER_LCD, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) + #define USES_LIQUIDCRYSTAL +#endif + #if ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS) #define HAS_LCD_MENU 1 #endif diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.h b/Marlin/src/lcd/HD44780/ultralcd_HD44780.h index 12bf86a1618c..4fce2daa07f6 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.h +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.h @@ -22,26 +22,13 @@ #pragma once /** - * Implementation of the LCD display routines for a Hitachi HD44780 display. - * These are the most common LCD character displays. + * Hitachi HD44780 display defines and headers */ #include "../../inc/MarlinConfig.h" -#if LCD_HEIGHT > 3 - #include "../../libs/duration_t.h" -#endif - -//////////////////////////////////// -// Setup button and encode mappings for each panel (into 'buttons' variable -// -// This is just to map common functions (across different panels) onto the same -// macro name. The mapping is independent of whether the button is directly connected or -// via a shift/i2c register. - -//////////////////////////////////// -// Create LCD class instance and chipset-specific information #if ENABLED(LCD_I2C_TYPE_PCF8575) + // NOTE: These are register-mapped pins on the PCF8575 controller, not Arduino pins. #define LCD_I2C_PIN_BL 3 #define LCD_I2C_PIN_EN 2 @@ -58,6 +45,7 @@ #define LCD_CLASS LiquidCrystal_I2C #elif ENABLED(LCD_I2C_TYPE_MCP23017) + // For the LED indicators (which may be mapped to different events in update_indicators()) #define LCD_HAS_STATUS_INDICATORS #define LED_A 0x04 //100 @@ -69,40 +57,45 @@ #define LCD_CLASS LiquidTWI2 #elif ENABLED(LCD_I2C_TYPE_MCP23008) + #include #include #define LCD_CLASS LiquidTWI2 #elif ENABLED(LCD_I2C_TYPE_PCA8574) + #include #define LCD_CLASS LiquidCrystal_I2C #elif ENABLED(SR_LCD_2W_NL) + // 2 wire Non-latching LCD SR from: // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection -// extern "C" void __cxa_pure_virtual() { while (1); } #include #include #define LCD_CLASS LiquidCrystal_SR + #elif ENABLED(SR_LCD_3W_NL) -//NewLiquidCrystal was not working for me, but this worked first try -//https://github.com/mikeshub/SailfishLCD -//uses the code directly from Sailfish + // NewLiquidCrystal didn't work, so this uses + // https://github.com/mikeshub/SailfishLCD #include #define LCD_CLASS LiquidCrystalSerial #elif ENABLED(LCM1602) + #include #include #include #define LCD_CLASS LiquidCrystal_I2C #else + // Standard directly connected LCD implementations #include #define LCD_CLASS LiquidCrystal + #endif #include "../fontutils.h" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 61db5a77f527..e92001a25c9e 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -615,7 +615,6 @@ // #elif MB(ESPRESSIF_ESP32) - #include "esp32/pins_ESP32.h" // ESP32 env:esp32 #elif MB(MRR_ESPA) #include "esp32/pins_MRR_ESPA.h" // ESP32 env:esp32 diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py index 72abfdd67b56..179af2229421 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py @@ -20,21 +20,24 @@ def load_config(): config.read("platformio.ini") items = config.items('features') for key in items: - deps = re.sub(',\\s*', '\n', key[1]).strip().split('\n') - if not key[0].upper() in FEATURE_DEPENDENCIES: - FEATURE_DEPENDENCIES[key[0].upper()] = { + ukey = key[0].upper() + if not ukey in FEATURE_DEPENDENCIES: + FEATURE_DEPENDENCIES[ukey] = { 'lib_deps': [] } + deps = re.sub(',\\s*', '\n', key[1]).strip().split('\n') for dep in deps: parts = dep.split('=') name = parts.pop(0) rest = '='.join(parts) if name == 'extra_scripts': - FEATURE_DEPENDENCIES[key[0].upper()]['extra_scripts'] = rest + FEATURE_DEPENDENCIES[ukey]['extra_scripts'] = rest elif name == 'src_filter': - FEATURE_DEPENDENCIES[key[0].upper()]['src_filter'] = rest + FEATURE_DEPENDENCIES[ukey]['src_filter'] = rest + elif name == 'lib_ignore': + FEATURE_DEPENDENCIES[ukey]['lib_ignore'] = rest else: - FEATURE_DEPENDENCIES[key[0].upper()]['lib_deps'] += [dep] + FEATURE_DEPENDENCIES[ukey]['lib_deps'] += [dep] def get_all_known_libs(): known_libs = [] @@ -126,7 +129,7 @@ def search_compiler(): # the first path have the compiler for path in env['ENV']['PATH'].split(';'): if not re.search(r'platformio\\packages.*\\bin', path): - continue + continue #print(path) for file in os.listdir(path): if file.endswith("g++.exe"): @@ -172,7 +175,9 @@ def load_marlin_features(): def MarlinFeatureIsEnabled(env, feature): load_marlin_features() - return feature in env["MARLIN_FEATURES"] + r = re.compile(feature) + matches = list(filter(r.match, env["MARLIN_FEATURES"])) + return len(matches) > 0 # add a method for others scripts to check if a feature is enabled env.AddMethod(MarlinFeatureIsEnabled) diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32-tests index ccc01a1c1c8a..992b3ec5ff44 100755 --- a/buildroot/tests/esp32-tests +++ b/buildroot/tests/esp32-tests @@ -11,11 +11,10 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 -opt_enable WIFISUPPORT GCODE_MACROS BAUD_RATE_GCODE M115_GEOMETRY_REPORT REPETIER_GCODE_M360 +opt_enable WIFISUPPORT WEBSUPPORT GCODE_MACROS BAUD_RATE_GCODE M115_GEOMETRY_REPORT REPETIER_GCODE_M360 opt_add WIFI_SSID "\"ssid\"" opt_add WIFI_PWD "\"password\"" opt_set TX_BUFFER_SIZE 64 -opt_add WEBSUPPORT exec_test $1 $2 "ESP32 with WIFISUPPORT and WEBSUPPORT" # diff --git a/platformio.ini b/platformio.ini index 865755d73fe1..c59f2790733a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -40,21 +40,25 @@ lib_deps = TFT_LVGL_UI = MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip src_filter=+ HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 -SR_LCD_2W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -DIGIPOT_MCP4018 = SlowSoftI2CMaster -DIGIPOT_MCP4451 = SlowSoftI2CMaster +DIGIPOT_MCP4... = SlowSoftI2CMaster HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip HAS_L64XX = Arduino-L6470@0.8.0 NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 HAS_GRAPHICAL_LCD = U8glib-HAL@0.4.1 src_filter=+ -HAS_CHARACTER_LCD = LiquidCrystal@1.5.0, LiquidTWI2@1.2.7 +USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 +USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 TOUCH_UI_FTDI_EVE = src_filter=+ HAS_DGUS_LCD = src_filter=+ DWIN_CREALITY_LCD = src_filter=+ HAS_LCD_MENU = src_filter=+ +(ESP32_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer + ESP3DLib=https://github.com/luc-github/ESP3DLib.git + arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git + ESP32SSDP=https://github.com/luc-github/ESP32SSDP.git + lib_ignore=ESPAsyncTCP # # Default values apply to all 'env:' prefixed environments @@ -306,14 +310,11 @@ lib_compat_mode = strict extra_scripts = ${common.extra_scripts} Marlin/src/HAL/LPC1768/upload_extra_script.py src_filter = ${common.default_src_filter} + -lib_deps = Servo +lib_deps = ${common.lib_deps} + Servo LiquidCrystal@1.0.0 - U8glib-HAL@0.4.1 - TMCStepper@~0.7.1 Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip - SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g -lib_ignore = LiquidTWI2 # debug options for backtrace #-funwind-tables #-mpoke-function-name @@ -361,8 +362,7 @@ build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DHAVE_SW_SERIAL build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + -lib_ignore = - SPI +lib_ignore = SPI lib_deps = ${common.lib_deps} SoftwareSerialM @@ -395,18 +395,10 @@ build_flags = ${common_stm32f1.build_flags} extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py -lib_deps = - TMCStepper@~0.7.1 - Adafruit MAX31865 library@~1.1.0 - U8glib-HAL@0.4.1 - Arduino-L6470@0.8.0 - SlowSoftI2CMaster - LiquidTWI2@1.2.7 +lib_deps = ${common.lib_deps} Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use - SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip SoftwareSerialM USBComposite for STM32F1@0.91 -lib_ignore = SPI debug_tool = stlink upload_protocol = dfu @@ -498,7 +490,6 @@ lib_deps = ${common_stm32f1.lib_deps} platform = ${common_stm32.platform} board = disco_f407vg build_flags = ${common.build_flags} -DUSE_STM32GENERIC -DSTM32GENERIC -DSTM32F4 -DMENU_USB_SERIAL -DMENU_SERIAL=SerialUSB -DHAL_IWDG_MODULE_ENABLED -lib_ignore = Adafruit NeoPixel, TMCStepper src_filter = ${common.default_src_filter} + - # @@ -508,7 +499,6 @@ src_filter = ${common.default_src_filter} + - - # @@ -550,7 +540,6 @@ build_flags = ${common_stm32f1.build_flags} build_unflags = ${common_stm32f1.build_unflags} -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 lib_ignore = ${common_stm32f1.lib_ignore} - LiquidTWI2 # # MKS Robin Mini (STM32F103VET6) @@ -911,13 +900,6 @@ monitor_speed = 500000 platform = espressif32@1.11.2 board = esp32dev build_flags = ${common.build_flags} -DCORE_DEBUG_LEVEL=0 -lib_deps = ${common.lib_deps} - AsyncTCP=https://github.com/me-no-dev/AsyncTCP/archive/master.zip - ESPAsyncWebServer=https://github.com/me-no-dev/ESPAsyncWebServer/archive/master.zip - ESP3DLib=https://github.com/luc-github/ESP3DLib.git - arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git - ESP32SSDP=https://github.com/luc-github/ESP32SSDP.git -lib_ignore = LiquidCrystal, LiquidTWI2, SailfishLCD, ESPAsyncTCP src_filter = ${common.default_src_filter} + upload_speed = 115200 #upload_port = marlinesp.local @@ -929,8 +911,6 @@ upload_speed = 115200 [env:teensy31] platform = teensy board = teensy31 -lib_deps = ${common.lib_deps} - TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip src_filter = ${common.default_src_filter} + # @@ -939,8 +919,6 @@ src_filter = ${common.default_src_filter} + [env:teensy35] platform = teensy board = teensy35 -lib_deps = ${common.lib_deps} - TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip src_filter = ${common.default_src_filter} + # @@ -964,6 +942,4 @@ src_filter = ${common.default_src_filter} + platform = atmelavr board = megaatmega2560 build_flags = -c -H -std=gnu++11 -Wall -Os -D__MARLIN_FIRMWARE__ -lib_deps = ${common.lib_deps} - TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip src_filter = + From 2119e19bff477be2bcefcf9b7f50ff60fdccee32 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 21 Jul 2020 05:41:10 -0500 Subject: [PATCH 196/483] Fix inline AnycubicSerial method --- Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h index e7494d38adaf..a568a50c9887 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h @@ -131,10 +131,10 @@ const char newSucc[] PROGMEM = "OK"; #define ANYCUBIC_SERIAL_ECHO(x) ANYCUBIC_SERIAL_PROTOCOL(x) FORCE_INLINE void AnycubicSerialprintPGM(const char *str) { - char ch=pgm_read_byte(str); + char ch = pgm_read_byte(str); while (ch) { - AnycubicSerial.write(ch); - ch=pgm_read_byte(++str); + AnycubicSerialClass::write(ch); + ch = pgm_read_byte(++str); } } From 1e5d73579cd0781e8ea50aeb8bc11ec53ce23171 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 21 Jul 2020 14:43:43 -0500 Subject: [PATCH 197/483] Anycubic followup --- .../extui/lib/anycubic/anycubic_serial.cpp | 16 ++++------ .../lcd/extui/lib/anycubic/anycubic_serial.h | 32 ++++++++++--------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp index 3fad103bb415..fd5f2691bdfb 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp @@ -29,10 +29,10 @@ #if ENABLED(ANYCUBIC_TFT_MODEL) -#include "Arduino.h" +#include -// this next line disables the entire HardwareSerial.cpp, -// so I can support AtTiny series and other chips without a UART +// This next line disables the entire anycubic_serial.cpp, +// to support AtTiny series and other chips without a UART #ifdef UBRR3H #include "anycubic_serial.h" @@ -59,10 +59,8 @@ struct ring_buffer { volatile unsigned int tail; }; -#ifdef UBRR3H - ring_buffer rx_buffer_ajg = { { 0 }, 0, 0 }; - ring_buffer tx_buffer_ajg = { { 0 }, 0, 0 }; -#endif +ring_buffer rx_buffer_ajg = { { 0 }, 0, 0 }; +ring_buffer tx_buffer_ajg = { { 0 }, 0, 0 }; inline void store_char(unsigned char c, ring_buffer *buffer) { int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; @@ -286,9 +284,7 @@ AnycubicSerialClass::operator bool() { // Preinstantiate Objects ////////////////////////////////////////////////////// -#ifdef UBRR3H - AnycubicSerialClass AnycubicSerial(&rx_buffer_ajg, &tx_buffer_ajg, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); -#endif +AnycubicSerialClass AnycubicSerial(&rx_buffer_ajg, &tx_buffer_ajg, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); #endif // UBRR3H #endif // ANYCUBIC_TFT_MODEL diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h index a568a50c9887..ed4c19b63e88 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h @@ -103,15 +103,15 @@ class AnycubicSerialClass : public Stream { extern void serialEventRun(void) __attribute__((weak)); #define ANYCUBIC_SERIAL_PROTOCOL(x) (AnycubicSerial.print(x)) -#define ANYCUBIC_SERIAL_PROTOCOL_F(x,y) (AnycubicSerial.print(x,y)) +#define ANYCUBIC_SERIAL_PROTOCOL_F(x,y) (AnycubicSerial.print(x, y)) #define ANYCUBIC_SERIAL_PROTOCOLPGM(x) (AnycubicSerialprintPGM(PSTR(x))) -#define ANYCUBIC_SERIAL_(x) (AnycubicSerial.print(x),AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_PROTOCOLLN(x) (AnycubicSerial.print(x),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) (AnycubicSerialprintPGM(PSTR(x)),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_(x) (AnycubicSerial.print(x), AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_PROTOCOLLN(x) (AnycubicSerial.print(x), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) (AnycubicSerialprintPGM(PSTR(x)), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_START() (AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_CMD_SEND(x) (AnycubicSerialprintPGM(PSTR(x)),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_ENTER() (AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_START() (AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_CMD_SEND(x) (AnycubicSerialprintPGM(PSTR(x)), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_ENTER() (AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) #define ANYCUBIC_SERIAL_SPACE() (AnycubicSerial.write(' ')) const char newErr[] PROGMEM = "ERR "; @@ -130,14 +130,16 @@ const char newSucc[] PROGMEM = "OK"; #define ANYCUBIC_SERIAL_ECHOPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) #define ANYCUBIC_SERIAL_ECHO(x) ANYCUBIC_SERIAL_PROTOCOL(x) -FORCE_INLINE void AnycubicSerialprintPGM(const char *str) { - char ch = pgm_read_byte(str); - while (ch) { - AnycubicSerialClass::write(ch); - ch = pgm_read_byte(++str); - } -} - #ifdef UBRR3H + extern AnycubicSerialClass AnycubicSerial; + + FORCE_INLINE void AnycubicSerialprintPGM(const char *str) { + char ch = pgm_read_byte(str); + while (ch) { + AnycubicSerial.write(ch); + ch = pgm_read_byte(++str); + } + } + #endif From 2af216cf828ee2276769b565896cc7a374e8210f Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 22 Jul 2020 00:08:57 +0000 Subject: [PATCH 198/483] [cron] Bump distribution date (2020-07-22) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index b5ce78172269..48f7b5a3aafe 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-21" + #define STRING_DISTRIBUTION_DATE "2020-07-22" #endif /** From a9e6af856622687431c050e3efdb34758be8fc4e Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 21 Jul 2020 18:55:27 -0700 Subject: [PATCH 199/483] Fix Spanish preheat strings (#18743) --- Marlin/src/lcd/language/language_es.h | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 0af31f9a3c61..fbd6981f3ec8 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -70,21 +70,21 @@ namespace Language_es { PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicada"); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Establecer origen"); #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precal. $"); - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Precal. $ ~"); - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. $ Fusor"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Precal. $ Fusor ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precal. $ Todo"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precal. $ Cama"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precal. $ Ajuste"); + PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precal. ") PREHEAT_1_LABEL; + PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Precal. ") PREHEAT_1_LABEL " ~"; + PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor"); + PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor ~"); + PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Todo"); + PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Cama"); + PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Ajuste"); - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Precal. ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Precal. ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Todo"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Cama"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Ajuste"); + PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Precal. $"); + PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Precal. $ ~"); + PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Precal. $ Fusor"); + PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Precal. $ Fusor ~"); + PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Precal. $ Todo"); + PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Precal. $ Cama"); + PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Precal. $ Ajuste"); #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Precal. manual"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Enfriar"); From 748c8a7ecd7aa90b7dddbebcd7e2ecb856ee91e4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 21 Jul 2020 23:37:15 -0500 Subject: [PATCH 200/483] Explicit SdFat --- platformio.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index c59f2790733a..cfbd5e5a1923 100644 --- a/platformio.ini +++ b/platformio.ini @@ -290,7 +290,8 @@ build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} SoftwareSerialM - Adafruit_SPIFlash=https://github.com/adafruit/Adafruit_SPIFlash/archive/master.zip + Adafruit SPIFlash + SdFat - Adafruit Fork debug_tool = jlink ################################# From b4b19aef7f61c6dffa5ae51d76b5508296ac703b Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Wed, 22 Jul 2020 02:42:44 -0400 Subject: [PATCH 201/483] Custom Nozzle Wipe (#18736) --- Marlin/Configuration.h | 4 ++++ Marlin/src/gcode/feature/clean/G12.cpp | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index af98be4d1bad..fccdf9ced3aa 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1595,6 +1595,10 @@ // Enable for a purge/clean station that's always at the gantry height (thus no Z move) //#define NOZZLE_CLEAN_NO_Z + + // Explicit wipe G-code script applies to a G12 with no arguments. + //#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0" + #endif /** diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp index bdfaf38a06cf..6337665d4cf2 100644 --- a/Marlin/src/gcode/feature/clean/G12.cpp +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -47,6 +47,13 @@ void GcodeSuite::G12() { // Don't allow nozzle cleaning without homing first if (axis_unhomed_error()) return; + #ifdef WIPE_SEQUENCE_COMMANDS + if (!parser.seen_any()) { + gcode.process_subcommands_now_P(PSTR(WIPE_SEQUENCE_COMMANDS)); + return; + } + #endif + const uint8_t pattern = parser.ushortval('P', 0), strokes = parser.ushortval('S', NOZZLE_CLEAN_STROKES), objects = parser.ushortval('T', NOZZLE_CLEAN_TRIANGLES); From 0b46fcdce6362197b92fca0a472da65606938f19 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 23 Jul 2020 00:09:18 +0000 Subject: [PATCH 202/483] [cron] Bump distribution date (2020-07-23) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 48f7b5a3aafe..8d96b0b00483 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-22" + #define STRING_DISTRIBUTION_DATE "2020-07-23" #endif /** From f9b1da7beb6f66959b6c6171809132ab591bd817 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 22 Jul 2020 20:17:33 -0700 Subject: [PATCH 203/483] Linear Advance: Only change E DIR when needed (#18744) --- Marlin/src/module/stepper.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 2a9e4dae2119..b240c5519d71 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2277,14 +2277,14 @@ uint32_t Stepper::block_phase_isr() { #if ENABLED(MIXING_EXTRUDER) // We don't know which steppers will be stepped because LA loop follows, // with potentially multiple steps. Set all. - if (LA_steps >= 0) + if (LA_steps > 0) MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); - else + else if (LA_steps < 0) MIXER_STEPPER_LOOP(j) REV_E_DIR(j); #else - if (LA_steps >= 0) + if (LA_steps > 0) NORM_E_DIR(stepper_extruder); - else + else if (LA_steps < 0) REV_E_DIR(stepper_extruder); #endif From 42fbd527f3bcc317ae6851aca5a45bdbf979de55 Mon Sep 17 00:00:00 2001 From: Diego von Deschwanden <68632259+Diegovd@users.noreply.github.com> Date: Thu, 23 Jul 2020 05:20:14 +0200 Subject: [PATCH 204/483] Fix links to secure sites (#18745) --- .gitignore | 2 +- LICENSE | 8 ++--- Marlin/Configuration.h | 36 +++++++++---------- Marlin/Configuration_adv.h | 14 ++++---- Marlin/Makefile | 2 +- Marlin/Version.h | 4 +-- Marlin/lib/readme.txt | 2 +- Marlin/src/HAL/AVR/HAL.cpp | 2 +- Marlin/src/HAL/AVR/HAL.h | 2 +- Marlin/src/HAL/AVR/HAL_SPI.cpp | 2 +- Marlin/src/HAL/AVR/MarlinSerial.cpp | 2 +- Marlin/src/HAL/AVR/MarlinSerial.h | 2 +- Marlin/src/HAL/AVR/Servo.cpp | 2 +- Marlin/src/HAL/AVR/ServoTimers.h | 2 +- Marlin/src/HAL/AVR/eeprom.cpp | 2 +- Marlin/src/HAL/AVR/endstop_interrupts.h | 2 +- Marlin/src/HAL/AVR/fast_pwm.cpp | 2 +- Marlin/src/HAL/AVR/fastio.cpp | 2 +- Marlin/src/HAL/AVR/fastio.h | 2 +- Marlin/src/HAL/AVR/fastio/fastio_1280.h | 2 +- Marlin/src/HAL/AVR/fastio/fastio_1281.h | 2 +- Marlin/src/HAL/AVR/fastio/fastio_168.h | 2 +- Marlin/src/HAL/AVR/fastio/fastio_644.h | 2 +- Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h | 2 +- Marlin/src/HAL/AVR/inc/Conditionals_LCD.h | 2 +- Marlin/src/HAL/AVR/inc/Conditionals_adv.h | 2 +- Marlin/src/HAL/AVR/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/AVR/inc/SanityCheck.h | 2 +- Marlin/src/HAL/AVR/math.h | 2 +- Marlin/src/HAL/AVR/pinsDebug.h | 2 +- Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h | 2 +- Marlin/src/HAL/AVR/pinsDebug_plus_70.h | 2 +- Marlin/src/HAL/AVR/spi_pins.h | 2 +- Marlin/src/HAL/AVR/timers.h | 2 +- Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp | 2 +- Marlin/src/HAL/AVR/watchdog.cpp | 2 +- Marlin/src/HAL/AVR/watchdog.h | 2 +- Marlin/src/HAL/DUE/DebugMonitor.cpp | 2 +- Marlin/src/HAL/DUE/HAL.cpp | 2 +- Marlin/src/HAL/DUE/HAL.h | 2 +- Marlin/src/HAL/DUE/HAL_SPI.cpp | 2 +- Marlin/src/HAL/DUE/InterruptVectors.cpp | 2 +- Marlin/src/HAL/DUE/InterruptVectors.h | 2 +- Marlin/src/HAL/DUE/MarlinSerial.cpp | 2 +- Marlin/src/HAL/DUE/MarlinSerial.h | 2 +- Marlin/src/HAL/DUE/MarlinSerialUSB.cpp | 2 +- Marlin/src/HAL/DUE/MarlinSerialUSB.h | 2 +- Marlin/src/HAL/DUE/Servo.cpp | 2 +- Marlin/src/HAL/DUE/Tone.cpp | 2 +- .../dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp | 2 +- .../dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp | 2 +- .../HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp | 2 +- .../dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp | 2 +- .../DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h | 2 +- Marlin/src/HAL/DUE/eeprom_flash.cpp | 2 +- Marlin/src/HAL/DUE/eeprom_wired.cpp | 2 +- Marlin/src/HAL/DUE/endstop_interrupts.h | 2 +- Marlin/src/HAL/DUE/fastio.h | 2 +- Marlin/src/HAL/DUE/fastio/G2_PWM.cpp | 2 +- Marlin/src/HAL/DUE/fastio/G2_PWM.h | 2 +- Marlin/src/HAL/DUE/fastio/G2_pins.h | 2 +- Marlin/src/HAL/DUE/inc/Conditionals_LCD.h | 2 +- Marlin/src/HAL/DUE/inc/Conditionals_adv.h | 2 +- Marlin/src/HAL/DUE/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/DUE/inc/SanityCheck.h | 2 +- Marlin/src/HAL/DUE/pinsDebug.h | 2 +- Marlin/src/HAL/DUE/spi_pins.h | 2 +- Marlin/src/HAL/DUE/timers.cpp | 2 +- Marlin/src/HAL/DUE/timers.h | 2 +- Marlin/src/HAL/DUE/watchdog.cpp | 2 +- Marlin/src/HAL/DUE/watchdog.h | 2 +- .../src/HAL/ESP32/FlushableHardwareSerial.cpp | 2 +- .../src/HAL/ESP32/FlushableHardwareSerial.h | 2 +- Marlin/src/HAL/ESP32/HAL.cpp | 2 +- Marlin/src/HAL/ESP32/HAL.h | 2 +- Marlin/src/HAL/ESP32/HAL_SPI.cpp | 2 +- Marlin/src/HAL/ESP32/Servo.cpp | 2 +- Marlin/src/HAL/ESP32/Servo.h | 2 +- Marlin/src/HAL/ESP32/WebSocketSerial.cpp | 2 +- Marlin/src/HAL/ESP32/WebSocketSerial.h | 2 +- Marlin/src/HAL/ESP32/eeprom.cpp | 2 +- Marlin/src/HAL/ESP32/endstop_interrupts.h | 2 +- Marlin/src/HAL/ESP32/fastio.h | 2 +- Marlin/src/HAL/ESP32/i2s.cpp | 2 +- Marlin/src/HAL/ESP32/i2s.h | 2 +- Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h | 2 +- Marlin/src/HAL/ESP32/inc/Conditionals_adv.h | 2 +- Marlin/src/HAL/ESP32/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/ESP32/inc/SanityCheck.h | 2 +- Marlin/src/HAL/ESP32/ota.cpp | 2 +- Marlin/src/HAL/ESP32/ota.h | 2 +- Marlin/src/HAL/ESP32/servotimers.h | 2 +- Marlin/src/HAL/ESP32/spi_pins.h | 2 +- Marlin/src/HAL/ESP32/spiffs.cpp | 2 +- Marlin/src/HAL/ESP32/spiffs.h | 2 +- Marlin/src/HAL/ESP32/timers.cpp | 2 +- Marlin/src/HAL/ESP32/timers.h | 2 +- Marlin/src/HAL/ESP32/watchdog.cpp | 2 +- Marlin/src/HAL/ESP32/watchdog.h | 2 +- Marlin/src/HAL/ESP32/web.cpp | 2 +- Marlin/src/HAL/ESP32/web.h | 2 +- Marlin/src/HAL/ESP32/wifi.cpp | 2 +- Marlin/src/HAL/ESP32/wifi.h | 2 +- Marlin/src/HAL/HAL.h | 2 +- Marlin/src/HAL/LINUX/HAL.cpp | 2 +- Marlin/src/HAL/LINUX/HAL.h | 2 +- Marlin/src/HAL/LINUX/arduino.cpp | 2 +- Marlin/src/HAL/LINUX/eeprom.cpp | 2 +- Marlin/src/HAL/LINUX/fastio.h | 2 +- Marlin/src/HAL/LINUX/hardware/Clock.cpp | 2 +- Marlin/src/HAL/LINUX/hardware/Clock.h | 2 +- Marlin/src/HAL/LINUX/hardware/Gpio.cpp | 2 +- Marlin/src/HAL/LINUX/hardware/Gpio.h | 2 +- Marlin/src/HAL/LINUX/hardware/Heater.cpp | 2 +- Marlin/src/HAL/LINUX/hardware/Heater.h | 2 +- Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp | 2 +- Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h | 2 +- Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp | 2 +- Marlin/src/HAL/LINUX/hardware/LinearAxis.h | 2 +- Marlin/src/HAL/LINUX/hardware/Timer.cpp | 2 +- Marlin/src/HAL/LINUX/hardware/Timer.h | 2 +- Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h | 2 +- Marlin/src/HAL/LINUX/inc/Conditionals_adv.h | 2 +- Marlin/src/HAL/LINUX/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/LINUX/inc/SanityCheck.h | 2 +- Marlin/src/HAL/LINUX/include/Arduino.h | 2 +- Marlin/src/HAL/LINUX/include/pinmapping.cpp | 2 +- Marlin/src/HAL/LINUX/include/pinmapping.h | 2 +- Marlin/src/HAL/LINUX/include/serial.h | 2 +- Marlin/src/HAL/LINUX/main.cpp | 2 +- Marlin/src/HAL/LINUX/pinsDebug.h | 2 +- Marlin/src/HAL/LINUX/servo_private.h | 2 +- Marlin/src/HAL/LINUX/spi_pins.h | 2 +- Marlin/src/HAL/LINUX/timers.cpp | 2 +- Marlin/src/HAL/LINUX/timers.h | 2 +- Marlin/src/HAL/LINUX/watchdog.cpp | 2 +- Marlin/src/HAL/LINUX/watchdog.h | 2 +- Marlin/src/HAL/LPC1768/DebugMonitor.cpp | 2 +- Marlin/src/HAL/LPC1768/HAL.cpp | 2 +- Marlin/src/HAL/LPC1768/HAL.h | 2 +- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 2 +- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 2 +- Marlin/src/HAL/LPC1768/MarlinSerial.h | 2 +- Marlin/src/HAL/LPC1768/Servo.h | 2 +- Marlin/src/HAL/LPC1768/eeprom_flash.cpp | 2 +- Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/LPC1768/eeprom_wired.cpp | 2 +- Marlin/src/HAL/LPC1768/endstop_interrupts.h | 2 +- Marlin/src/HAL/LPC1768/fast_pwm.cpp | 2 +- Marlin/src/HAL/LPC1768/fastio.h | 2 +- Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h | 2 +- Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h | 2 +- .../src/HAL/LPC1768/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 2 +- Marlin/src/HAL/LPC1768/include/SPI.h | 2 +- .../include/digipot_mcp4451_I2C_routines.c | 2 +- .../include/digipot_mcp4451_I2C_routines.h | 2 +- Marlin/src/HAL/LPC1768/include/i2c_util.c | 2 +- Marlin/src/HAL/LPC1768/include/i2c_util.h | 2 +- Marlin/src/HAL/LPC1768/main.cpp | 2 +- Marlin/src/HAL/LPC1768/pinsDebug.h | 2 +- Marlin/src/HAL/LPC1768/spi_pins.h | 2 +- Marlin/src/HAL/LPC1768/timers.cpp | 2 +- Marlin/src/HAL/LPC1768/timers.h | 2 +- .../src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp | 2 +- Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h | 2 +- Marlin/src/HAL/LPC1768/u8g/LCD_defines.h | 2 +- Marlin/src/HAL/LPC1768/u8g/LCD_delay.h | 2 +- Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c | 2 +- Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h | 2 +- .../u8g/u8g_com_HAL_LPC1768_hw_spi.cpp | 2 +- .../u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp | 2 +- .../u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp | 2 +- .../u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp | 2 +- .../u8g/u8g_com_HAL_LPC1768_sw_spi.cpp | 2 +- Marlin/src/HAL/LPC1768/usb_serial.cpp | 2 +- Marlin/src/HAL/LPC1768/watchdog.cpp | 2 +- Marlin/src/HAL/LPC1768/watchdog.h | 2 +- Marlin/src/HAL/SAMD51/HAL.cpp | 2 +- Marlin/src/HAL/SAMD51/HAL.h | 2 +- Marlin/src/HAL/SAMD51/HAL_SPI.cpp | 2 +- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp | 2 +- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h | 2 +- Marlin/src/HAL/SAMD51/QSPIFlash.cpp | 2 +- Marlin/src/HAL/SAMD51/SAMD51.h | 2 +- Marlin/src/HAL/SAMD51/Servo.cpp | 2 +- Marlin/src/HAL/SAMD51/ServoTimers.h | 2 +- Marlin/src/HAL/SAMD51/eeprom_flash.cpp | 2 +- Marlin/src/HAL/SAMD51/eeprom_qspi.cpp | 2 +- Marlin/src/HAL/SAMD51/eeprom_wired.cpp | 2 +- Marlin/src/HAL/SAMD51/endstop_interrupts.h | 2 +- Marlin/src/HAL/SAMD51/fastio.h | 2 +- Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h | 2 +- Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h | 2 +- Marlin/src/HAL/SAMD51/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/SAMD51/inc/SanityCheck.h | 2 +- Marlin/src/HAL/SAMD51/pinsDebug.h | 2 +- Marlin/src/HAL/SAMD51/spi_pins.h | 2 +- Marlin/src/HAL/SAMD51/timers.cpp | 2 +- Marlin/src/HAL/SAMD51/timers.h | 2 +- Marlin/src/HAL/SAMD51/watchdog.cpp | 2 +- Marlin/src/HAL/SAMD51/watchdog.h | 2 +- Marlin/src/HAL/STM32/HAL.cpp | 2 +- Marlin/src/HAL/STM32/HAL.h | 2 +- Marlin/src/HAL/STM32/HAL_SPI.cpp | 2 +- Marlin/src/HAL/STM32/MarlinSerial.cpp | 2 +- Marlin/src/HAL/STM32/MarlinSerial.h | 2 +- .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 2 +- Marlin/src/HAL/STM32/Servo.cpp | 2 +- Marlin/src/HAL/STM32/Servo.h | 2 +- Marlin/src/HAL/STM32/SoftwareSerial.cpp | 6 ++-- Marlin/src/HAL/STM32/SoftwareSerial.h | 6 ++-- Marlin/src/HAL/STM32/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_sram.cpp | 2 +- Marlin/src/HAL/STM32/eeprom_wired.cpp | 2 +- Marlin/src/HAL/STM32/endstop_interrupts.h | 2 +- Marlin/src/HAL/STM32/fastio.cpp | 2 +- Marlin/src/HAL/STM32/fastio.h | 2 +- Marlin/src/HAL/STM32/inc/Conditionals_LCD.h | 2 +- Marlin/src/HAL/STM32/inc/Conditionals_adv.h | 2 +- Marlin/src/HAL/STM32/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/STM32/inc/SanityCheck.h | 2 +- Marlin/src/HAL/STM32/pinsDebug.h | 2 +- Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h | 2 +- Marlin/src/HAL/STM32/pinsDebug_STM32duino.h | 2 +- Marlin/src/HAL/STM32/pins_Xref.h | 2 +- Marlin/src/HAL/STM32/spi_pins.h | 2 +- Marlin/src/HAL/STM32/timers.cpp | 2 +- Marlin/src/HAL/STM32/timers.h | 2 +- Marlin/src/HAL/STM32/usb_serial.cpp | 2 +- Marlin/src/HAL/STM32/usb_serial.h | 2 +- Marlin/src/HAL/STM32/watchdog.cpp | 2 +- Marlin/src/HAL/STM32/watchdog.h | 2 +- Marlin/src/HAL/STM32F1/HAL.cpp | 2 +- Marlin/src/HAL/STM32F1/HAL.h | 2 +- Marlin/src/HAL/STM32F1/HAL_SPI.cpp | 2 +- Marlin/src/HAL/STM32F1/Servo.cpp | 2 +- Marlin/src/HAL/STM32F1/Servo.h | 2 +- Marlin/src/HAL/STM32F1/SoftwareSerial.cpp | 2 +- Marlin/src/HAL/STM32F1/SoftwareSerial.h | 2 +- .../STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp | 2 +- .../STM32F1/dogm/u8g_com_stm32duino_swspi.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 2 +- Marlin/src/HAL/STM32F1/endstop_interrupts.h | 2 +- Marlin/src/HAL/STM32F1/fastio.h | 2 +- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 2 +- Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h | 2 +- .../src/HAL/STM32F1/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 2 +- Marlin/src/HAL/STM32F1/msc_sd.cpp | 2 +- Marlin/src/HAL/STM32F1/msc_sd.h | 2 +- Marlin/src/HAL/STM32F1/pinsDebug.h | 2 +- Marlin/src/HAL/STM32F1/sdio.cpp | 2 +- Marlin/src/HAL/STM32F1/sdio.h | 2 +- Marlin/src/HAL/STM32F1/spi_pins.h | 2 +- Marlin/src/HAL/STM32F1/timers.cpp | 2 +- Marlin/src/HAL/STM32F1/timers.h | 2 +- Marlin/src/HAL/STM32F1/watchdog.cpp | 2 +- Marlin/src/HAL/STM32F1/watchdog.h | 2 +- Marlin/src/HAL/STM32_F4_F7/HAL.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/HAL.h | 2 +- Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h | 2 +- Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h | 2 +- Marlin/src/HAL/STM32_F4_F7/Servo.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/Servo.h | 2 +- Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp | 2 +- .../src/HAL/STM32_F4_F7/endstop_interrupts.h | 2 +- Marlin/src/HAL/STM32_F4_F7/fastio.h | 2 +- .../HAL/STM32_F4_F7/inc/Conditionals_LCD.h | 2 +- .../HAL/STM32_F4_F7/inc/Conditionals_adv.h | 2 +- .../HAL/STM32_F4_F7/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h | 2 +- Marlin/src/HAL/STM32_F4_F7/pinsDebug.h | 2 +- Marlin/src/HAL/STM32_F4_F7/spi_pins.h | 2 +- Marlin/src/HAL/STM32_F4_F7/timers.h | 2 +- Marlin/src/HAL/STM32_F4_F7/watchdog.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/watchdog.h | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.h | 2 +- Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/Servo.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/Servo.h | 2 +- Marlin/src/HAL/TEENSY31_32/eeprom.cpp | 2 +- .../src/HAL/TEENSY31_32/endstop_interrupts.h | 2 +- Marlin/src/HAL/TEENSY31_32/fastio.h | 2 +- .../HAL/TEENSY31_32/inc/Conditionals_LCD.h | 2 +- .../HAL/TEENSY31_32/inc/Conditionals_adv.h | 2 +- .../HAL/TEENSY31_32/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h | 2 +- Marlin/src/HAL/TEENSY31_32/spi_pins.h | 2 +- Marlin/src/HAL/TEENSY31_32/timers.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/timers.h | 2 +- Marlin/src/HAL/TEENSY31_32/watchdog.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/watchdog.h | 2 +- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 2 +- Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/Servo.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/Servo.h | 2 +- Marlin/src/HAL/TEENSY35_36/eeprom.cpp | 2 +- .../src/HAL/TEENSY35_36/endstop_interrupts.h | 2 +- Marlin/src/HAL/TEENSY35_36/fastio.h | 2 +- .../HAL/TEENSY35_36/inc/Conditionals_LCD.h | 2 +- .../HAL/TEENSY35_36/inc/Conditionals_adv.h | 2 +- .../HAL/TEENSY35_36/inc/Conditionals_post.h | 2 +- Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h | 2 +- Marlin/src/HAL/TEENSY35_36/pinsDebug.h | 2 +- Marlin/src/HAL/TEENSY35_36/spi_pins.h | 2 +- Marlin/src/HAL/TEENSY35_36/timers.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/timers.h | 2 +- Marlin/src/HAL/TEENSY35_36/watchdog.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/watchdog.h | 2 +- Marlin/src/HAL/platforms.h | 2 +- Marlin/src/HAL/shared/Delay.h | 4 +-- Marlin/src/HAL/shared/HAL_SPI.h | 2 +- Marlin/src/HAL/shared/HAL_ST7920.h | 2 +- Marlin/src/HAL/shared/HAL_spi_L6470.cpp | 2 +- Marlin/src/HAL/shared/Marduino.h | 2 +- Marlin/src/HAL/shared/backtrace/backtrace.cpp | 2 +- Marlin/src/HAL/shared/backtrace/backtrace.h | 2 +- Marlin/src/HAL/shared/eeprom_api.cpp | 2 +- Marlin/src/HAL/shared/eeprom_api.h | 2 +- Marlin/src/HAL/shared/eeprom_if.h | 2 +- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 2 +- Marlin/src/HAL/shared/eeprom_if_spi.cpp | 2 +- Marlin/src/HAL/shared/esp_wifi.cpp | 2 +- Marlin/src/HAL/shared/esp_wifi.h | 2 +- Marlin/src/HAL/shared/math_32bit.h | 2 +- Marlin/src/HAL/shared/servo.cpp | 2 +- Marlin/src/HAL/shared/servo.h | 2 +- Marlin/src/HAL/shared/servo_private.h | 2 +- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/MarlinCore.h | 2 +- Marlin/src/core/boards.h | 2 +- Marlin/src/core/debug_out.h | 2 +- Marlin/src/core/debug_section.h | 2 +- Marlin/src/core/drivers.h | 2 +- Marlin/src/core/language.h | 4 +-- Marlin/src/core/macros.h | 2 +- Marlin/src/core/multi_language.h | 2 +- Marlin/src/core/serial.cpp | 2 +- Marlin/src/core/serial.h | 2 +- Marlin/src/core/types.h | 2 +- Marlin/src/core/utility.cpp | 2 +- Marlin/src/core/utility.h | 2 +- Marlin/src/feature/babystep.cpp | 2 +- Marlin/src/feature/babystep.h | 2 +- Marlin/src/feature/backlash.cpp | 2 +- Marlin/src/feature/backlash.h | 2 +- Marlin/src/feature/baricuda.cpp | 2 +- Marlin/src/feature/baricuda.h | 2 +- Marlin/src/feature/bedlevel/abl/abl.cpp | 2 +- Marlin/src/feature/bedlevel/abl/abl.h | 2 +- Marlin/src/feature/bedlevel/bedlevel.cpp | 2 +- Marlin/src/feature/bedlevel/bedlevel.h | 2 +- .../bedlevel/mbl/mesh_bed_leveling.cpp | 2 +- .../feature/bedlevel/mbl/mesh_bed_leveling.h | 2 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 2 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 2 +- Marlin/src/feature/binary_protocol.cpp | 2 +- Marlin/src/feature/binary_protocol.h | 2 +- Marlin/src/feature/bltouch.cpp | 2 +- Marlin/src/feature/bltouch.h | 2 +- Marlin/src/feature/cancel_object.cpp | 2 +- Marlin/src/feature/cancel_object.h | 2 +- Marlin/src/feature/caselight.cpp | 2 +- Marlin/src/feature/caselight.h | 2 +- Marlin/src/feature/closedloop.cpp | 2 +- Marlin/src/feature/closedloop.h | 2 +- Marlin/src/feature/controllerfan.cpp | 2 +- Marlin/src/feature/controllerfan.h | 2 +- Marlin/src/feature/dac/dac_dac084s085.h | 2 +- Marlin/src/feature/dac/dac_mcp4728.cpp | 4 +-- Marlin/src/feature/dac/dac_mcp4728.h | 2 +- Marlin/src/feature/dac/stepper_dac.cpp | 2 +- Marlin/src/feature/dac/stepper_dac.h | 2 +- Marlin/src/feature/digipot/digipot.h | 2 +- .../src/feature/digipot/digipot_mcp4018.cpp | 2 +- .../src/feature/digipot/digipot_mcp4451.cpp | 2 +- Marlin/src/feature/direct_stepping.cpp | 2 +- Marlin/src/feature/direct_stepping.h | 2 +- Marlin/src/feature/e_parser.cpp | 2 +- Marlin/src/feature/e_parser.h | 2 +- Marlin/src/feature/encoder_i2c.cpp | 2 +- Marlin/src/feature/encoder_i2c.h | 2 +- Marlin/src/feature/fanmux.cpp | 2 +- Marlin/src/feature/fanmux.h | 2 +- Marlin/src/feature/filwidth.cpp | 2 +- Marlin/src/feature/filwidth.h | 2 +- Marlin/src/feature/fwretract.cpp | 2 +- Marlin/src/feature/fwretract.h | 2 +- Marlin/src/feature/host_actions.cpp | 2 +- Marlin/src/feature/host_actions.h | 2 +- Marlin/src/feature/hotend_idle.cpp | 2 +- Marlin/src/feature/hotend_idle.h | 2 +- Marlin/src/feature/joystick.cpp | 2 +- Marlin/src/feature/joystick.h | 2 +- Marlin/src/feature/leds/blinkm.cpp | 2 +- Marlin/src/feature/leds/blinkm.h | 2 +- Marlin/src/feature/leds/leds.cpp | 2 +- Marlin/src/feature/leds/leds.h | 2 +- Marlin/src/feature/leds/neopixel.cpp | 2 +- Marlin/src/feature/leds/neopixel.h | 2 +- Marlin/src/feature/leds/pca9533.cpp | 2 +- Marlin/src/feature/leds/pca9533.h | 2 +- Marlin/src/feature/leds/pca9632.cpp | 2 +- Marlin/src/feature/leds/pca9632.h | 2 +- .../src/feature/leds/printer_event_leds.cpp | 2 +- Marlin/src/feature/leds/printer_event_leds.h | 2 +- Marlin/src/feature/leds/tempstat.cpp | 2 +- Marlin/src/feature/leds/tempstat.h | 2 +- Marlin/src/feature/max7219.cpp | 2 +- Marlin/src/feature/max7219.h | 2 +- Marlin/src/feature/mixing.cpp | 2 +- Marlin/src/feature/mixing.h | 2 +- Marlin/src/feature/mmu2/mmu2.cpp | 2 +- Marlin/src/feature/mmu2/mmu2.h | 2 +- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/feature/pause.h | 2 +- Marlin/src/feature/power.cpp | 2 +- Marlin/src/feature/power.h | 2 +- Marlin/src/feature/power_monitor.cpp | 2 +- Marlin/src/feature/power_monitor.h | 2 +- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/feature/powerloss.h | 2 +- Marlin/src/feature/probe_temp_comp.cpp | 2 +- Marlin/src/feature/probe_temp_comp.h | 2 +- Marlin/src/feature/runout.cpp | 2 +- Marlin/src/feature/runout.h | 2 +- Marlin/src/feature/snmm.cpp | 2 +- Marlin/src/feature/snmm.h | 2 +- Marlin/src/feature/solenoid.cpp | 2 +- Marlin/src/feature/solenoid.h | 2 +- Marlin/src/feature/spindle_laser.cpp | 2 +- Marlin/src/feature/spindle_laser.h | 2 +- Marlin/src/feature/spindle_laser_types.h | 2 +- Marlin/src/feature/tmc_util.cpp | 2 +- Marlin/src/feature/tmc_util.h | 2 +- Marlin/src/feature/touch/xpt2046.cpp | 2 +- Marlin/src/feature/touch/xpt2046.h | 2 +- Marlin/src/feature/twibus.cpp | 2 +- Marlin/src/feature/twibus.h | 2 +- Marlin/src/feature/z_stepper_align.cpp | 2 +- Marlin/src/feature/z_stepper_align.h | 2 +- Marlin/src/gcode/bedlevel/G26.cpp | 2 +- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- Marlin/src/gcode/bedlevel/G42.cpp | 2 +- Marlin/src/gcode/bedlevel/M420.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/M421.cpp | 2 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 2 +- Marlin/src/gcode/bedlevel/mbl/M421.cpp | 2 +- Marlin/src/gcode/bedlevel/ubl/G29.cpp | 2 +- Marlin/src/gcode/bedlevel/ubl/M421.cpp | 2 +- Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/gcode/calibrate/G33.cpp | 2 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/gcode/calibrate/G425.cpp | 2 +- Marlin/src/gcode/calibrate/G76_M871.cpp | 2 +- Marlin/src/gcode/calibrate/M100.cpp | 2 +- Marlin/src/gcode/calibrate/M12.cpp | 2 +- Marlin/src/gcode/calibrate/M425.cpp | 2 +- Marlin/src/gcode/calibrate/M48.cpp | 2 +- Marlin/src/gcode/calibrate/M665.cpp | 2 +- Marlin/src/gcode/calibrate/M666.cpp | 2 +- Marlin/src/gcode/calibrate/M852.cpp | 2 +- Marlin/src/gcode/config/M200-M205.cpp | 2 +- Marlin/src/gcode/config/M217.cpp | 2 +- Marlin/src/gcode/config/M218.cpp | 2 +- Marlin/src/gcode/config/M220.cpp | 2 +- Marlin/src/gcode/config/M221.cpp | 2 +- Marlin/src/gcode/config/M281.cpp | 2 +- Marlin/src/gcode/config/M301.cpp | 2 +- Marlin/src/gcode/config/M302.cpp | 2 +- Marlin/src/gcode/config/M304.cpp | 2 +- Marlin/src/gcode/config/M305.cpp | 2 +- Marlin/src/gcode/config/M43.cpp | 2 +- Marlin/src/gcode/config/M540.cpp | 2 +- Marlin/src/gcode/config/M575.cpp | 2 +- Marlin/src/gcode/config/M672.cpp | 2 +- Marlin/src/gcode/config/M92.cpp | 2 +- Marlin/src/gcode/control/M108_M112_M410.cpp | 2 +- Marlin/src/gcode/control/M111.cpp | 2 +- Marlin/src/gcode/control/M120_M121.cpp | 2 +- Marlin/src/gcode/control/M17_M18_M84.cpp | 2 +- Marlin/src/gcode/control/M211.cpp | 2 +- Marlin/src/gcode/control/M226.cpp | 2 +- Marlin/src/gcode/control/M280.cpp | 2 +- Marlin/src/gcode/control/M3-M5.cpp | 2 +- Marlin/src/gcode/control/M350_M351.cpp | 2 +- Marlin/src/gcode/control/M380_M381.cpp | 2 +- Marlin/src/gcode/control/M400.cpp | 2 +- Marlin/src/gcode/control/M42.cpp | 2 +- Marlin/src/gcode/control/M605.cpp | 2 +- Marlin/src/gcode/control/M7-M9.cpp | 2 +- Marlin/src/gcode/control/M80_M81.cpp | 2 +- Marlin/src/gcode/control/M85.cpp | 2 +- Marlin/src/gcode/control/M997.cpp | 2 +- Marlin/src/gcode/control/M999.cpp | 2 +- Marlin/src/gcode/control/T.cpp | 2 +- Marlin/src/gcode/eeprom/M500-M504.cpp | 2 +- Marlin/src/gcode/feature/L6470/M122.cpp | 2 +- Marlin/src/gcode/feature/L6470/M906.cpp | 2 +- Marlin/src/gcode/feature/L6470/M916-918.cpp | 2 +- Marlin/src/gcode/feature/advance/M900.cpp | 2 +- .../src/gcode/feature/baricuda/M126-M129.cpp | 2 +- Marlin/src/gcode/feature/camera/M240.cpp | 6 ++-- Marlin/src/gcode/feature/cancel/M486.cpp | 2 +- Marlin/src/gcode/feature/caselight/M355.cpp | 2 +- Marlin/src/gcode/feature/clean/G12.cpp | 2 +- .../src/gcode/feature/controllerfan/M710.cpp | 2 +- .../src/gcode/feature/digipot/M907-M910.cpp | 2 +- .../src/gcode/feature/filwidth/M404-M407.cpp | 2 +- .../src/gcode/feature/fwretract/G10_G11.cpp | 2 +- .../src/gcode/feature/fwretract/M207-M209.cpp | 2 +- Marlin/src/gcode/feature/i2c/M260_M261.cpp | 2 +- Marlin/src/gcode/feature/leds/M150.cpp | 2 +- Marlin/src/gcode/feature/leds/M7219.cpp | 2 +- Marlin/src/gcode/feature/macro/M810-M819.cpp | 2 +- Marlin/src/gcode/feature/mixing/M163-M165.cpp | 2 +- Marlin/src/gcode/feature/mixing/M166.cpp | 2 +- Marlin/src/gcode/feature/pause/G27.cpp | 2 +- Marlin/src/gcode/feature/pause/G60.cpp | 2 +- Marlin/src/gcode/feature/pause/G61.cpp | 2 +- Marlin/src/gcode/feature/pause/M125.cpp | 2 +- Marlin/src/gcode/feature/pause/M600.cpp | 2 +- Marlin/src/gcode/feature/pause/M603.cpp | 2 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 2 +- .../src/gcode/feature/power_monitor/M430.cpp | 2 +- Marlin/src/gcode/feature/powerloss/M1000.cpp | 2 +- Marlin/src/gcode/feature/powerloss/M413.cpp | 2 +- Marlin/src/gcode/feature/prusa_MMU2/M403.cpp | 2 +- Marlin/src/gcode/feature/runout/M412.cpp | 2 +- Marlin/src/gcode/feature/trinamic/M122.cpp | 2 +- Marlin/src/gcode/feature/trinamic/M569.cpp | 2 +- Marlin/src/gcode/feature/trinamic/M906.cpp | 2 +- .../src/gcode/feature/trinamic/M911-M914.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 +-- Marlin/src/gcode/geometry/G17-G19.cpp | 2 +- Marlin/src/gcode/geometry/G53-G59.cpp | 2 +- Marlin/src/gcode/geometry/G92.cpp | 2 +- Marlin/src/gcode/geometry/M206_M428.cpp | 2 +- Marlin/src/gcode/host/M110.cpp | 2 +- Marlin/src/gcode/host/M113.cpp | 2 +- Marlin/src/gcode/host/M114.cpp | 2 +- Marlin/src/gcode/host/M115.cpp | 2 +- Marlin/src/gcode/host/M118.cpp | 2 +- Marlin/src/gcode/host/M119.cpp | 2 +- Marlin/src/gcode/host/M16.cpp | 2 +- Marlin/src/gcode/host/M360.cpp | 2 +- Marlin/src/gcode/host/M876.cpp | 2 +- Marlin/src/gcode/lcd/M0_M1.cpp | 2 +- Marlin/src/gcode/lcd/M117.cpp | 2 +- Marlin/src/gcode/lcd/M145.cpp | 2 +- Marlin/src/gcode/lcd/M250.cpp | 2 +- Marlin/src/gcode/lcd/M300.cpp | 2 +- Marlin/src/gcode/lcd/M73.cpp | 2 +- Marlin/src/gcode/motion/G0_G1.cpp | 2 +- Marlin/src/gcode/motion/G2_G3.cpp | 2 +- Marlin/src/gcode/motion/G4.cpp | 2 +- Marlin/src/gcode/motion/G5.cpp | 2 +- Marlin/src/gcode/motion/G6.cpp | 2 +- Marlin/src/gcode/motion/G80.cpp | 2 +- Marlin/src/gcode/motion/M290.cpp | 2 +- Marlin/src/gcode/parser.cpp | 2 +- Marlin/src/gcode/parser.h | 2 +- Marlin/src/gcode/probe/G30.cpp | 2 +- Marlin/src/gcode/probe/G31_G32.cpp | 2 +- Marlin/src/gcode/probe/G38.cpp | 2 +- Marlin/src/gcode/probe/M401_M402.cpp | 2 +- Marlin/src/gcode/probe/M851.cpp | 2 +- Marlin/src/gcode/probe/M951.cpp | 2 +- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/gcode/queue.h | 2 +- Marlin/src/gcode/scara/M360-M364.cpp | 2 +- Marlin/src/gcode/sd/M1001.cpp | 2 +- Marlin/src/gcode/sd/M20.cpp | 2 +- Marlin/src/gcode/sd/M21_M22.cpp | 2 +- Marlin/src/gcode/sd/M23.cpp | 2 +- Marlin/src/gcode/sd/M24_M25.cpp | 2 +- Marlin/src/gcode/sd/M26.cpp | 2 +- Marlin/src/gcode/sd/M27.cpp | 2 +- Marlin/src/gcode/sd/M28_M29.cpp | 2 +- Marlin/src/gcode/sd/M30.cpp | 2 +- Marlin/src/gcode/sd/M32.cpp | 2 +- Marlin/src/gcode/sd/M33.cpp | 2 +- Marlin/src/gcode/sd/M34.cpp | 2 +- Marlin/src/gcode/sd/M524.cpp | 2 +- Marlin/src/gcode/sd/M928.cpp | 2 +- Marlin/src/gcode/stats/M31.cpp | 2 +- Marlin/src/gcode/stats/M75-M78.cpp | 2 +- Marlin/src/gcode/temp/M104_M109.cpp | 2 +- Marlin/src/gcode/temp/M105.cpp | 2 +- Marlin/src/gcode/temp/M106_M107.cpp | 2 +- Marlin/src/gcode/temp/M140_M190.cpp | 2 +- Marlin/src/gcode/temp/M141_M191.cpp | 2 +- Marlin/src/gcode/temp/M155.cpp | 2 +- Marlin/src/gcode/temp/M303.cpp | 2 +- Marlin/src/gcode/units/G20_G21.cpp | 2 +- Marlin/src/gcode/units/M149.cpp | 2 +- Marlin/src/gcode/units/M82_M83.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/MarlinConfig.h | 2 +- Marlin/src/inc/MarlinConfigPre.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/inc/Version.h | 4 +-- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 2 +- Marlin/src/lcd/HD44780/ultralcd_HD44780.h | 2 +- Marlin/src/lcd/dogm/HAL_LCD_class_defines.h | 2 +- Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 2 +- Marlin/src/lcd/dogm/dogm_Bootscreen.h | 2 +- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 2 +- .../lcd/dogm/fontdata/fontdata_6x9_marlin.h | 2 +- .../lcd/dogm/fontdata/fontdata_ISO10646_1.h | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 2 +- .../u8g_dev_ssd1306_sh1106_128x64_I2C.cpp | 2 +- .../lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp | 2 +- .../lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp | 2 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 2 +- .../lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp | 2 +- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 8 ++--- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 4 +-- .../dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 2 +- .../lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h | 2 +- Marlin/src/lcd/dwin/dwin.cpp | 2 +- Marlin/src/lcd/dwin/dwin.h | 2 +- Marlin/src/lcd/dwin/dwin_lcd.cpp | 2 +- Marlin/src/lcd/dwin/dwin_lcd.h | 2 +- Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp | 2 +- Marlin/src/lcd/dwin/eeprom_BL24CXX.h | 2 +- Marlin/src/lcd/dwin/rotary_encoder.cpp | 2 +- Marlin/src/lcd/dwin/rotary_encoder.h | 2 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 2 +- .../src/lcd/extui/lib/dgus/DGUSDisplayDef.h | 2 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 2 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.h | 2 +- .../src/lcd/extui/lib/dgus/DGUSVPVariable.h | 2 +- .../extui/lib/dgus/fysetc/DGUSDisplayDef.cpp | 2 +- .../extui/lib/dgus/fysetc/DGUSDisplayDef.h | 2 +- .../extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp | 2 +- .../extui/lib/dgus/hiprecy/DGUSDisplayDef.h | 2 +- .../extui/lib/dgus/origin/DGUSDisplayDef.cpp | 2 +- .../extui/lib/dgus/origin/DGUSDisplayDef.h | 2 +- .../archim2-flash/flash_storage.cpp | 2 +- .../archim2-flash/flash_storage.h | 2 +- .../archim2-flash/media_file_reader.cpp | 2 +- .../archim2-flash/media_file_reader.h | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/compat.h | 2 +- .../lcd/extui/lib/ftdi_eve_touch_ui/config.h | 2 +- .../ftdi_eve_lib/LICENSE.txt | 8 ++--- .../ftdi_eve_lib/basic/boards.h | 10 +++--- .../ftdi_eve_lib/basic/commands.cpp | 2 +- .../ftdi_eve_lib/basic/commands.h | 2 +- .../ftdi_eve_lib/basic/constants.h | 2 +- .../ftdi_eve_lib/basic/ftdi_basic.h | 2 +- .../ftdi_eve_lib/basic/registers_ft800.h | 2 +- .../ftdi_eve_lib/basic/registers_ft810.h | 2 +- .../ftdi_eve_lib/basic/resolutions.h | 2 +- .../ftdi_eve_lib/basic/spi.cpp | 2 +- .../ftdi_eve_lib/basic/spi.h | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_lib/compat.h | 2 +- .../ftdi_eve_lib/extended/bitmap_info.h | 2 +- .../extended/command_processor.cpp | 2 +- .../ftdi_eve_lib/extended/command_processor.h | 2 +- .../ftdi_eve_lib/extended/dl_cache.cpp | 2 +- .../ftdi_eve_lib/extended/dl_cache.h | 2 +- .../ftdi_eve_lib/extended/event_loop.cpp | 2 +- .../ftdi_eve_lib/extended/event_loop.h | 2 +- .../ftdi_eve_lib/extended/ftdi_extended.h | 2 +- .../ftdi_eve_lib/extended/grid_layout.h | 2 +- .../ftdi_eve_lib/extended/polygon.h | 2 +- .../ftdi_eve_lib/extended/rgb_t.h | 2 +- .../ftdi_eve_lib/extended/screen_types.cpp | 2 +- .../ftdi_eve_lib/extended/screen_types.h | 2 +- .../ftdi_eve_lib/extended/sound_list.h | 2 +- .../ftdi_eve_lib/extended/sound_player.cpp | 2 +- .../ftdi_eve_lib/extended/sound_player.h | 2 +- .../ftdi_eve_lib/extended/text_box.cpp | 2 +- .../ftdi_eve_lib/extended/text_box.h | 2 +- .../ftdi_eve_lib/extended/tiny_timer.cpp | 2 +- .../ftdi_eve_lib/extended/tiny_timer.h | 2 +- .../extended/unicode/font_bitmaps.cpp | 2 +- .../extended/unicode/font_bitmaps.h | 2 +- .../extended/unicode/font_size_t.cpp | 2 +- .../extended/unicode/font_size_t.h | 2 +- .../extended/unicode/standard_char_set.cpp | 2 +- .../extended/unicode/standard_char_set.h | 2 +- .../ftdi_eve_lib/extended/unicode/unicode.cpp | 2 +- .../ftdi_eve_lib/extended/unicode/unicode.h | 2 +- .../extended/unicode/western_char_set.cpp | 2 +- .../extended/unicode/western_char_set.h | 2 +- .../unicode/western_char_set_bitmap_31.h | 2 +- .../ftdi_eve_lib/extras/bitmap2cpp.py | 2 +- .../ftdi_eve_lib/extras/circular_progress.h | 2 +- .../ftdi_eve_lib/extras/poly_ui.h | 2 +- .../ftdi_eve_lib/extras/svg2cpp.py | 4 +-- .../ftdi_eve_lib/ftdi_eve_lib.h | 2 +- .../ftdi_eve_touch_ui/language/language.cpp | 2 +- .../lib/ftdi_eve_touch_ui/language/language.h | 2 +- .../ftdi_eve_touch_ui/language/language_en.h | 4 +-- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- .../lib/ftdi_eve_touch_ui/pin_mappings.h | 2 +- .../screens/about_screen.cpp | 2 +- .../screens/advanced_settings_menu.cpp | 2 +- .../screens/alert_dialog_box.cpp | 2 +- .../screens/backlash_compensation_screen.cpp | 2 +- .../base_numeric_adjustment_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/base_screen.cpp | 2 +- .../screens/bed_mesh_screen.cpp | 2 +- .../screens/bio_advanced_settings.cpp | 2 +- .../screens/bio_confirm_home_e.cpp | 2 +- .../screens/bio_confirm_home_xyz.cpp | 2 +- .../screens/bio_main_menu.cpp | 2 +- .../screens/bio_printer_ui_landscape.h | 2 +- .../screens/bio_printer_ui_portrait.h | 2 +- .../screens/bio_printing_dialog_box.cpp | 2 +- .../screens/bio_status_screen.cpp | 2 +- .../screens/bio_tune_menu.cpp | 2 +- .../ftdi_eve_touch_ui/screens/boot_screen.cpp | 2 +- .../screens/case_light_screen.cpp | 2 +- .../screens/change_filament_screen.cpp | 2 +- .../confirm_abort_print_dialog_box.cpp | 2 +- .../confirm_auto_calibration_dialog_box.cpp | 2 +- .../confirm_erase_flash_dialog_box.cpp | 2 +- .../confirm_start_print_dialog_box.cpp | 2 +- .../confirm_user_request_alert_box.cpp | 2 +- .../screens/default_acceleration_screen.cpp | 2 +- .../screens/developer_menu.cpp | 2 +- .../screens/dialog_box_base_class.cpp | 2 +- .../screens/display_tuning_screen.cpp | 2 +- .../screens/endstop_state_screen.cpp | 2 +- .../screens/feedrate_percent_screen.cpp | 2 +- .../screens/filament_menu.cpp | 2 +- .../screens/filament_runout_screen.cpp | 2 +- .../screens/files_screen.cpp | 2 +- .../screens/interface_settings_screen.cpp | 2 +- .../screens/interface_sounds_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/jerk_screen.cpp | 2 +- .../screens/junction_deviation_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/kill_screen.cpp | 2 +- .../screens/language_menu.cpp | 2 +- .../screens/linear_advance_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/lock_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 2 +- .../screens/max_acceleration_screen.cpp | 2 +- .../screens/max_velocity_screen.cpp | 2 +- .../screens/media_player_screen.cpp | 2 +- .../screens/move_axis_screen.cpp | 2 +- .../screens/nozzle_offsets_screen.cpp | 2 +- .../screens/nudge_nozzle_screen.cpp | 2 +- .../screens/preheat_menu.cpp | 2 +- .../screens/preheat_timer_screen.cpp | 2 +- .../screens/restore_failsafe_dialog_box.cpp | 2 +- .../screens/save_settings_dialog_box.cpp | 2 +- .../ftdi_eve_touch_ui/screens/screen_data.h | 2 +- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/screens.h | 2 +- .../screens/spinner_dialog_box.cpp | 2 +- .../screens/statistics_screen.cpp | 2 +- .../screens/status_screen.cpp | 2 +- .../stepper_bump_sensitivity_screen.cpp | 2 +- .../screens/stepper_current_screen.cpp | 2 +- .../screens/steps_screen.cpp | 2 +- .../screens/stress_test_screen.cpp | 2 +- .../screens/string_format.cpp | 2 +- .../ftdi_eve_touch_ui/screens/string_format.h | 2 +- .../screens/temperature_screen.cpp | 2 +- .../screens/touch_calibration_screen.cpp | 2 +- .../screens/touch_registers_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 2 +- .../screens/widget_demo_screen.cpp | 2 +- .../screens/z_offset_screen.cpp | 2 +- .../lib/ftdi_eve_touch_ui/theme/bitmaps.h | 2 +- .../lib/ftdi_eve_touch_ui/theme/colors.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/theme/fonts.h | 2 +- .../theme/marlin_bootscreen_landscape.h | 2 +- .../theme/marlin_bootscreen_portrait.h | 2 +- .../lib/ftdi_eve_touch_ui/theme/sounds.cpp | 2 +- .../lib/ftdi_eve_touch_ui/theme/sounds.h | 2 +- .../extui/lib/ftdi_eve_touch_ui/theme/theme.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h | 2 +- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_about.h | 2 +- .../extui/lib/mks_ui/draw_change_speed.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_change_speed.h | 2 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 2 +- .../extui/lib/mks_ui/draw_error_message.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_error_message.h | 2 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_extrusion.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.h | 2 +- .../lcd/extui/lib/mks_ui/draw_language.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_language.h | 2 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.h | 2 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_move_motor.h | 2 +- .../lcd/extui/lib/mks_ui/draw_opration.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_opration.h | 2 +- .../extui/lib/mks_ui/draw_pause_message.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_pause_message.h | 2 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.h | 2 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_print_file.h | 2 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/draw_printing.h | 2 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- .../lcd/extui/lib/mks_ui/gb2312_puhui16.cpp | 2 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 2 +- .../lcd/extui/lib/mks_ui/mks_hardware_test.h | 2 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 +- .../lcd/extui/lib/mks_ui/printer_opration.cpp | 2 +- .../lcd/extui/lib/mks_ui/printer_opration.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_it.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h | 2 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 2 +- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 2 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 2 +- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 4 +-- Marlin/src/lcd/extui/ui_api.h | 4 +-- Marlin/src/lcd/extui_anycubic_tft.cpp | 2 +- Marlin/src/lcd/extui_dgus_lcd.cpp | 2 +- Marlin/src/lcd/extui_example.cpp | 2 +- Marlin/src/lcd/extui_malyan_lcd.cpp | 2 +- Marlin/src/lcd/language/language_an.h | 2 +- Marlin/src/lcd/language/language_bg.h | 2 +- Marlin/src/lcd/language/language_ca.h | 2 +- Marlin/src/lcd/language/language_cz.h | 4 +-- Marlin/src/lcd/language/language_da.h | 2 +- Marlin/src/lcd/language/language_de.h | 2 +- Marlin/src/lcd/language/language_el.h | 2 +- Marlin/src/lcd/language/language_el_gr.h | 2 +- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/language/language_es.h | 2 +- Marlin/src/lcd/language/language_eu.h | 2 +- Marlin/src/lcd/language/language_fi.h | 2 +- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_gl.h | 2 +- Marlin/src/lcd/language/language_hr.h | 2 +- Marlin/src/lcd/language/language_hu.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_jp_kana.h | 2 +- Marlin/src/lcd/language/language_ko_KR.h | 2 +- Marlin/src/lcd/language/language_nl.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_pt.h | 2 +- Marlin/src/lcd/language/language_pt_br.h | 2 +- Marlin/src/lcd/language/language_ro.h | 2 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 4 +-- Marlin/src/lcd/language/language_test.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/language/language_uk.h | 2 +- Marlin/src/lcd/language/language_vi.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 2 +- Marlin/src/lcd/language/language_zh_TW.h | 2 +- Marlin/src/lcd/lcdprint.cpp | 2 +- Marlin/src/lcd/menu/game/brickout.cpp | 2 +- Marlin/src/lcd/menu/game/brickout.h | 2 +- Marlin/src/lcd/menu/game/game.cpp | 2 +- Marlin/src/lcd/menu/game/game.h | 2 +- Marlin/src/lcd/menu/game/invaders.cpp | 2 +- Marlin/src/lcd/menu/game/invaders.h | 2 +- Marlin/src/lcd/menu/game/maze.cpp | 2 +- Marlin/src/lcd/menu/game/maze.h | 2 +- Marlin/src/lcd/menu/game/snake.cpp | 2 +- Marlin/src/lcd/menu/game/snake.h | 2 +- Marlin/src/lcd/menu/game/types.h | 2 +- Marlin/src/lcd/menu/menu.cpp | 2 +- Marlin/src/lcd/menu/menu.h | 2 +- Marlin/src/lcd/menu/menu_addon.h | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_backlash.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 2 +- Marlin/src/lcd/menu/menu_cancelobject.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/lcd/menu/menu_custom.cpp | 2 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 +- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_game.cpp | 2 +- Marlin/src/lcd/menu/menu_info.cpp | 2 +- Marlin/src/lcd/menu/menu_job_recovery.cpp | 2 +- Marlin/src/lcd/menu/menu_led.cpp | 2 +- Marlin/src/lcd/menu/menu_main.cpp | 2 +- Marlin/src/lcd/menu/menu_media.cpp | 2 +- Marlin/src/lcd/menu/menu_mixer.cpp | 2 +- Marlin/src/lcd/menu/menu_mmu2.cpp | 2 +- Marlin/src/lcd/menu/menu_mmu2.h | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_power_monitor.cpp | 2 +- Marlin/src/lcd/menu/menu_spindle_laser.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 2 +- Marlin/src/lcd/menu/menu_tmc.cpp | 2 +- Marlin/src/lcd/menu/menu_tune.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/lcd/thermistornames.h | 2 +- Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/lcd/ultralcd.h | 2 +- Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 2 +- Marlin/src/libs/L64XX/L64XX_Marlin.h | 2 +- Marlin/src/libs/bresenham.h | 2 +- Marlin/src/libs/buzzer.cpp | 2 +- Marlin/src/libs/buzzer.h | 2 +- Marlin/src/libs/circularqueue.h | 2 +- Marlin/src/libs/crc16.cpp | 2 +- Marlin/src/libs/crc16.h | 2 +- Marlin/src/libs/duration_t.h | 2 +- Marlin/src/libs/hex_print_routines.cpp | 2 +- Marlin/src/libs/hex_print_routines.h | 2 +- Marlin/src/libs/least_squares_fit.cpp | 2 +- Marlin/src/libs/least_squares_fit.h | 2 +- Marlin/src/libs/nozzle.cpp | 2 +- Marlin/src/libs/nozzle.h | 2 +- Marlin/src/libs/numtostr.cpp | 2 +- Marlin/src/libs/numtostr.h | 2 +- Marlin/src/libs/private_spi.h | 2 +- Marlin/src/libs/softspi.h | 2 +- Marlin/src/libs/stopwatch.cpp | 2 +- Marlin/src/libs/stopwatch.h | 2 +- Marlin/src/libs/vector_3.cpp | 2 +- Marlin/src/libs/vector_3.h | 2 +- Marlin/src/module/configuration_store.cpp | 2 +- Marlin/src/module/configuration_store.h | 2 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/delta.h | 2 +- Marlin/src/module/endstops.cpp | 2 +- Marlin/src/module/endstops.h | 2 +- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/motion.h | 2 +- Marlin/src/module/planner.cpp | 4 +-- Marlin/src/module/planner.h | 2 +- Marlin/src/module/planner_bezier.cpp | 2 +- Marlin/src/module/planner_bezier.h | 2 +- Marlin/src/module/printcounter.cpp | 2 +- Marlin/src/module/printcounter.h | 2 +- Marlin/src/module/probe.cpp | 2 +- Marlin/src/module/probe.h | 2 +- Marlin/src/module/scara.cpp | 2 +- Marlin/src/module/scara.h | 2 +- Marlin/src/module/servo.cpp | 2 +- Marlin/src/module/servo.h | 2 +- Marlin/src/module/speed_lookuptable.h | 2 +- Marlin/src/module/stepper.cpp | 6 ++-- Marlin/src/module/stepper.h | 4 +-- Marlin/src/module/stepper/L64xx.cpp | 2 +- Marlin/src/module/stepper/L64xx.h | 2 +- Marlin/src/module/stepper/TMC26X.cpp | 2 +- Marlin/src/module/stepper/TMC26X.h | 2 +- Marlin/src/module/stepper/indirection.cpp | 2 +- Marlin/src/module/stepper/indirection.h | 2 +- Marlin/src/module/stepper/trinamic.cpp | 2 +- Marlin/src/module/stepper/trinamic.h | 2 +- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/module/temperature.h | 2 +- Marlin/src/module/thermistor/thermistor_1.h | 2 +- Marlin/src/module/thermistor/thermistor_10.h | 2 +- .../src/module/thermistor/thermistor_1010.h | 2 +- .../src/module/thermistor/thermistor_1047.h | 2 +- Marlin/src/module/thermistor/thermistor_11.h | 2 +- Marlin/src/module/thermistor/thermistor_110.h | 2 +- Marlin/src/module/thermistor/thermistor_12.h | 2 +- Marlin/src/module/thermistor/thermistor_13.h | 2 +- Marlin/src/module/thermistor/thermistor_147.h | 2 +- Marlin/src/module/thermistor/thermistor_15.h | 2 +- Marlin/src/module/thermistor/thermistor_18.h | 2 +- Marlin/src/module/thermistor/thermistor_2.h | 2 +- Marlin/src/module/thermistor/thermistor_20.h | 2 +- Marlin/src/module/thermistor/thermistor_201.h | 2 +- Marlin/src/module/thermistor/thermistor_21.h | 2 +- Marlin/src/module/thermistor/thermistor_22.h | 2 +- Marlin/src/module/thermistor/thermistor_23.h | 2 +- Marlin/src/module/thermistor/thermistor_3.h | 2 +- Marlin/src/module/thermistor/thermistor_331.h | 2 +- Marlin/src/module/thermistor/thermistor_332.h | 2 +- Marlin/src/module/thermistor/thermistor_4.h | 2 +- Marlin/src/module/thermistor/thermistor_5.h | 2 +- Marlin/src/module/thermistor/thermistor_501.h | 2 +- Marlin/src/module/thermistor/thermistor_502.h | 2 +- Marlin/src/module/thermistor/thermistor_51.h | 2 +- Marlin/src/module/thermistor/thermistor_512.h | 2 +- Marlin/src/module/thermistor/thermistor_52.h | 2 +- Marlin/src/module/thermistor/thermistor_55.h | 2 +- Marlin/src/module/thermistor/thermistor_6.h | 2 +- Marlin/src/module/thermistor/thermistor_60.h | 2 +- Marlin/src/module/thermistor/thermistor_61.h | 2 +- Marlin/src/module/thermistor/thermistor_66.h | 2 +- Marlin/src/module/thermistor/thermistor_666.h | 2 +- Marlin/src/module/thermistor/thermistor_67.h | 2 +- Marlin/src/module/thermistor/thermistor_7.h | 2 +- Marlin/src/module/thermistor/thermistor_70.h | 2 +- Marlin/src/module/thermistor/thermistor_71.h | 2 +- Marlin/src/module/thermistor/thermistor_75.h | 2 +- Marlin/src/module/thermistor/thermistor_8.h | 2 +- Marlin/src/module/thermistor/thermistor_9.h | 2 +- Marlin/src/module/thermistor/thermistor_99.h | 2 +- Marlin/src/module/thermistor/thermistor_998.h | 2 +- Marlin/src/module/thermistor/thermistor_999.h | 2 +- Marlin/src/module/thermistor/thermistors.h | 2 +- Marlin/src/module/tool_change.cpp | 2 +- Marlin/src/module/tool_change.h | 2 +- Marlin/src/pins/esp32/pins_E4D.h | 4 +-- Marlin/src/pins/esp32/pins_ESP32.h | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 2 +- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 2 +- Marlin/src/pins/linux/pins_RAMPS_LINUX.h | 4 +-- Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h | 2 +- Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 2 +- Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 2 +- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 4 +-- Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h | 2 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h | 2 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 2 +- .../pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h | 2 +- .../pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h | 2 +- .../src/pins/lpc1769/pins_COHESION3D_MINI.h | 2 +- .../src/pins/lpc1769/pins_COHESION3D_REMIX.h | 2 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN.h | 2 +- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 2 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 2 +- Marlin/src/pins/mega/pins_CHEAPTRONIC.h | 2 +- Marlin/src/pins/mega/pins_CHEAPTRONICv2.h | 2 +- Marlin/src/pins/mega/pins_CNCONTROLS_11.h | 2 +- Marlin/src/pins/mega/pins_CNCONTROLS_12.h | 2 +- Marlin/src/pins/mega/pins_CNCONTROLS_15.h | 2 +- Marlin/src/pins/mega/pins_EINSTART-S.h | 2 +- Marlin/src/pins/mega/pins_ELEFU_3.h | 2 +- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 2 +- Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h | 2 +- Marlin/src/pins/mega/pins_GT2560_V3.h | 2 +- Marlin/src/pins/mega/pins_GT2560_V3_A20.h | 2 +- Marlin/src/pins/mega/pins_GT2560_V3_MC2.h | 2 +- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 2 +- Marlin/src/pins/mega/pins_INTAMSYS40.h | 2 +- Marlin/src/pins/mega/pins_LEAPFROG.h | 2 +- Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h | 2 +- Marlin/src/pins/mega/pins_MEGACONTROLLER.h | 2 +- Marlin/src/pins/mega/pins_MEGATRONICS.h | 2 +- Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 2 +- Marlin/src/pins/mega/pins_MEGATRONICS_3.h | 2 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 2 +- Marlin/src/pins/mega/pins_MINITRONICS.h | 2 +- Marlin/src/pins/mega/pins_OVERLORD.h | 2 +- Marlin/src/pins/mega/pins_PICA.h | 2 +- Marlin/src/pins/mega/pins_PICAOLD.h | 2 +- Marlin/src/pins/mega/pins_SILVER_GATE.h | 2 +- Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h | 2 +- Marlin/src/pins/pins.h | 2 +- Marlin/src/pins/pinsDebug.h | 2 +- Marlin/src/pins/pinsDebug_list.h | 2 +- Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 2 +- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 2 +- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 2 +- Marlin/src/pins/rambo/pins_RAMBO.h | 4 +-- Marlin/src/pins/rambo/pins_SCOOVO_X9H.h | 2 +- Marlin/src/pins/ramps/pins_3DRAG.h | 4 +-- Marlin/src/pins/ramps/pins_AZTEEG_X3.h | 2 +- Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h | 2 +- Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h | 2 +- Marlin/src/pins/ramps/pins_BIQU_KFB_2.h | 2 +- Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h | 2 +- Marlin/src/pins/ramps/pins_COPYMASTER_3D.h | 2 +- .../src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 2 +- Marlin/src/pins/ramps/pins_FELIX2.h | 2 +- Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h | 2 +- Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h | 2 +- .../src/pins/ramps/pins_FORMBOT_TREX2PLUS.h | 2 +- Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h | 2 +- Marlin/src/pins/ramps/pins_FYSETC_F6_13.h | 2 +- Marlin/src/pins/ramps/pins_FYSETC_F6_14.h | 2 +- Marlin/src/pins/ramps/pins_K8200.h | 2 +- Marlin/src/pins/ramps/pins_K8400.h | 2 +- Marlin/src/pins/ramps/pins_K8600.h | 2 +- Marlin/src/pins/ramps/pins_K8800.h | 2 +- Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h | 2 +- Marlin/src/pins/ramps/pins_MKS_BASE_10.h | 2 +- Marlin/src/pins/ramps/pins_MKS_BASE_14.h | 2 +- Marlin/src/pins/ramps/pins_MKS_BASE_15.h | 2 +- Marlin/src/pins/ramps/pins_MKS_BASE_16.h | 2 +- Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h | 2 +- Marlin/src/pins/ramps/pins_MKS_BASE_common.h | 2 +- Marlin/src/pins/ramps/pins_MKS_GEN_13.h | 2 +- Marlin/src/pins/ramps/pins_MKS_GEN_L.h | 2 +- Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h | 2 +- Marlin/src/pins/ramps/pins_ORTUR_4.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS.h | 4 +-- Marlin/src/pins/ramps/pins_RAMPS_13.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_OLD.h | 2 +- Marlin/src/pins/ramps/pins_RAMPS_PLUS.h | 2 +- Marlin/src/pins/ramps/pins_RIGIDBOARD.h | 2 +- Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h | 2 +- Marlin/src/pins/ramps/pins_RL200.h | 2 +- Marlin/src/pins/ramps/pins_RUMBA.h | 2 +- Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h | 2 +- Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h | 2 +- Marlin/src/pins/ramps/pins_TANGO.h | 2 +- Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h | 2 +- Marlin/src/pins/ramps/pins_TRIGORILLA_13.h | 2 +- Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 2 +- Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h | 2 +- Marlin/src/pins/ramps/pins_TT_OSCAR.h | 4 +-- Marlin/src/pins/ramps/pins_ULTIMAIN_2.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 2 +- Marlin/src/pins/ramps/pins_VORON.h | 2 +- Marlin/src/pins/ramps/pins_ZRIB_V20.h | 2 +- Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h | 2 +- Marlin/src/pins/sam/pins_ADSK.h | 2 +- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 2 +- Marlin/src/pins/sam/pins_ARCHIM1.h | 2 +- Marlin/src/pins/sam/pins_ARCHIM2.h | 2 +- Marlin/src/pins/sam/pins_CNCONTROLS_15D.h | 2 +- Marlin/src/pins/sam/pins_DUE3DOM.h | 2 +- Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 2 +- Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 2 +- Marlin/src/pins/sam/pins_RADDS.h | 2 +- Marlin/src/pins/sam/pins_RAMPS4DUE.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_DUO.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_FD_V1.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_FD_V2.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_SMART.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 2 +- Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h | 2 +- Marlin/src/pins/samd/pins_RAMPS_144.h | 4 +-- Marlin/src/pins/sanguino/pins_ANET_10.h | 6 ++-- Marlin/src/pins/sanguino/pins_AZTEEG_X1.h | 2 +- .../src/pins/sanguino/pins_GEN3_MONOLITHIC.h | 2 +- Marlin/src/pins/sanguino/pins_GEN3_PLUS.h | 2 +- Marlin/src/pins/sanguino/pins_GEN6.h | 2 +- Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h | 2 +- Marlin/src/pins/sanguino/pins_GEN7_12.h | 2 +- Marlin/src/pins/sanguino/pins_GEN7_13.h | 2 +- Marlin/src/pins/sanguino/pins_GEN7_14.h | 2 +- Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI.h | 2 +- .../src/pins/sanguino/pins_MELZI_CREALITY.h | 4 +-- Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h | 2 +- Marlin/src/pins/sanguino/pins_MELZI_V2.h | 2 +- Marlin/src/pins/sanguino/pins_OMCA.h | 2 +- Marlin/src/pins/sanguino/pins_OMCA_A.h | 2 +- .../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 2 +- .../src/pins/sanguino/pins_SANGUINOLOLU_12.h | 2 +- Marlin/src/pins/sanguino/pins_SETHI.h | 2 +- Marlin/src/pins/sanguino/pins_STB_11.h | 2 +- Marlin/src/pins/sensitive_pins.h | 2 +- Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h | 2 +- Marlin/src/pins/stm32f0/pins_MALYAN_M300.h | 2 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 2 +- .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h | 2 +- .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h | 2 +- .../pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h | 2 +- .../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 +- .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 2 +- .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 4 +-- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 2 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 2 +- .../pins/stm32f1/pins_FYSETC_CHEETAH_V12.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 2 +- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 2 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 2 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MALYAN_M200.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h | 2 +- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 2 +- .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- Marlin/src/pins/stm32f1/pins_MORPHEUS.h | 2 +- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 4 +-- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 4 +-- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 2 +- Marlin/src/pins/stm32f4/pins_ARMED.h | 2 +- Marlin/src/pins/stm32f4/pins_BEAST.h | 4 +-- .../src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 2 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 2 +- .../src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.h | 2 +- .../src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.h | 2 +- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 2 +- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 2 +- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 2 +- .../src/pins/stm32f4/pins_GENERIC_STM32F4.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 2 +- Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 2 +- .../src/pins/stm32f4/pins_STEVAL_3DP001V1.h | 2 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 2 +- Marlin/src/pins/stm32f7/pins_REMRAM_V1.h | 2 +- Marlin/src/pins/stm32f7/pins_THE_BORG.h | 2 +- Marlin/src/pins/teensy2/pins_5DPRINT.h | 4 +-- Marlin/src/pins/teensy2/pins_BRAINWAVE.h | 2 +- Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h | 4 +-- Marlin/src/pins/teensy2/pins_PRINTRBOARD.h | 4 +-- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 2 +- Marlin/src/pins/teensy2/pins_SAV_MKI.h | 4 +-- Marlin/src/pins/teensy2/pins_TEENSY2.h | 8 ++--- Marlin/src/pins/teensy2/pins_TEENSYLU.h | 4 +-- Marlin/src/pins/teensy3/pins_TEENSY31_32.h | 4 +-- Marlin/src/pins/teensy3/pins_TEENSY35_36.h | 4 +-- Marlin/src/sd/Sd2Card.cpp | 2 +- Marlin/src/sd/Sd2Card.h | 2 +- Marlin/src/sd/Sd2Card_sdio.h | 2 +- Marlin/src/sd/SdBaseFile.cpp | 2 +- Marlin/src/sd/SdBaseFile.h | 2 +- Marlin/src/sd/SdFatConfig.h | 2 +- Marlin/src/sd/SdFatStructs.h | 2 +- Marlin/src/sd/SdFatUtil.cpp | 2 +- Marlin/src/sd/SdFatUtil.h | 2 +- Marlin/src/sd/SdFile.cpp | 2 +- Marlin/src/sd/SdFile.h | 2 +- Marlin/src/sd/SdInfo.h | 2 +- Marlin/src/sd/SdVolume.cpp | 2 +- Marlin/src/sd/SdVolume.h | 2 +- Marlin/src/sd/cardreader.cpp | 2 +- Marlin/src/sd/cardreader.h | 2 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 2 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.h | 2 +- Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp | 2 +- Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/UsbCore.h | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/address.h | 2 +- .../usb_flashdrive/lib-uhs2/confdescparser.h | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/hexdump.h | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/macros.h | 2 +- .../sd/usb_flashdrive/lib-uhs2/masstorage.cpp | 2 +- .../sd/usb_flashdrive/lib-uhs2/masstorage.h | 4 +-- .../src/sd/usb_flashdrive/lib-uhs2/max3421e.h | 2 +- .../sd/usb_flashdrive/lib-uhs2/message.cpp | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/message.h | 2 +- .../sd/usb_flashdrive/lib-uhs2/parsetools.cpp | 2 +- .../sd/usb_flashdrive/lib-uhs2/parsetools.h | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/printhex.h | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/settings.h | 4 +-- .../src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h | 2 +- .../sd/usb_flashdrive/lib-uhs2/usbhost.cpp | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/usbhost.h | 2 +- .../UHS_BULK_STORAGE/UHS_BULK_STORAGE.h | 2 +- .../UHS_BULK_STORAGE_INLINE.h | 2 +- .../UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h | 4 +-- .../lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h | 2 +- .../lib-uhs3/UHS_host/UHS_UsbCore.h | 2 +- .../lib-uhs3/UHS_host/UHS_address.h | 2 +- .../lib-uhs3/UHS_host/UHS_hexdump.h | 2 +- .../lib-uhs3/UHS_host/UHS_host.h | 2 +- .../lib-uhs3/UHS_host/UHS_host_INLINE.h | 4 +-- .../lib-uhs3/UHS_host/UHS_macros.h | 2 +- .../lib-uhs3/UHS_host/UHS_message.h | 2 +- .../lib-uhs3/UHS_host/UHS_printf_HELPER.h | 2 +- .../lib-uhs3/UHS_host/UHS_printhex.h | 2 +- .../lib-uhs3/UHS_host/UHS_settings.h | 4 +-- .../lib-uhs3/UHS_host/UHS_usb_ch9.h | 2 +- .../lib-uhs3/UHS_host/UHS_usbhost.h | 2 +- .../lib-uhs3/UHS_host/UHS_util_INLINE.h | 2 +- .../UHS_host/USB_HOST_SHIELD/UHS_max3421e.h | 2 +- .../USB_HOST_SHIELD/USB_HOST_SHIELD.h | 2 +- .../USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h | 2 +- README.md | 14 ++++---- platformio.ini | 2 +- 1321 files changed, 1416 insertions(+), 1416 deletions(-) diff --git a/.gitignore b/.gitignore index 80c76ee1e482..c163d339dff3 100755 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # # Our automatic versioning scheme generates the following file diff --git a/LICENSE b/LICENSE index 7d917cf3d8f9..4ad6d9b1e2aa 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (c) 2007 Free Software Foundation, Inc. + Copyright (c) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -647,7 +647,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -666,12 +666,12 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index fccdf9ced3aa..78044525618b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -45,13 +45,13 @@ /** * Here are some standard links for getting your machine calibrated: * - * http://reprap.org/wiki/Calibration - * http://youtu.be/wAL9d7FgInk + * https://reprap.org/wiki/Calibration + * https://youtu.be/wAL9d7FgInk * http://calculator.josefprusa.cz - * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide - * http://www.thingiverse.com/thing:5573 + * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * https://www.thingiverse.com/thing:5573 * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap - * http://www.thingiverse.com/thing:298812 + * https://www.thingiverse.com/thing:298812 */ //=========================================================================== @@ -815,7 +815,7 @@ * * See: * https://reprap.org/forum/read.php?1,739819 - * http://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + * https://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html */ #if DISABLED(CLASSIC_JERK) #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge @@ -1795,7 +1795,7 @@ // // RepRapDiscount Smart Controller. -// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// https://reprap.org/wiki/RepRapDiscount_Smart_Controller // // Note: Usually sold with a white PCB. // @@ -1819,13 +1819,13 @@ // // PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) -// http://reprap.org/wiki/PanelOne +// https://reprap.org/wiki/PanelOne // //#define PANEL_ONE // // GADGETS3D G3D LCD/SD Controller -// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// https://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel // // Note: Usually sold with a blue PCB. // @@ -1912,7 +1912,7 @@ // // 2-wire Non-latching LCD SR from https://goo.gl/aJJ4sH -// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// LCD configuration: https://reprap.org/wiki/SAV_3D_LCD // //#define SAV_3DLCD @@ -1939,7 +1939,7 @@ // // RepRapDiscount FULL GRAPHIC Smart Controller -// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER @@ -1952,20 +1952,20 @@ // // Activate one of these if you have a Panucatt Devices // Viki 2.0 or mini Viki with Graphic LCD -// http://panucatt.com +// https://www.panucatt.com // //#define VIKI2 //#define miniVIKI // // MakerLab Mini Panel with graphic -// controller and SD support - http://reprap.org/wiki/Mini_panel +// controller and SD support - https://reprap.org/wiki/Mini_panel // //#define MINIPANEL // // MaKr3d Makr-Panel with graphic controller and SD support. -// http://reprap.org/wiki/MaKr3d_MaKrPanel +// https://reprap.org/wiki/MaKr3d_MaKrPanel // //#define MAKRPANEL @@ -2051,7 +2051,7 @@ // // Silvergate GLCD controller -// http://github.com/android444/Silvergate +// https://github.com/android444/Silvergate // //#define SILVER_GATE_GLCD_CONTROLLER @@ -2080,7 +2080,7 @@ // // MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER -// http://reprap.org/wiki/MKS_12864OLED +// https://reprap.org/wiki/MKS_12864OLED // // Tiny, but very sharp OLED display // @@ -2183,7 +2183,7 @@ // // RepRapWorld REPRAPWORLD_KEYPAD v1.1 -// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// https://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 // //#define REPRAPWORLD_KEYPAD //#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e57f7c529a1a..0945a6c43409 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -835,7 +835,7 @@ /** * XY Frequency limit * Reduce resonance by limiting the frequency of small zigzag infill moves. - * See http://hydraraptor.blogspot.com/2010/12/frequency-limit.html + * See https://hydraraptor.blogspot.com/2010/12/frequency-limit.html * Use M201 F G to change limits at runtime. */ //#define XY_FREQUENCY_LIMIT 10 // (Hz) Maximum frequency of small zigzag infill moves. Set with M201 F. @@ -2794,11 +2794,11 @@ //#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S) // Canon RC-1 or homebrew digital camera trigger - // Data from: http://www.doc-diy.net/photo/rc-1_hacked/ + // Data from: https://www.doc-diy.net/photo/rc-1_hacked/ //#define PHOTOGRAPH_PIN 23 // Canon Hack Development Kit - // http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + // https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ //#define CHDK_PIN 4 // Optional second move with delay to trigger the camera shutter @@ -3220,11 +3220,11 @@ * I2C position encoders for closed loop control. * Developed by Chris Barr at Aus3D. * - * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Wiki: https://wiki.aus3d.com.au/Magnetic_Encoder * Github: https://github.com/Aus3D/MagneticEncoder * - * Supplier: http://aus3d.com.au/magnetic-encoder-module - * Alternative Supplier: http://reliabuild3d.com/ + * Supplier: https://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: https://reliabuild3d.com/ * * Reliabuild encoders have been modified to improve reliability. */ diff --git a/Marlin/Makefile b/Marlin/Makefile index cd772e693abc..95135ab594d9 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -98,7 +98,7 @@ NEOPIXEL ?= 0 ############ # Try to automatically determine whether RELOC_WORKAROUND is needed based # on GCC versions: -# http://www.avrfreaks.net/comment/1789106#comment-1789106 +# https://www.avrfreaks.net/comment/1789106#comment-1789106 CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d\ ) CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ ) diff --git a/Marlin/Version.h b/Marlin/Version.h index 2d4a8e9b5c03..a698b435cd31 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -65,7 +65,7 @@ * The WEBSITE_URL is the location where users can get more information such as * documentation about a specific Marlin release. */ -//#define WEBSITE_URL "http://marlinfw.org" +//#define WEBSITE_URL "https://marlinfw.org" /** * Set the vendor info the serial USB interface, if changable diff --git a/Marlin/lib/readme.txt b/Marlin/lib/readme.txt index dbadc3d6300d..5ec60aa85884 100644 --- a/Marlin/lib/readme.txt +++ b/Marlin/lib/readme.txt @@ -33,4 +33,4 @@ PlatformIO will find your libraries automatically, configure preprocessor's include paths and build them. More information about PlatformIO Library Dependency Finder -- http://docs.platformio.org/page/librarymanager/ldf.html +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp index 05d4e51dd04a..58d57c8ee54b 100644 --- a/Marlin/src/HAL/AVR/HAL.cpp +++ b/Marlin/src/HAL/AVR/HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __AVR__ diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 63cb3949aa6b..b0e0674c7329 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ #pragma once diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp index f1f9654c4e90..31e589746cf2 100644 --- a/Marlin/src/HAL/AVR/HAL_SPI.cpp +++ b/Marlin/src/HAL/AVR/HAL_SPI.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index c544b905f36c..f41ef2011407 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index fc20a48ec51b..1182d86ac58f 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/Servo.cpp b/Marlin/src/HAL/AVR/Servo.cpp index 1d4d2034b2a4..66ed993c6f18 100644 --- a/Marlin/src/HAL/AVR/Servo.cpp +++ b/Marlin/src/HAL/AVR/Servo.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/AVR/ServoTimers.h b/Marlin/src/HAL/AVR/ServoTimers.h index 86007fd102c6..564714df6e8e 100644 --- a/Marlin/src/HAL/AVR/ServoTimers.h +++ b/Marlin/src/HAL/AVR/ServoTimers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp index 7f4384215506..d23ac2f32a5d 100644 --- a/Marlin/src/HAL/AVR/eeprom.cpp +++ b/Marlin/src/HAL/AVR/eeprom.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __AVR__ diff --git a/Marlin/src/HAL/AVR/endstop_interrupts.h b/Marlin/src/HAL/AVR/endstop_interrupts.h index 8f89c69baf77..ae9a605accce 100644 --- a/Marlin/src/HAL/AVR/endstop_interrupts.h +++ b/Marlin/src/HAL/AVR/endstop_interrupts.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/fast_pwm.cpp b/Marlin/src/HAL/AVR/fast_pwm.cpp index e96ca3246b0a..29866bccf924 100644 --- a/Marlin/src/HAL/AVR/fast_pwm.cpp +++ b/Marlin/src/HAL/AVR/fast_pwm.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __AVR__ diff --git a/Marlin/src/HAL/AVR/fastio.cpp b/Marlin/src/HAL/AVR/fastio.cpp index 01350488265a..b51d7f97686a 100644 --- a/Marlin/src/HAL/AVR/fastio.cpp +++ b/Marlin/src/HAL/AVR/fastio.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/AVR/fastio.h b/Marlin/src/HAL/AVR/fastio.h index a45e0f2bebb7..c3239186baca 100644 --- a/Marlin/src/HAL/AVR/fastio.h +++ b/Marlin/src/HAL/AVR/fastio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1280.h b/Marlin/src/HAL/AVR/fastio/fastio_1280.h index b62156caa774..f482f823e8b9 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_1280.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_1280.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1281.h b/Marlin/src/HAL/AVR/fastio/fastio_1281.h index 7552540ffee6..e0bc5e2995d1 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_1281.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_1281.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/fastio/fastio_168.h b/Marlin/src/HAL/AVR/fastio/fastio_168.h index 549e0246d5af..8cfdd1e8f825 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_168.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_168.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/fastio/fastio_644.h b/Marlin/src/HAL/AVR/fastio/fastio_644.h index 3a48c109e97e..f4a9427e0abf 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_644.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_644.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h b/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h index 23d16a20e565..51d400b70565 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_adv.h b/Marlin/src/HAL/AVR/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/AVR/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/AVR/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_post.h b/Marlin/src/HAL/AVR/inc/Conditionals_post.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/AVR/inc/Conditionals_post.h +++ b/Marlin/src/HAL/AVR/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h index 575f1b677b09..e55e45b73bd0 100644 --- a/Marlin/src/HAL/AVR/inc/SanityCheck.h +++ b/Marlin/src/HAL/AVR/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/math.h b/Marlin/src/HAL/AVR/math.h index e8be0a04bcf5..7ede4accc09e 100644 --- a/Marlin/src/HAL/AVR/math.h +++ b/Marlin/src/HAL/AVR/math.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h index fbd2e084fad7..d73f520d1494 100644 --- a/Marlin/src/HAL/AVR/pinsDebug.h +++ b/Marlin/src/HAL/AVR/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h index f6da0777436d..051972a861ad 100644 --- a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h +++ b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h index 6e7b8fbaa952..46c03088d213 100644 --- a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h +++ b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/spi_pins.h b/Marlin/src/HAL/AVR/spi_pins.h index daaebb76d701..f3fa78e2bfaf 100644 --- a/Marlin/src/HAL/AVR/spi_pins.h +++ b/Marlin/src/HAL/AVR/spi_pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/AVR/timers.h b/Marlin/src/HAL/AVR/timers.h index aa38115fa0ce..6c40d3220924 100644 --- a/Marlin/src/HAL/AVR/timers.h +++ b/Marlin/src/HAL/AVR/timers.h @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ #pragma once diff --git a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp index fab79646f06b..c29b19557899 100644 --- a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp +++ b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/AVR/watchdog.cpp b/Marlin/src/HAL/AVR/watchdog.cpp index ef1ed0e59684..3f10c4adff81 100644 --- a/Marlin/src/HAL/AVR/watchdog.cpp +++ b/Marlin/src/HAL/AVR/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __AVR__ diff --git a/Marlin/src/HAL/AVR/watchdog.h b/Marlin/src/HAL/AVR/watchdog.h index 57dfcfc0bf68..a16c88b35e87 100644 --- a/Marlin/src/HAL/AVR/watchdog.h +++ b/Marlin/src/HAL/AVR/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/DebugMonitor.cpp b/Marlin/src/HAL/DUE/DebugMonitor.cpp index 84ea137ad79a..79759151d891 100644 --- a/Marlin/src/HAL/DUE/DebugMonitor.cpp +++ b/Marlin/src/HAL/DUE/DebugMonitor.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index cb381ff4bb61..f2bf4ebbf5b8 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ /** diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index bc60b1d6d119..31409c76dd56 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 97a6fa05a1f2..6d8f7ef81939 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/InterruptVectors.cpp b/Marlin/src/HAL/DUE/InterruptVectors.cpp index 7964f2d1f680..e4e0ce99f2b5 100644 --- a/Marlin/src/HAL/DUE/InterruptVectors.cpp +++ b/Marlin/src/HAL/DUE/InterruptVectors.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/InterruptVectors.h b/Marlin/src/HAL/DUE/InterruptVectors.h index 534cd17f42bb..6faeb34b7a3e 100644 --- a/Marlin/src/HAL/DUE/InterruptVectors.h +++ b/Marlin/src/HAL/DUE/InterruptVectors.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/MarlinSerial.cpp b/Marlin/src/HAL/DUE/MarlinSerial.cpp index d114c75989c4..c9a372eeb14f 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerial.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h index fa6a2c7d157a..dfafa1514159 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.h +++ b/Marlin/src/HAL/DUE/MarlinSerial.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp index d2674228132f..a41dbfeb7a57 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h index 9aece901b12b..2e3622e5534a 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/Servo.cpp b/Marlin/src/HAL/DUE/Servo.cpp index 6f965783ceff..5524aa9cef47 100644 --- a/Marlin/src/HAL/DUE/Servo.cpp +++ b/Marlin/src/HAL/DUE/Servo.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/Tone.cpp b/Marlin/src/HAL/DUE/Tone.cpp index ebf4fbcfb687..e6c72c728b67 100644 --- a/Marlin/src/HAL/DUE/Tone.cpp +++ b/Marlin/src/HAL/DUE/Tone.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp index 0fb8a782e5c4..2ef7011b1c65 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp index 01320ba9b9a4..47060d6a5be2 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp index c4816c3db54d..54c244d4f615 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp index 96b7a1f61eb8..960df1bd864b 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h index e0f15bfd810d..f076c503cac2 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index cb27e23c58ba..74d4e81fa6c0 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/eeprom_wired.cpp b/Marlin/src/HAL/DUE/eeprom_wired.cpp index 6c28a6db958d..496d81f28224 100644 --- a/Marlin/src/HAL/DUE/eeprom_wired.cpp +++ b/Marlin/src/HAL/DUE/eeprom_wired.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/endstop_interrupts.h b/Marlin/src/HAL/DUE/endstop_interrupts.h index 759fefae290c..999ada512761 100644 --- a/Marlin/src/HAL/DUE/endstop_interrupts.h +++ b/Marlin/src/HAL/DUE/endstop_interrupts.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h index 8f4b5a9e2f7c..9d6bfa164aed 100644 --- a/Marlin/src/HAL/DUE/fastio.h +++ b/Marlin/src/HAL/DUE/fastio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp index 672932f56cd5..1682faea666d 100644 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.h b/Marlin/src/HAL/DUE/fastio/G2_PWM.h index a94c1c527657..dc4edffff851 100644 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.h +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/fastio/G2_pins.h b/Marlin/src/HAL/DUE/fastio/G2_pins.h index 44b9cb35ee3f..80c87bd39296 100644 --- a/Marlin/src/HAL/DUE/fastio/G2_pins.h +++ b/Marlin/src/HAL/DUE/fastio/G2_pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_adv.h b/Marlin/src/HAL/DUE/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/DUE/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/DUE/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_post.h b/Marlin/src/HAL/DUE/inc/Conditionals_post.h index 9b76c2510214..ce6d3fdde27f 100644 --- a/Marlin/src/HAL/DUE/inc/Conditionals_post.h +++ b/Marlin/src/HAL/DUE/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h index 0f7be7955fa8..cdea34436e87 100644 --- a/Marlin/src/HAL/DUE/inc/SanityCheck.h +++ b/Marlin/src/HAL/DUE/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/pinsDebug.h b/Marlin/src/HAL/DUE/pinsDebug.h index 448c2391d3e9..28687ff267c4 100644 --- a/Marlin/src/HAL/DUE/pinsDebug.h +++ b/Marlin/src/HAL/DUE/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/spi_pins.h b/Marlin/src/HAL/DUE/spi_pins.h index a205540bcd33..e28eaf827020 100644 --- a/Marlin/src/HAL/DUE/spi_pins.h +++ b/Marlin/src/HAL/DUE/spi_pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/timers.cpp b/Marlin/src/HAL/DUE/timers.cpp index c49572c735e5..795cdad66a57 100644 --- a/Marlin/src/HAL/DUE/timers.cpp +++ b/Marlin/src/HAL/DUE/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/DUE/timers.h b/Marlin/src/HAL/DUE/timers.h index 4ad766781e36..9defe39a0ae3 100644 --- a/Marlin/src/HAL/DUE/timers.h +++ b/Marlin/src/HAL/DUE/timers.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/DUE/watchdog.cpp b/Marlin/src/HAL/DUE/watchdog.cpp index 2fa6ea5e5d81..0f4697183056 100644 --- a/Marlin/src/HAL/DUE/watchdog.cpp +++ b/Marlin/src/HAL/DUE/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/watchdog.h b/Marlin/src/HAL/DUE/watchdog.h index 7d9665f20e3c..5725a10007a7 100644 --- a/Marlin/src/HAL/DUE/watchdog.h +++ b/Marlin/src/HAL/DUE/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp index 4d70d34edb97..d4b2f42c5351 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h index 703bcbeb73fa..b43caea13c1d 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index d6dd46feb40d..1e00df5177ad 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 3b752914b12c..c91f9efff0b9 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ #pragma once diff --git a/Marlin/src/HAL/ESP32/HAL_SPI.cpp b/Marlin/src/HAL/ESP32/HAL_SPI.cpp index f8f08fe6e0c9..8e5875fc388d 100644 --- a/Marlin/src/HAL/ESP32/HAL_SPI.cpp +++ b/Marlin/src/HAL/ESP32/HAL_SPI.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/Servo.cpp b/Marlin/src/HAL/ESP32/Servo.cpp index f0a865856211..fcf58485819e 100644 --- a/Marlin/src/HAL/ESP32/Servo.cpp +++ b/Marlin/src/HAL/ESP32/Servo.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/Servo.h b/Marlin/src/HAL/ESP32/Servo.h index 3f575150ebb1..b0d929452732 100644 --- a/Marlin/src/HAL/ESP32/Servo.h +++ b/Marlin/src/HAL/ESP32/Servo.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp index c7ee6951e11c..533f873e4ffd 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.h b/Marlin/src/HAL/ESP32/WebSocketSerial.h index e76a2bc68eff..7a25c6dc5e9c 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.h +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/eeprom.cpp b/Marlin/src/HAL/ESP32/eeprom.cpp index 27974fe55e10..1bf687c6fe09 100644 --- a/Marlin/src/HAL/ESP32/eeprom.cpp +++ b/Marlin/src/HAL/ESP32/eeprom.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/endstop_interrupts.h b/Marlin/src/HAL/ESP32/endstop_interrupts.h index 8738c409b314..743ccd99c904 100644 --- a/Marlin/src/HAL/ESP32/endstop_interrupts.h +++ b/Marlin/src/HAL/ESP32/endstop_interrupts.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/fastio.h b/Marlin/src/HAL/ESP32/fastio.h index 09930194d616..2ded3a5f62e8 100644 --- a/Marlin/src/HAL/ESP32/fastio.h +++ b/Marlin/src/HAL/ESP32/fastio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp index d80c3c24e16f..99b2f755e578 100644 --- a/Marlin/src/HAL/ESP32/i2s.cpp +++ b/Marlin/src/HAL/ESP32/i2s.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/i2s.h b/Marlin/src/HAL/ESP32/i2s.h index 63a579a18457..573b983837f5 100644 --- a/Marlin/src/HAL/ESP32/i2s.h +++ b/Marlin/src/HAL/ESP32/i2s.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h b/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_post.h b/Marlin/src/HAL/ESP32/inc/Conditionals_post.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/ESP32/inc/Conditionals_post.h +++ b/Marlin/src/HAL/ESP32/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/inc/SanityCheck.h b/Marlin/src/HAL/ESP32/inc/SanityCheck.h index b6ad7a3c4bff..7653f6fe7ff1 100644 --- a/Marlin/src/HAL/ESP32/inc/SanityCheck.h +++ b/Marlin/src/HAL/ESP32/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/ota.cpp b/Marlin/src/HAL/ESP32/ota.cpp index 34a2482c9b64..7cf65ed2d3cf 100644 --- a/Marlin/src/HAL/ESP32/ota.cpp +++ b/Marlin/src/HAL/ESP32/ota.cpp @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/ota.h b/Marlin/src/HAL/ESP32/ota.h index 1780fb32c1b3..7f9b237aa6e1 100644 --- a/Marlin/src/HAL/ESP32/ota.h +++ b/Marlin/src/HAL/ESP32/ota.h @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ #pragma once diff --git a/Marlin/src/HAL/ESP32/servotimers.h b/Marlin/src/HAL/ESP32/servotimers.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/ESP32/servotimers.h +++ b/Marlin/src/HAL/ESP32/servotimers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/spi_pins.h b/Marlin/src/HAL/ESP32/spi_pins.h index 0e67615a2bd3..15f8f2ab6b07 100644 --- a/Marlin/src/HAL/ESP32/spi_pins.h +++ b/Marlin/src/HAL/ESP32/spi_pins.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/spiffs.cpp b/Marlin/src/HAL/ESP32/spiffs.cpp index 69fe7da58eb7..a0e713bff0bb 100644 --- a/Marlin/src/HAL/ESP32/spiffs.cpp +++ b/Marlin/src/HAL/ESP32/spiffs.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/spiffs.h b/Marlin/src/HAL/ESP32/spiffs.h index b9cbb23bdae4..64ec7dd11e14 100644 --- a/Marlin/src/HAL/ESP32/spiffs.h +++ b/Marlin/src/HAL/ESP32/spiffs.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/timers.cpp b/Marlin/src/HAL/ESP32/timers.cpp index 6a158001b713..3300aea8a89c 100644 --- a/Marlin/src/HAL/ESP32/timers.cpp +++ b/Marlin/src/HAL/ESP32/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/timers.h b/Marlin/src/HAL/ESP32/timers.h index dcc195ae09eb..d722670f33cf 100644 --- a/Marlin/src/HAL/ESP32/timers.h +++ b/Marlin/src/HAL/ESP32/timers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/watchdog.cpp b/Marlin/src/HAL/ESP32/watchdog.cpp index 073da7f69d70..f6fcfa3182c4 100644 --- a/Marlin/src/HAL/ESP32/watchdog.cpp +++ b/Marlin/src/HAL/ESP32/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/watchdog.h b/Marlin/src/HAL/ESP32/watchdog.h index 7e079908658e..b6c169e34742 100644 --- a/Marlin/src/HAL/ESP32/watchdog.h +++ b/Marlin/src/HAL/ESP32/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/web.cpp b/Marlin/src/HAL/ESP32/web.cpp index 7c175bcc9b27..7a27707a3e14 100644 --- a/Marlin/src/HAL/ESP32/web.cpp +++ b/Marlin/src/HAL/ESP32/web.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/web.h b/Marlin/src/HAL/ESP32/web.h index 8dbefd8eefc9..60023ac636a3 100644 --- a/Marlin/src/HAL/ESP32/web.h +++ b/Marlin/src/HAL/ESP32/web.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/ESP32/wifi.cpp b/Marlin/src/HAL/ESP32/wifi.cpp index 9ac3ddde24f2..f4cf5a606a03 100644 --- a/Marlin/src/HAL/ESP32/wifi.cpp +++ b/Marlin/src/HAL/ESP32/wifi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/wifi.h b/Marlin/src/HAL/ESP32/wifi.h index 580c6c87f416..759a73b25293 100644 --- a/Marlin/src/HAL/ESP32/wifi.h +++ b/Marlin/src/HAL/ESP32/wifi.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index d96692da6947..29702f2d2b61 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/HAL.cpp b/Marlin/src/HAL/LINUX/HAL.cpp index dd12d8645fbd..d7d7c2d2b4f0 100644 --- a/Marlin/src/HAL/LINUX/HAL.cpp +++ b/Marlin/src/HAL/LINUX/HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index 0573b334c4da..96e121d9153e 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/arduino.cpp b/Marlin/src/HAL/LINUX/arduino.cpp index 122a1a4a1809..4b56d02a389c 100644 --- a/Marlin/src/HAL/LINUX/arduino.cpp +++ b/Marlin/src/HAL/LINUX/arduino.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/eeprom.cpp b/Marlin/src/HAL/LINUX/eeprom.cpp index 50f33eae21dd..967ca851abc1 100644 --- a/Marlin/src/HAL/LINUX/eeprom.cpp +++ b/Marlin/src/HAL/LINUX/eeprom.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/fastio.h b/Marlin/src/HAL/LINUX/fastio.h index 8b0526710dc7..8f18d6ab607a 100644 --- a/Marlin/src/HAL/LINUX/fastio.h +++ b/Marlin/src/HAL/LINUX/fastio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/hardware/Clock.cpp b/Marlin/src/HAL/LINUX/hardware/Clock.cpp index 8fd4825b35c5..1984a4a44e94 100644 --- a/Marlin/src/HAL/LINUX/hardware/Clock.cpp +++ b/Marlin/src/HAL/LINUX/hardware/Clock.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Clock.h b/Marlin/src/HAL/LINUX/hardware/Clock.h index 17c2fd9501dc..072eacfd73db 100644 --- a/Marlin/src/HAL/LINUX/hardware/Clock.h +++ b/Marlin/src/HAL/LINUX/hardware/Clock.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/hardware/Gpio.cpp b/Marlin/src/HAL/LINUX/hardware/Gpio.cpp index b7b12ceb16d8..61a7be7da90c 100644 --- a/Marlin/src/HAL/LINUX/hardware/Gpio.cpp +++ b/Marlin/src/HAL/LINUX/hardware/Gpio.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Gpio.h b/Marlin/src/HAL/LINUX/hardware/Gpio.h index 33eea7773124..9255ec1dfc91 100644 --- a/Marlin/src/HAL/LINUX/hardware/Gpio.h +++ b/Marlin/src/HAL/LINUX/hardware/Gpio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/hardware/Heater.cpp b/Marlin/src/HAL/LINUX/hardware/Heater.cpp index 8fc85552434a..70df8161829a 100644 --- a/Marlin/src/HAL/LINUX/hardware/Heater.cpp +++ b/Marlin/src/HAL/LINUX/hardware/Heater.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Heater.h b/Marlin/src/HAL/LINUX/hardware/Heater.h index bb759da0905f..b17078d0b739 100644 --- a/Marlin/src/HAL/LINUX/hardware/Heater.h +++ b/Marlin/src/HAL/LINUX/hardware/Heater.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp index fe6e130f3652..c11fd1f55cd7 100644 --- a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp +++ b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h index f8bca83e30ec..d8fe7383bdfc 100644 --- a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h +++ b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp b/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp index ee7602db62f7..c5b3ccc98656 100644 --- a/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp +++ b/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/LinearAxis.h b/Marlin/src/HAL/LINUX/hardware/LinearAxis.h index 04a5f3d0f7df..34541e79a1e4 100644 --- a/Marlin/src/HAL/LINUX/hardware/LinearAxis.h +++ b/Marlin/src/HAL/LINUX/hardware/LinearAxis.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/hardware/Timer.cpp b/Marlin/src/HAL/LINUX/hardware/Timer.cpp index e213cc2683a4..9f0d6a8f3ae2 100644 --- a/Marlin/src/HAL/LINUX/hardware/Timer.cpp +++ b/Marlin/src/HAL/LINUX/hardware/Timer.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Timer.h b/Marlin/src/HAL/LINUX/hardware/Timer.h index ebfe8e8b9bb3..757efdcdbd7e 100644 --- a/Marlin/src/HAL/LINUX/hardware/Timer.h +++ b/Marlin/src/HAL/LINUX/hardware/Timer.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h b/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_post.h b/Marlin/src/HAL/LINUX/inc/Conditionals_post.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/LINUX/inc/Conditionals_post.h +++ b/Marlin/src/HAL/LINUX/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/inc/SanityCheck.h b/Marlin/src/HAL/LINUX/inc/SanityCheck.h index a3238b088b83..8d23cdabbf8f 100644 --- a/Marlin/src/HAL/LINUX/inc/SanityCheck.h +++ b/Marlin/src/HAL/LINUX/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/LINUX/include/Arduino.h index 928f551fb461..e28b474ede96 100644 --- a/Marlin/src/HAL/LINUX/include/Arduino.h +++ b/Marlin/src/HAL/LINUX/include/Arduino.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/include/pinmapping.cpp b/Marlin/src/HAL/LINUX/include/pinmapping.cpp index 66d8acd2f6fb..870ab3a96e5f 100644 --- a/Marlin/src/HAL/LINUX/include/pinmapping.cpp +++ b/Marlin/src/HAL/LINUX/include/pinmapping.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/include/pinmapping.h b/Marlin/src/HAL/LINUX/include/pinmapping.h index 0d99a3811667..98f4b812e873 100644 --- a/Marlin/src/HAL/LINUX/include/pinmapping.h +++ b/Marlin/src/HAL/LINUX/include/pinmapping.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h index c881d5dbdad9..154e95aec262 100644 --- a/Marlin/src/HAL/LINUX/include/serial.h +++ b/Marlin/src/HAL/LINUX/include/serial.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp index 1217da390585..4eeef318e7e7 100644 --- a/Marlin/src/HAL/LINUX/main.cpp +++ b/Marlin/src/HAL/LINUX/main.cpp @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/pinsDebug.h b/Marlin/src/HAL/LINUX/pinsDebug.h index e373d3706784..a93ceddc61c3 100644 --- a/Marlin/src/HAL/LINUX/pinsDebug.h +++ b/Marlin/src/HAL/LINUX/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LINUX/servo_private.h b/Marlin/src/HAL/LINUX/servo_private.h index d576ff9266bd..122cfef3ea21 100644 --- a/Marlin/src/HAL/LINUX/servo_private.h +++ b/Marlin/src/HAL/LINUX/servo_private.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/spi_pins.h b/Marlin/src/HAL/LINUX/spi_pins.h index 0020e8cb7922..a444196f04bb 100644 --- a/Marlin/src/HAL/LINUX/spi_pins.h +++ b/Marlin/src/HAL/LINUX/spi_pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/timers.cpp b/Marlin/src/HAL/LINUX/timers.cpp index 83797bb64415..66d80f25185a 100644 --- a/Marlin/src/HAL/LINUX/timers.cpp +++ b/Marlin/src/HAL/LINUX/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/timers.h b/Marlin/src/HAL/LINUX/timers.h index bb7821aa3981..1beaea95abc6 100644 --- a/Marlin/src/HAL/LINUX/timers.h +++ b/Marlin/src/HAL/LINUX/timers.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LINUX/watchdog.cpp b/Marlin/src/HAL/LINUX/watchdog.cpp index 03af3cae7be9..c15b0e311c56 100644 --- a/Marlin/src/HAL/LINUX/watchdog.cpp +++ b/Marlin/src/HAL/LINUX/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/watchdog.h b/Marlin/src/HAL/LINUX/watchdog.h index 4771426a0bc3..472624cc7845 100644 --- a/Marlin/src/HAL/LINUX/watchdog.h +++ b/Marlin/src/HAL/LINUX/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp b/Marlin/src/HAL/LPC1768/DebugMonitor.cpp index 5df527bdb399..783b10cfac16 100644 --- a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp +++ b/Marlin/src/HAL/LPC1768/DebugMonitor.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index 5a7e55eb101a..939f1e8a9408 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 0f9f227bba21..0153bacf42dd 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index a34037fde590..e34a102012a1 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index 370aafdd9b6c..c3fb3bd0e4d2 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h index d9c6302072b7..98ce73d377a6 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.h +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/Servo.h b/Marlin/src/HAL/LPC1768/Servo.h index 61400c1f03f3..e953cb920475 100644 --- a/Marlin/src/HAL/LPC1768/Servo.h +++ b/Marlin/src/HAL/LPC1768/Servo.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp index 759b01b36560..255848637520 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp index 92a9d6f0c0b3..9f2475f490ef 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp index 6daedc50e089..16c15eaf0063 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/endstop_interrupts.h b/Marlin/src/HAL/LPC1768/endstop_interrupts.h index 4c4e9bd3f07d..b0d0c0ec5c0a 100644 --- a/Marlin/src/HAL/LPC1768/endstop_interrupts.h +++ b/Marlin/src/HAL/LPC1768/endstop_interrupts.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/fast_pwm.cpp b/Marlin/src/HAL/LPC1768/fast_pwm.cpp index b2f989bd50e1..46507ac0dabc 100644 --- a/Marlin/src/HAL/LPC1768/fast_pwm.cpp +++ b/Marlin/src/HAL/LPC1768/fast_pwm.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/fastio.h b/Marlin/src/HAL/LPC1768/fastio.h index 8e8e66db7225..31cd8772d16d 100644 --- a/Marlin/src/HAL/LPC1768/fastio.h +++ b/Marlin/src/HAL/LPC1768/fastio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h index 9b76c2510214..ce6d3fdde27f 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 13f2567de14a..964538962ce5 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/include/SPI.h b/Marlin/src/HAL/LPC1768/include/SPI.h index 4e84c0efa5ca..4acd9e7022a9 100644 --- a/Marlin/src/HAL/LPC1768/include/SPI.h +++ b/Marlin/src/HAL/LPC1768/include/SPI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c index 1e53be5f6226..f442ab71c0bd 100644 --- a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c +++ b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h index 6e9ad6f179ee..9b6c62b052a3 100644 --- a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h +++ b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/include/i2c_util.c b/Marlin/src/HAL/LPC1768/include/i2c_util.c index b92f3f0453f7..e52fb7c4de92 100644 --- a/Marlin/src/HAL/LPC1768/include/i2c_util.c +++ b/Marlin/src/HAL/LPC1768/include/i2c_util.c @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/include/i2c_util.h b/Marlin/src/HAL/LPC1768/include/i2c_util.h index eae275e0f957..a57f68a4071f 100644 --- a/Marlin/src/HAL/LPC1768/include/i2c_util.h +++ b/Marlin/src/HAL/LPC1768/include/i2c_util.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index bce3fc3092aa..0b4045cb9927 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/pinsDebug.h b/Marlin/src/HAL/LPC1768/pinsDebug.h index 6cc824afa3aa..f80551604fa1 100644 --- a/Marlin/src/HAL/LPC1768/pinsDebug.h +++ b/Marlin/src/HAL/LPC1768/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/spi_pins.h b/Marlin/src/HAL/LPC1768/spi_pins.h index 8d9738abc059..2e6749bf5752 100644 --- a/Marlin/src/HAL/LPC1768/spi_pins.h +++ b/Marlin/src/HAL/LPC1768/spi_pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/timers.cpp b/Marlin/src/HAL/LPC1768/timers.cpp index 5a8f54a1d409..a7a40584dabc 100644 --- a/Marlin/src/HAL/LPC1768/timers.cpp +++ b/Marlin/src/HAL/LPC1768/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/timers.h b/Marlin/src/HAL/LPC1768/timers.h index e9def8131c89..23dc20e2eb4e 100644 --- a/Marlin/src/HAL/LPC1768/timers.h +++ b/Marlin/src/HAL/LPC1768/timers.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp index 6d643f5bf6ed..a48a820dc433 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h index 9de3e9327490..2d976c92d20d 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h index e7518d698a83..d2260037b6a7 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h b/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h index 0d9b8d3dcc0f..0b9e2b4fd055 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c index 67e78f36f056..466fc8020335 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h index 8a73b69ded59..d60d93daddbd 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp index c0105bc129f8..befc348fab49 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp index b99abb6867e9..f03be9ab34dc 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp index 5f3da457aa88..1500c22a0d52 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp index a1f8097e5251..10d84941625f 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp index 6eac5daf244e..4f52f7dd0129 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/LPC1768/usb_serial.cpp b/Marlin/src/HAL/LPC1768/usb_serial.cpp index 3438f50c30ca..63a570efdfa8 100644 --- a/Marlin/src/HAL/LPC1768/usb_serial.cpp +++ b/Marlin/src/HAL/LPC1768/usb_serial.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/watchdog.cpp b/Marlin/src/HAL/LPC1768/watchdog.cpp index 75d386d92322..3cd22d665168 100644 --- a/Marlin/src/HAL/LPC1768/watchdog.cpp +++ b/Marlin/src/HAL/LPC1768/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/watchdog.h b/Marlin/src/HAL/LPC1768/watchdog.h index e9e25e4f2af8..cc170881f375 100644 --- a/Marlin/src/HAL/LPC1768/watchdog.h +++ b/Marlin/src/HAL/LPC1768/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 8b3982517115..9f24d30071a6 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index e3867eb4e9ad..ea0f694cdc02 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp index 83226daa481b..c3acd38237c6 100644 --- a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp +++ b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp index eeaf2e8a1a56..abc5f3acbf77 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ADAFRUIT_GRAND_CENTRAL_M4 diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h index a9eb0470a24f..f3821d8d5a84 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp index 76a332970731..161c04084f36 100644 --- a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp +++ b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/SAMD51/SAMD51.h b/Marlin/src/HAL/SAMD51/SAMD51.h index ef84a2082019..783956140d58 100644 --- a/Marlin/src/HAL/SAMD51/SAMD51.h +++ b/Marlin/src/HAL/SAMD51/SAMD51.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/Servo.cpp b/Marlin/src/HAL/SAMD51/Servo.cpp index 37511dc70465..9bab8e89be23 100644 --- a/Marlin/src/HAL/SAMD51/Servo.cpp +++ b/Marlin/src/HAL/SAMD51/Servo.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/SAMD51/ServoTimers.h b/Marlin/src/HAL/SAMD51/ServoTimers.h index 3572c608d26d..948d515356fb 100644 --- a/Marlin/src/HAL/SAMD51/ServoTimers.h +++ b/Marlin/src/HAL/SAMD51/ServoTimers.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/eeprom_flash.cpp b/Marlin/src/HAL/SAMD51/eeprom_flash.cpp index c8a1718285f6..429ef1c2d4f7 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_flash.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_flash.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp index c6aa383f9f40..b403f7939fb9 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp index 22210dc49eb9..3283195897b0 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/endstop_interrupts.h b/Marlin/src/HAL/SAMD51/endstop_interrupts.h index 4c8f441ce22f..03c24694536a 100644 --- a/Marlin/src/HAL/SAMD51/endstop_interrupts.h +++ b/Marlin/src/HAL/SAMD51/endstop_interrupts.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/fastio.h b/Marlin/src/HAL/SAMD51/fastio.h index d3b3dc1f63c5..c456dfce30cb 100644 --- a/Marlin/src/HAL/SAMD51/fastio.h +++ b/Marlin/src/HAL/SAMD51/fastio.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h index 9b76c2510214..ce6d3fdde27f 100644 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h index d695db6e173b..ee04e2e2e0c7 100644 --- a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h +++ b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/SAMD51/pinsDebug.h b/Marlin/src/HAL/SAMD51/pinsDebug.h index 15b647338261..c28937d6c6d6 100644 --- a/Marlin/src/HAL/SAMD51/pinsDebug.h +++ b/Marlin/src/HAL/SAMD51/pinsDebug.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/spi_pins.h b/Marlin/src/HAL/SAMD51/spi_pins.h index 049aacb57a94..5a9b1275ef88 100644 --- a/Marlin/src/HAL/SAMD51/spi_pins.h +++ b/Marlin/src/HAL/SAMD51/spi_pins.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/timers.cpp b/Marlin/src/HAL/SAMD51/timers.cpp index 3b73f196f7a7..a68af2e074ae 100644 --- a/Marlin/src/HAL/SAMD51/timers.cpp +++ b/Marlin/src/HAL/SAMD51/timers.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/timers.h b/Marlin/src/HAL/SAMD51/timers.h index 40ad910cb896..dc6e38b7307c 100644 --- a/Marlin/src/HAL/SAMD51/timers.h +++ b/Marlin/src/HAL/SAMD51/timers.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/SAMD51/watchdog.cpp b/Marlin/src/HAL/SAMD51/watchdog.cpp index f8dd5c4fb87b..ebc8dffe1300 100644 --- a/Marlin/src/HAL/SAMD51/watchdog.cpp +++ b/Marlin/src/HAL/SAMD51/watchdog.cpp @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/watchdog.h b/Marlin/src/HAL/SAMD51/watchdog.h index aa8ef3537112..2cd4788229b0 100644 --- a/Marlin/src/HAL/SAMD51/watchdog.h +++ b/Marlin/src/HAL/SAMD51/watchdog.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index 1430182fc366..8a619bfb5071 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 2f37a5ec7309..730ada96c197 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp index 7b37fff9c249..202442a71b00 100644 --- a/Marlin/src/HAL/STM32/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index 65ef91e31db6..8d99ab78558e 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h index d971ff704b09..5ab97ff3a993 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index 90d61083037b..bab77b55daf1 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32/Servo.cpp b/Marlin/src/HAL/STM32/Servo.cpp index 0a79d474d44a..1cf117a05694 100644 --- a/Marlin/src/HAL/STM32/Servo.cpp +++ b/Marlin/src/HAL/STM32/Servo.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/Servo.h b/Marlin/src/HAL/STM32/Servo.h index 534cb97e39f7..1527e753b661 100644 --- a/Marlin/src/HAL/STM32/Servo.h +++ b/Marlin/src/HAL/STM32/Servo.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/SoftwareSerial.cpp b/Marlin/src/HAL/STM32/SoftwareSerial.cpp index e77ad7c52df1..af92548cbb64 100644 --- a/Marlin/src/HAL/STM32/SoftwareSerial.cpp +++ b/Marlin/src/HAL/STM32/SoftwareSerial.cpp @@ -3,14 +3,14 @@ * * Multi-instance software serial library for Arduino/Wiring * -- Interrupt-driven receive and other improvements by ladyada - * (http://ladyada.net) + * (https://ladyada.net) * -- Tuning, circular buffer, derivation from class Print/Stream, * multi-instance support, porting to 8MHz processors, * various optimizations, PROGMEM delay tables, inverse logic and * direct port writing by Mikal Hart (http://www.arduiniana.org) - * -- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) + * -- Pin change interrupt macros by Paul Stoffregen (https://www.pjrc.com) * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) - * -- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) + * -- ATmega1280/2560 support by Brett Hagman (https://www.roguerobotics.com/) * -- STM32 support by Armin van der Togt * * This library is free software; you can redistribute it and/or diff --git a/Marlin/src/HAL/STM32/SoftwareSerial.h b/Marlin/src/HAL/STM32/SoftwareSerial.h index 504bd6979b2c..1a4f742c32fa 100644 --- a/Marlin/src/HAL/STM32/SoftwareSerial.h +++ b/Marlin/src/HAL/STM32/SoftwareSerial.h @@ -3,14 +3,14 @@ * * Multi-instance software serial library for Arduino/Wiring * -- Interrupt-driven receive and other improvements by ladyada - * (http://ladyada.net) + * (https://ladyada.net) * -- Tuning, circular buffer, derivation from class Print/Stream, * multi-instance support, porting to 8MHz processors, * various optimizations, PROGMEM delay tables, inverse logic and * direct port writing by Mikal Hart (http://www.arduiniana.org) - * -- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) + * -- Pin change interrupt macros by Paul Stoffregen (https://www.pjrc.com) * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) - * -- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) + * -- ATmega1280/2560 support by Brett Hagman (https://www.roguerobotics.com/) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index 57713593c8fa..0933b9f4e8cb 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp index 2fcf5ec3d98b..711a83ed5b6a 100644 --- a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32/eeprom_sram.cpp b/Marlin/src/HAL/STM32/eeprom_sram.cpp index 640631428783..5f6f26f9c61b 100644 --- a/Marlin/src/HAL/STM32/eeprom_sram.cpp +++ b/Marlin/src/HAL/STM32/eeprom_sram.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/eeprom_wired.cpp b/Marlin/src/HAL/STM32/eeprom_wired.cpp index 7fe1116d614d..8c46e45f0324 100644 --- a/Marlin/src/HAL/STM32/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32/eeprom_wired.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/endstop_interrupts.h b/Marlin/src/HAL/STM32/endstop_interrupts.h index 1a8bf1e03151..fdff8cc644cd 100644 --- a/Marlin/src/HAL/STM32/endstop_interrupts.h +++ b/Marlin/src/HAL/STM32/endstop_interrupts.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/fastio.cpp b/Marlin/src/HAL/STM32/fastio.cpp index c51effaa0430..0d55579d8886 100644 --- a/Marlin/src/HAL/STM32/fastio.cpp +++ b/Marlin/src/HAL/STM32/fastio.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h index 030b369ede32..38a2e28cfb3b 100644 --- a/Marlin/src/HAL/STM32/fastio.h +++ b/Marlin/src/HAL/STM32/fastio.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_post.h b/Marlin/src/HAL/STM32/inc/Conditionals_post.h index efe4d72a6f18..18826e11d24a 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_post.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 4d563d506b80..37ca3d5a30ab 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h index 8c5d1ec2b61e..ec08e3fd753f 100644 --- a/Marlin/src/HAL/STM32/pinsDebug.h +++ b/Marlin/src/HAL/STM32/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h b/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h index e3d28aed070c..5ff40debea5e 100644 --- a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h +++ b/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h b/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h index 58b8c32cc76c..09f2bb54e66a 100644 --- a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h +++ b/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/pins_Xref.h b/Marlin/src/HAL/STM32/pins_Xref.h index 7e88ec76ba4b..890e561860e2 100644 --- a/Marlin/src/HAL/STM32/pins_Xref.h +++ b/Marlin/src/HAL/STM32/pins_Xref.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32/spi_pins.h b/Marlin/src/HAL/STM32/spi_pins.h index 8f46ca12c5fd..176e2a7b2063 100644 --- a/Marlin/src/HAL/STM32/spi_pins.h +++ b/Marlin/src/HAL/STM32/spi_pins.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index e98a6a556093..11967314480f 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/timers.h b/Marlin/src/HAL/STM32/timers.h index 23a379973c5e..000f86043bb3 100644 --- a/Marlin/src/HAL/STM32/timers.h +++ b/Marlin/src/HAL/STM32/timers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/usb_serial.cpp b/Marlin/src/HAL/STM32/usb_serial.cpp index 86c164cb937d..2dd1bef12c43 100644 --- a/Marlin/src/HAL/STM32/usb_serial.cpp +++ b/Marlin/src/HAL/STM32/usb_serial.cpp @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32/usb_serial.h b/Marlin/src/HAL/STM32/usb_serial.h index 4243683479f4..ca61b9ed239f 100644 --- a/Marlin/src/HAL/STM32/usb_serial.h +++ b/Marlin/src/HAL/STM32/usb_serial.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32/watchdog.cpp b/Marlin/src/HAL/STM32/watchdog.cpp index 3416a353f6e1..37e5638b05c0 100644 --- a/Marlin/src/HAL/STM32/watchdog.cpp +++ b/Marlin/src/HAL/STM32/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) diff --git a/Marlin/src/HAL/STM32/watchdog.h b/Marlin/src/HAL/STM32/watchdog.h index efa7d2b3d038..49a0d9c631d8 100644 --- a/Marlin/src/HAL/STM32/watchdog.h +++ b/Marlin/src/HAL/STM32/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index ff9855a5a5cd..d7f9264be6c9 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 6550fbe22415..5a0b0460092b 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp index bfbdf6af40fd..4d72473e7f8e 100644 --- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32F1/Servo.cpp b/Marlin/src/HAL/STM32F1/Servo.cpp index bda7ea1aa702..e1ee83149374 100644 --- a/Marlin/src/HAL/STM32F1/Servo.cpp +++ b/Marlin/src/HAL/STM32F1/Servo.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/Servo.h b/Marlin/src/HAL/STM32F1/Servo.h index b3ca09f23808..b6143de81d62 100644 --- a/Marlin/src/HAL/STM32F1/Servo.h +++ b/Marlin/src/HAL/STM32F1/Servo.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp index e9e4a162a59b..3641c9fdf037 100644 --- a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp +++ b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(__STM32F1__) && !defined(HAVE_SW_SERIAL) diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.h b/Marlin/src/HAL/STM32F1/SoftwareSerial.h index 1899a2ae0b93..1c8058665a47 100644 --- a/Marlin/src/HAL/STM32F1/SoftwareSerial.h +++ b/Marlin/src/HAL/STM32F1/SoftwareSerial.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp index d61723e269eb..0f3887d29afb 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp index 072b5a51a3cd..894abb882a64 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp index 57a2bc5bedb0..8db8c8638bb8 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp index 0ca6900fa656..11959191f6dd 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp index b5c658a9e1b8..e495fd8ecf53 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -14,7 +14,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/endstop_interrupts.h b/Marlin/src/HAL/STM32F1/endstop_interrupts.h index a4fc208fe055..bcb07d991d75 100644 --- a/Marlin/src/HAL/STM32F1/endstop_interrupts.h +++ b/Marlin/src/HAL/STM32F1/endstop_interrupts.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/fastio.h b/Marlin/src/HAL/STM32F1/fastio.h index 9bf78d4254b0..e0e2e03a1c47 100644 --- a/Marlin/src/HAL/STM32F1/fastio.h +++ b/Marlin/src/HAL/STM32F1/fastio.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index 4e3b8903ddc6..f52e6fec2b1e 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h index be011af35ebe..5fd916624191 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index 0e6e273d6c85..47f4f59b219b 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index aca0268440e0..ab5530174e3b 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -10,7 +10,7 @@ * (at your option) any later version. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef USE_USB_COMPOSITE diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h index 125ba3646634..8715888f474c 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.h +++ b/Marlin/src/HAL/STM32F1/msc_sd.h @@ -10,7 +10,7 @@ * (at your option) any later version. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/pinsDebug.h b/Marlin/src/HAL/STM32F1/pinsDebug.h index 913cb62afcfd..2d63ebd770f0 100644 --- a/Marlin/src/HAL/STM32F1/pinsDebug.h +++ b/Marlin/src/HAL/STM32F1/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp index 3aec7cf48590..0e8a74581015 100644 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef ARDUINO_ARCH_STM32F1 diff --git a/Marlin/src/HAL/STM32F1/sdio.h b/Marlin/src/HAL/STM32F1/sdio.h index 81b0cfd5fd3a..8777299f01bc 100644 --- a/Marlin/src/HAL/STM32F1/sdio.h +++ b/Marlin/src/HAL/STM32F1/sdio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/spi_pins.h b/Marlin/src/HAL/STM32F1/spi_pins.h index e8e4cbba1167..8f2b324f6457 100644 --- a/Marlin/src/HAL/STM32F1/spi_pins.h +++ b/Marlin/src/HAL/STM32F1/spi_pins.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/timers.cpp b/Marlin/src/HAL/STM32F1/timers.cpp index bb466cc16fc1..8c2df1e216e7 100644 --- a/Marlin/src/HAL/STM32F1/timers.cpp +++ b/Marlin/src/HAL/STM32F1/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32F1/timers.h b/Marlin/src/HAL/STM32F1/timers.h index 658a4369884d..6f360f6bfc39 100644 --- a/Marlin/src/HAL/STM32F1/timers.h +++ b/Marlin/src/HAL/STM32F1/timers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32F1/watchdog.cpp b/Marlin/src/HAL/STM32F1/watchdog.cpp index 9556d1fa66e8..4123bc3ef0ff 100644 --- a/Marlin/src/HAL/STM32F1/watchdog.cpp +++ b/Marlin/src/HAL/STM32F1/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/STM32F1/watchdog.h b/Marlin/src/HAL/STM32F1/watchdog.h index 7218b1a72022..7185d6977521 100644 --- a/Marlin/src/HAL/STM32F1/watchdog.h +++ b/Marlin/src/HAL/STM32F1/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL.cpp index 52fa4f8762f4..b4629d2afd12 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/HAL.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.h b/Marlin/src/HAL/STM32_F4_F7/HAL.h index 07e56b24b43c..5601400c5ac9 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.h +++ b/Marlin/src/HAL/STM32_F4_F7/HAL.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp index 673ab3372bd5..6fe81819ab85 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp index efbb8c73e30f..dc41f891318d 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(STM32GENERIC) && defined(STM32F4) diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h index c16963e2648a..a4a7ad82cca9 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp index b9ba497ab193..f7ded7454dd9 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(STM32GENERIC) && defined(STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h index 6c5e70cde637..d2f78259d68d 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/Servo.cpp b/Marlin/src/HAL/STM32_F4_F7/Servo.cpp index c391282f6a56..7185468f50a8 100644 --- a/Marlin/src/HAL/STM32_F4_F7/Servo.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/Servo.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) diff --git a/Marlin/src/HAL/STM32_F4_F7/Servo.h b/Marlin/src/HAL/STM32_F4_F7/Servo.h index 076a547bb202..e42cc6084091 100644 --- a/Marlin/src/HAL/STM32_F4_F7/Servo.h +++ b/Marlin/src/HAL/STM32_F4_F7/Servo.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp index 48c0b770324b..9a0791e437a7 100644 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp index b362503a6b1d..f3df536cb2f3 100644 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) diff --git a/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h b/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h index 1a8bf1e03151..fdff8cc644cd 100644 --- a/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h +++ b/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/fastio.h b/Marlin/src/HAL/STM32_F4_F7/fastio.h index ee64ca833d2e..f42be5835433 100644 --- a/Marlin/src/HAL/STM32_F4_F7/fastio.h +++ b/Marlin/src/HAL/STM32_F4_F7/fastio.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h index d21624955ec4..b5d808e21acc 100644 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h +++ b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h index e04258fa078a..53b15ba1909a 100644 --- a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h b/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h index 208a3524f700..973abb1b0185 100644 --- a/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h +++ b/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/spi_pins.h b/Marlin/src/HAL/STM32_F4_F7/spi_pins.h index f120e7178b8b..75a6a2b250f6 100644 --- a/Marlin/src/HAL/STM32_F4_F7/spi_pins.h +++ b/Marlin/src/HAL/STM32_F4_F7/spi_pins.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/timers.h b/Marlin/src/HAL/STM32_F4_F7/timers.h index 632c05a5ade8..4e8c81783e59 100644 --- a/Marlin/src/HAL/STM32_F4_F7/timers.h +++ b/Marlin/src/HAL/STM32_F4_F7/timers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp b/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp index 538aea55b9d9..cb12ec7aac3c 100644 --- a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.h b/Marlin/src/HAL/STM32_F4_F7/watchdog.h index ece6ef0162fa..3dbc2d08c139 100644 --- a/Marlin/src/HAL/STM32_F4_F7/watchdog.h +++ b/Marlin/src/HAL/STM32_F4_F7/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index f226a4a90ebe..d276a4c88084 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 3356ec2dffff..890930f7f8be 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp index 83d4d00bf265..cdb3f4701c03 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/Servo.cpp b/Marlin/src/HAL/TEENSY31_32/Servo.cpp index ccff161f47c5..544892cb7de4 100644 --- a/Marlin/src/HAL/TEENSY31_32/Servo.cpp +++ b/Marlin/src/HAL/TEENSY31_32/Servo.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/Servo.h b/Marlin/src/HAL/TEENSY31_32/Servo.h index 9243291e43b3..82b601d956be 100644 --- a/Marlin/src/HAL/TEENSY31_32/Servo.h +++ b/Marlin/src/HAL/TEENSY31_32/Servo.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp index d4ccfe82bbb6..12be9ff72c17 100644 --- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h b/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h index 759fefae290c..999ada512761 100644 --- a/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h +++ b/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/fastio.h b/Marlin/src/HAL/TEENSY31_32/fastio.h index e74920d49334..c564a718357b 100644 --- a/Marlin/src/HAL/TEENSY31_32/fastio.h +++ b/Marlin/src/HAL/TEENSY31_32/fastio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h index fb93947fd275..998f1dcc0d73 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h index 92688685966e..0b731a61d3b6 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/spi_pins.h b/Marlin/src/HAL/TEENSY31_32/spi_pins.h index 79230f3d4403..5754fbfeed11 100644 --- a/Marlin/src/HAL/TEENSY31_32/spi_pins.h +++ b/Marlin/src/HAL/TEENSY31_32/spi_pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/timers.cpp b/Marlin/src/HAL/TEENSY31_32/timers.cpp index b09f8fa6f9ac..bf756af8a128 100644 --- a/Marlin/src/HAL/TEENSY31_32/timers.cpp +++ b/Marlin/src/HAL/TEENSY31_32/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/TEENSY31_32/timers.h b/Marlin/src/HAL/TEENSY31_32/timers.h index 53e6e00ebace..4f004ef75191 100644 --- a/Marlin/src/HAL/TEENSY31_32/timers.h +++ b/Marlin/src/HAL/TEENSY31_32/timers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/watchdog.cpp b/Marlin/src/HAL/TEENSY31_32/watchdog.cpp index 26f722896ce6..9f7b70d9f961 100644 --- a/Marlin/src/HAL/TEENSY31_32/watchdog.cpp +++ b/Marlin/src/HAL/TEENSY31_32/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #ifdef __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/watchdog.h b/Marlin/src/HAL/TEENSY31_32/watchdog.h index cb881f859501..b8b46a403013 100644 --- a/Marlin/src/HAL/TEENSY31_32/watchdog.h +++ b/Marlin/src/HAL/TEENSY31_32/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index 86ba40870f71..bcbee1d4c5ff 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 1d912e3f60e3..5442ae2d3b5f 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp index b35533aa9435..0b1ae4afa45c 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.cpp b/Marlin/src/HAL/TEENSY35_36/Servo.cpp index a9cda868bab7..d1390187a71e 100644 --- a/Marlin/src/HAL/TEENSY35_36/Servo.cpp +++ b/Marlin/src/HAL/TEENSY35_36/Servo.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.h b/Marlin/src/HAL/TEENSY35_36/Servo.h index 4962105d79af..ae904f0e2e62 100644 --- a/Marlin/src/HAL/TEENSY35_36/Servo.h +++ b/Marlin/src/HAL/TEENSY35_36/Servo.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp index d7cc8654baea..de67ef9e1d73 100644 --- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) diff --git a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h index 4a219470ec7e..92e22efc0fe6 100644 --- a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h +++ b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/fastio.h b/Marlin/src/HAL/TEENSY35_36/fastio.h index e74920d49334..c564a718357b 100644 --- a/Marlin/src/HAL/TEENSY35_36/fastio.h +++ b/Marlin/src/HAL/TEENSY35_36/fastio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h index 0285c52ee365..5f1c4b16019d 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h index fb93947fd275..998f1dcc0d73 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h index f42bd63b1781..36b8018085c4 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h index 61a54f15ed35..e57c73c59558 100644 --- a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h +++ b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/spi_pins.h b/Marlin/src/HAL/TEENSY35_36/spi_pins.h index b29a9346a1dc..276d4f456a7f 100644 --- a/Marlin/src/HAL/TEENSY35_36/spi_pins.h +++ b/Marlin/src/HAL/TEENSY35_36/spi_pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/timers.cpp b/Marlin/src/HAL/TEENSY35_36/timers.cpp index 009d06223d98..5725e83a85da 100644 --- a/Marlin/src/HAL/TEENSY35_36/timers.cpp +++ b/Marlin/src/HAL/TEENSY35_36/timers.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/TEENSY35_36/timers.h b/Marlin/src/HAL/TEENSY35_36/timers.h index f2f95586751a..68060d0e1c06 100644 --- a/Marlin/src/HAL/TEENSY35_36/timers.h +++ b/Marlin/src/HAL/TEENSY35_36/timers.h @@ -15,7 +15,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ #pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/watchdog.cpp b/Marlin/src/HAL/TEENSY35_36/watchdog.cpp index 5a9d4816f59e..e735ee79238f 100644 --- a/Marlin/src/HAL/TEENSY35_36/watchdog.cpp +++ b/Marlin/src/HAL/TEENSY35_36/watchdog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) diff --git a/Marlin/src/HAL/TEENSY35_36/watchdog.h b/Marlin/src/HAL/TEENSY35_36/watchdog.h index ec3f18f09452..981b1f0bd20b 100644 --- a/Marlin/src/HAL/TEENSY35_36/watchdog.h +++ b/Marlin/src/HAL/TEENSY35_36/watchdog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h index cc462f37c5bd..d4cec6426774 100644 --- a/Marlin/src/HAL/platforms.h +++ b/Marlin/src/HAL/platforms.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h index 5cb68b150349..d98e96084850 100644 --- a/Marlin/src/HAL/shared/Delay.h +++ b/Marlin/src/HAL/shared/Delay.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -36,7 +36,7 @@ #if __CORTEX_M == 7 // Cortex-M3 through M7 can use the cycle counter of the DWT unit - // http://www.anthonyvh.com/2017/05/18/cortex_m-cycle_counter/ + // https://www.anthonyvh.com/2017/05/18/cortex_m-cycle_counter/ FORCE_INLINE static void enableCycleCounter() { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; diff --git a/Marlin/src/HAL/shared/HAL_SPI.h b/Marlin/src/HAL/shared/HAL_SPI.h index 0410d70c9361..59af5548064c 100644 --- a/Marlin/src/HAL/shared/HAL_SPI.h +++ b/Marlin/src/HAL/shared/HAL_SPI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/HAL_ST7920.h b/Marlin/src/HAL/shared/HAL_ST7920.h index d70f88c0320d..05e8a1f2c558 100644 --- a/Marlin/src/HAL/shared/HAL_ST7920.h +++ b/Marlin/src/HAL/shared/HAL_ST7920.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/HAL_spi_L6470.cpp b/Marlin/src/HAL/shared/HAL_spi_L6470.cpp index 46e7b71f88d7..bd85dbe7bd7e 100644 --- a/Marlin/src/HAL/shared/HAL_spi_L6470.cpp +++ b/Marlin/src/HAL/shared/HAL_spi_L6470.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/shared/Marduino.h b/Marlin/src/HAL/shared/Marduino.h index c022fc72edd6..3003f3cc2891 100644 --- a/Marlin/src/HAL/shared/Marduino.h +++ b/Marlin/src/HAL/shared/Marduino.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index b41404f4d06f..6cf5e055e151 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #if defined(__arm__) || defined(__thumb__) diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.h b/Marlin/src/HAL/shared/backtrace/backtrace.h index 636eb09a7137..fccadedaa543 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.h +++ b/Marlin/src/HAL/shared/backtrace/backtrace.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/eeprom_api.cpp b/Marlin/src/HAL/shared/eeprom_api.cpp index d8839e3d9d32..47cfa5a2dbe0 100644 --- a/Marlin/src/HAL/shared/eeprom_api.cpp +++ b/Marlin/src/HAL/shared/eeprom_api.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/HAL/shared/eeprom_api.h b/Marlin/src/HAL/shared/eeprom_api.h index d7bee8a5f3da..b97267484e62 100644 --- a/Marlin/src/HAL/shared/eeprom_api.h +++ b/Marlin/src/HAL/shared/eeprom_api.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/eeprom_if.h b/Marlin/src/HAL/shared/eeprom_if.h index bf690f9a88b4..e44da801dfbf 100644 --- a/Marlin/src/HAL/shared/eeprom_if.h +++ b/Marlin/src/HAL/shared/eeprom_if.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index d6f1bad85fe9..cc22bf7d986f 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/shared/eeprom_if_spi.cpp b/Marlin/src/HAL/shared/eeprom_if_spi.cpp index 88dbf97b5dc8..a341fef9de97 100644 --- a/Marlin/src/HAL/shared/eeprom_if_spi.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_spi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/shared/esp_wifi.cpp b/Marlin/src/HAL/shared/esp_wifi.cpp index 5f38ff312835..a55f5ca39f91 100644 --- a/Marlin/src/HAL/shared/esp_wifi.cpp +++ b/Marlin/src/HAL/shared/esp_wifi.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/shared/esp_wifi.h b/Marlin/src/HAL/shared/esp_wifi.h index e8aa50446bff..84a50a941dcb 100644 --- a/Marlin/src/HAL/shared/esp_wifi.h +++ b/Marlin/src/HAL/shared/esp_wifi.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/math_32bit.h b/Marlin/src/HAL/shared/math_32bit.h index d93ab9caf6a8..87e9e6406ee4 100644 --- a/Marlin/src/HAL/shared/math_32bit.h +++ b/Marlin/src/HAL/shared/math_32bit.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/servo.cpp b/Marlin/src/HAL/shared/servo.cpp index 923b7336b4b3..d69cf2fe2c8f 100644 --- a/Marlin/src/HAL/shared/servo.cpp +++ b/Marlin/src/HAL/shared/servo.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h index b582221b86ff..f9c478411852 100644 --- a/Marlin/src/HAL/shared/servo.h +++ b/Marlin/src/HAL/shared/servo.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/HAL/shared/servo_private.h b/Marlin/src/HAL/shared/servo_private.h index 58e455b1240c..d85d8da8ba43 100644 --- a/Marlin/src/HAL/shared/servo_private.h +++ b/Marlin/src/HAL/shared/servo_private.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 1a53a1ab71da..55c0bda4ac01 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index 254f1567aba2..81041c8ee62f 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 3f692c12147d..1077d494e480 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index 6a3b34f7ece4..6ae1b9d8bb97 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/core/debug_section.h b/Marlin/src/core/debug_section.h index 8181238890c8..7f39bc7424e7 100644 --- a/Marlin/src/core/debug_section.h +++ b/Marlin/src/core/debug_section.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h index 0936b7b499db..3a0e620923ad 100644 --- a/Marlin/src/core/drivers.h +++ b/Marlin/src/core/drivers.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 77e0b792c12c..5208b3e1bfb6 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -91,7 +91,7 @@ #define MACHINE_UUID DEFAULT_MACHINE_UUID #endif -#define MARLIN_WEBSITE_URL "http://marlinfw.org" +#define MARLIN_WEBSITE_URL "https://marlinfw.org" //#if !defined(STRING_SPLASH_LINE3) && defined(WEBSITE_URL) // #define STRING_SPLASH_LINE3 WEBSITE_URL diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 2f9273ec80ed..3bd273872aa7 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h index 35334120904e..5852c439a845 100644 --- a/Marlin/src/core/multi_language.h +++ b/Marlin/src/core/multi_language.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index dee452d954ac..77854d0f80a2 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 8b72e46a7580..fc830736a5a6 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index cd533ad269b1..a5b78caabbe4 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index e64d6fb5e6d3..295657fa64f3 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index 0c2e91d31fca..0481ffc02a2e 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp index 7e621a4dc8d1..41d0a9cb1e91 100644 --- a/Marlin/src/feature/babystep.cpp +++ b/Marlin/src/feature/babystep.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/babystep.h b/Marlin/src/feature/babystep.h index a10655d45b5a..f85e5909cad4 100644 --- a/Marlin/src/feature/babystep.h +++ b/Marlin/src/feature/babystep.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp index bc33ae31853a..867e9cdd217c 100644 --- a/Marlin/src/feature/backlash.cpp +++ b/Marlin/src/feature/backlash.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h index bbf4903e8fa1..8d00570f991e 100644 --- a/Marlin/src/feature/backlash.h +++ b/Marlin/src/feature/backlash.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/baricuda.cpp b/Marlin/src/feature/baricuda.cpp index 3899348548fb..596891707e92 100644 --- a/Marlin/src/feature/baricuda.cpp +++ b/Marlin/src/feature/baricuda.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/baricuda.h b/Marlin/src/feature/baricuda.h index 567d2253e635..f28d07d6427f 100644 --- a/Marlin/src/feature/baricuda.h +++ b/Marlin/src/feature/baricuda.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index 0ee35fd61c23..a585c1e1553d 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/bedlevel/abl/abl.h b/Marlin/src/feature/bedlevel/abl/abl.h index 312dc0db80ef..bbe2411dc346 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.h +++ b/Marlin/src/feature/bedlevel/abl/abl.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 2d598a545cbc..3e9225b7f932 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index fd3ed82e5287..995e9d0dbcef 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index 7439c3fcd3e9..1200c2a1b3b8 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index 3a1cbaccb0f5..ade7a931401a 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index a93f5218d3dd..63b44823448b 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 3455416a6265..9ac9de180638 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 7981600d0a3f..f8219ac7e7d7 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 536410824069..63559e0bb88e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../inc/MarlinConfig.h" diff --git a/Marlin/src/feature/binary_protocol.cpp b/Marlin/src/feature/binary_protocol.cpp index e555c0c46329..5884a05f427e 100644 --- a/Marlin/src/feature/binary_protocol.cpp +++ b/Marlin/src/feature/binary_protocol.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/binary_protocol.h b/Marlin/src/feature/binary_protocol.h index e9a723c1eb7f..10dea10d47bb 100644 --- a/Marlin/src/feature/binary_protocol.h +++ b/Marlin/src/feature/binary_protocol.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp index 58b799c70fcf..d6b1f99c16b9 100644 --- a/Marlin/src/feature/bltouch.cpp +++ b/Marlin/src/feature/bltouch.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h index 797cc7df876a..40685af1b357 100644 --- a/Marlin/src/feature/bltouch.h +++ b/Marlin/src/feature/bltouch.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index e2ee6452151d..7eb471543534 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfig.h" diff --git a/Marlin/src/feature/cancel_object.h b/Marlin/src/feature/cancel_object.h index 41bbfb70fcfc..1d2d77f20334 100644 --- a/Marlin/src/feature/cancel_object.h +++ b/Marlin/src/feature/cancel_object.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index a135cac418d2..4287a0f26242 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index de77f0696b57..ff01b1a67da3 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/closedloop.cpp b/Marlin/src/feature/closedloop.cpp index 5d302683a17b..8a97f0c0cd7b 100644 --- a/Marlin/src/feature/closedloop.cpp +++ b/Marlin/src/feature/closedloop.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfig.h" diff --git a/Marlin/src/feature/closedloop.h b/Marlin/src/feature/closedloop.h index 75c7109ce620..e03400c35c7b 100644 --- a/Marlin/src/feature/closedloop.h +++ b/Marlin/src/feature/closedloop.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index c329acf697b6..c9a2dad03dbf 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/controllerfan.h b/Marlin/src/feature/controllerfan.h index 9c544ca1c924..d1d39f21f3f2 100644 --- a/Marlin/src/feature/controllerfan.h +++ b/Marlin/src/feature/controllerfan.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/dac/dac_dac084s085.h b/Marlin/src/feature/dac/dac_dac084s085.h index cccc9cbd4545..5be0129fc9e9 100644 --- a/Marlin/src/feature/dac/dac_dac084s085.h +++ b/Marlin/src/feature/dac/dac_dac084s085.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index 2440bcf3fd59..90ad31290f33 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,7 +27,7 @@ * http://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf * * For discussion and feedback, please go to: - * http://arduino.cc/forum/index.php/topic,51842.0.html + * https://arduino.cc/forum/index.php/topic,51842.0.html */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/feature/dac/dac_mcp4728.h b/Marlin/src/feature/dac/dac_mcp4728.h index 8e8b25ca691a..6cce77856acd 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.h +++ b/Marlin/src/feature/dac/dac_mcp4728.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/dac/stepper_dac.cpp b/Marlin/src/feature/dac/stepper_dac.cpp index 15f35d91d77b..6b140a002510 100644 --- a/Marlin/src/feature/dac/stepper_dac.cpp +++ b/Marlin/src/feature/dac/stepper_dac.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/dac/stepper_dac.h b/Marlin/src/feature/dac/stepper_dac.h index 3e77d471a672..0543b6275e2c 100644 --- a/Marlin/src/feature/dac/stepper_dac.h +++ b/Marlin/src/feature/dac/stepper_dac.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/digipot/digipot.h b/Marlin/src/feature/digipot/digipot.h index b7c0b6503619..d59f8b930af5 100644 --- a/Marlin/src/feature/digipot/digipot.h +++ b/Marlin/src/feature/digipot/digipot.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/digipot/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp index 40481caacfd2..35c513a32c39 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4018.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index 87c6b679a0cb..0c8ff04a0bbf 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/direct_stepping.cpp b/Marlin/src/feature/direct_stepping.cpp index 76dfac7de55f..d3bdb43ab3cd 100644 --- a/Marlin/src/feature/direct_stepping.cpp +++ b/Marlin/src/feature/direct_stepping.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfigPre.h" diff --git a/Marlin/src/feature/direct_stepping.h b/Marlin/src/feature/direct_stepping.h index 4d12f83db766..dea2616508d2 100644 --- a/Marlin/src/feature/direct_stepping.h +++ b/Marlin/src/feature/direct_stepping.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/e_parser.cpp b/Marlin/src/feature/e_parser.cpp index e7d79bf745c1..85b1845a6451 100644 --- a/Marlin/src/feature/e_parser.cpp +++ b/Marlin/src/feature/e_parser.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index 41261402a10f..73e459680edf 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index d5a8f168db48..f67d50a6e038 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/encoder_i2c.h b/Marlin/src/feature/encoder_i2c.h index f404954cae53..511e560ba0ce 100644 --- a/Marlin/src/feature/encoder_i2c.h +++ b/Marlin/src/feature/encoder_i2c.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/fanmux.cpp b/Marlin/src/feature/fanmux.cpp index b90c72c64813..43952ca8ee6c 100644 --- a/Marlin/src/feature/fanmux.cpp +++ b/Marlin/src/feature/fanmux.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/fanmux.h b/Marlin/src/feature/fanmux.h index 2e5414447813..b1b0c67a55e0 100644 --- a/Marlin/src/feature/fanmux.h +++ b/Marlin/src/feature/fanmux.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/filwidth.cpp b/Marlin/src/feature/filwidth.cpp index 4357d39fe031..2bd9c789808e 100644 --- a/Marlin/src/feature/filwidth.cpp +++ b/Marlin/src/feature/filwidth.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/filwidth.h b/Marlin/src/feature/filwidth.h index 335a49b74f1e..ef3859df719a 100644 --- a/Marlin/src/feature/filwidth.h +++ b/Marlin/src/feature/filwidth.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index e1be10d13b16..c0e4db0a455f 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h index e08f8f03af22..3d6873642911 100644 --- a/Marlin/src/feature/fwretract.h +++ b/Marlin/src/feature/fwretract.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index 86a2bcf1a6b6..9539c82b6454 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/host_actions.h b/Marlin/src/feature/host_actions.h index 81ef8227aebc..a6ad2c048505 100644 --- a/Marlin/src/feature/host_actions.h +++ b/Marlin/src/feature/host_actions.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp index 0c8a40e1ebd6..9d5594c2f184 100644 --- a/Marlin/src/feature/hotend_idle.cpp +++ b/Marlin/src/feature/hotend_idle.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/hotend_idle.h b/Marlin/src/feature/hotend_idle.h index 73de51c2dd0f..40f557d5ed4c 100644 --- a/Marlin/src/feature/hotend_idle.h +++ b/Marlin/src/feature/hotend_idle.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/joystick.cpp b/Marlin/src/feature/joystick.cpp index 586b93b8ba71..d9c5ae7c1b1c 100644 --- a/Marlin/src/feature/joystick.cpp +++ b/Marlin/src/feature/joystick.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h index e2a82763738a..ca46834578cc 100644 --- a/Marlin/src/feature/joystick.h +++ b/Marlin/src/feature/joystick.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/leds/blinkm.cpp b/Marlin/src/feature/leds/blinkm.cpp index 1c7ceeb669df..868eb4b3d916 100644 --- a/Marlin/src/feature/leds/blinkm.cpp +++ b/Marlin/src/feature/leds/blinkm.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/leds/blinkm.h b/Marlin/src/feature/leds/blinkm.h index c7c099d3a847..29a9e784120d 100644 --- a/Marlin/src/feature/leds/blinkm.h +++ b/Marlin/src/feature/leds/blinkm.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index 1cd7bc982171..eec0cde630da 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index 17bd77eb7f77..577c94752ffd 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 93e8348cfd1f..5d80cfe5d22a 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 631e4fa00447..17057498d4d5 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/leds/pca9533.cpp b/Marlin/src/feature/leds/pca9533.cpp index 82bdaf6665cf..bcc4bc50a474 100644 --- a/Marlin/src/feature/leds/pca9533.cpp +++ b/Marlin/src/feature/leds/pca9533.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/leds/pca9533.h b/Marlin/src/feature/leds/pca9533.h index fe299a754b46..899418ff232c 100644 --- a/Marlin/src/feature/leds/pca9533.h +++ b/Marlin/src/feature/leds/pca9533.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/leds/pca9632.cpp b/Marlin/src/feature/leds/pca9632.cpp index af9e39b863bf..df991ded36cc 100644 --- a/Marlin/src/feature/leds/pca9632.cpp +++ b/Marlin/src/feature/leds/pca9632.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/leds/pca9632.h b/Marlin/src/feature/leds/pca9632.h index 749230f6526f..34aceb31d6e3 100644 --- a/Marlin/src/feature/leds/pca9632.h +++ b/Marlin/src/feature/leds/pca9632.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index 64b154f55752..58084da83724 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index d2888705e7e0..0295f9f5ac92 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/leds/tempstat.cpp b/Marlin/src/feature/leds/tempstat.cpp index d3d23a62356f..880258f85245 100644 --- a/Marlin/src/feature/leds/tempstat.cpp +++ b/Marlin/src/feature/leds/tempstat.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/leds/tempstat.h b/Marlin/src/feature/leds/tempstat.h index fefe776cfd7e..a8b919bd8c5c 100644 --- a/Marlin/src/feature/leds/tempstat.h +++ b/Marlin/src/feature/leds/tempstat.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index a012aeb5fa69..ebcb56490d4f 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h index 19170b2d5906..8e98c9456c3f 100644 --- a/Marlin/src/feature/max7219.h +++ b/Marlin/src/feature/max7219.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index 28858112d5f2..7de4eb79ea67 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 75028a174d96..7fe7062a7a52 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index e082d847da22..aeff7918dde6 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/mmu2/mmu2.h b/Marlin/src/feature/mmu2/mmu2.h index c956139f54db..678f65d0720d 100644 --- a/Marlin/src/feature/mmu2/mmu2.h +++ b/Marlin/src/feature/mmu2/mmu2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 931ddb34a379..5ed6e4d97408 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 18922e4242bc..d8a676afa479 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 4ba3e30a243a..74850122c296 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/power.h b/Marlin/src/feature/power.h index 0bad7736ef45..8b988907e6c6 100644 --- a/Marlin/src/feature/power.h +++ b/Marlin/src/feature/power.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp index cf8ff1139bf8..956135d26e90 100644 --- a/Marlin/src/feature/power_monitor.cpp +++ b/Marlin/src/feature/power_monitor.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index 9db356d7b7e5..8dd79da6d2d5 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index b9f8dfaa6732..29a2cef97c4a 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 89b619285dc6..30ea343424dd 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index ad0acef04dd2..af8039d8b110 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h index 2562722d1254..626dd87f945f 100644 --- a/Marlin/src/feature/probe_temp_comp.h +++ b/Marlin/src/feature/probe_temp_comp.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 80bce6d75844..0b5c0ebc2e62 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 3cba6f828e6a..450ae1830a7b 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/snmm.cpp b/Marlin/src/feature/snmm.cpp index e994028d9e76..25723f7b38c3 100644 --- a/Marlin/src/feature/snmm.cpp +++ b/Marlin/src/feature/snmm.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/snmm.h b/Marlin/src/feature/snmm.h index 671542e3bf4a..10805c8e26b7 100644 --- a/Marlin/src/feature/snmm.h +++ b/Marlin/src/feature/snmm.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index d53118fdd441..8646ec872f6f 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/solenoid.h b/Marlin/src/feature/solenoid.h index 5a503b1056a4..2ba4983fb000 100644 --- a/Marlin/src/feature/solenoid.h +++ b/Marlin/src/feature/solenoid.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 17fee5ef2645..3dcf6e928a26 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index 71937a897a08..8240efa2ddee 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/spindle_laser_types.h b/Marlin/src/feature/spindle_laser_types.h index ffdc97a174a2..181c4d73ac07 100644 --- a/Marlin/src/feature/spindle_laser_types.h +++ b/Marlin/src/feature/spindle_laser_types.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index a8a1f5075b42..495d6a9f5bb5 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 6b7501723c86..2779ae4ef4b4 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index d5926d8f5c17..235c17b50c85 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/touch/xpt2046.h b/Marlin/src/feature/touch/xpt2046.h index 7f8eece1f497..347881e0addc 100644 --- a/Marlin/src/feature/touch/xpt2046.h +++ b/Marlin/src/feature/touch/xpt2046.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp index 4ed9faaa8a16..3cc20579ac57 100644 --- a/Marlin/src/feature/twibus.cpp +++ b/Marlin/src/feature/twibus.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h index 609693d879c5..8bc8eb4e74d7 100644 --- a/Marlin/src/feature/twibus.h +++ b/Marlin/src/feature/twibus.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/feature/z_stepper_align.cpp b/Marlin/src/feature/z_stepper_align.cpp index 3614d603716a..87b1f6f25163 100644 --- a/Marlin/src/feature/z_stepper_align.cpp +++ b/Marlin/src/feature/z_stepper_align.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/z_stepper_align.h b/Marlin/src/feature/z_stepper_align.h index ade3d6b575e2..e1b235b52cb3 100644 --- a/Marlin/src/feature/z_stepper_align.h +++ b/Marlin/src/feature/z_stepper_align.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 09c9e8fbeb18..438a619242d7 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index b4e4c6edfe8f..786065b34655 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/G42.cpp b/Marlin/src/gcode/bedlevel/G42.cpp index 139bd1bb6628..a2896ed6c705 100644 --- a/Marlin/src/gcode/bedlevel/G42.cpp +++ b/Marlin/src/gcode/bedlevel/G42.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index 50b2f6f15896..d51543417165 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index cc3007c54abb..f25fe32b07e5 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/abl/M421.cpp b/Marlin/src/gcode/bedlevel/abl/M421.cpp index 2e46fafcd009..182dc32515b6 100644 --- a/Marlin/src/gcode/bedlevel/abl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/abl/M421.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 7c363312ec39..68ac459ebb43 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/mbl/M421.cpp b/Marlin/src/gcode/bedlevel/mbl/M421.cpp index 3997e5ad591c..1368ab0bef98 100644 --- a/Marlin/src/gcode/bedlevel/mbl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/M421.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/ubl/G29.cpp b/Marlin/src/gcode/bedlevel/ubl/G29.cpp index 7b42e6dddf8e..2ef3ab4ceca9 100644 --- a/Marlin/src/gcode/bedlevel/ubl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/G29.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp index 6a0ac50af670..600c1fc8ba51 100644 --- a/Marlin/src/gcode/bedlevel/ubl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/M421.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 5ec8fd5af47d..1fbb3dd35332 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 58afb674029b..53af04d52876 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 6c85a7e021e2..3360dc050fcf 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index b0126c44da07..c14e5e395c45 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/G76_M871.cpp b/Marlin/src/gcode/calibrate/G76_M871.cpp index 660db3225957..f2f53d213d3a 100644 --- a/Marlin/src/gcode/calibrate/G76_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M871.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index fb04420e545f..ea054125b7ca 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/M12.cpp b/Marlin/src/gcode/calibrate/M12.cpp index 97d5bbc1ab5b..da244543754d 100644 --- a/Marlin/src/gcode/calibrate/M12.cpp +++ b/Marlin/src/gcode/calibrate/M12.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/gcode/calibrate/M425.cpp b/Marlin/src/gcode/calibrate/M425.cpp index c2a57686cf57..3e54186a5fa3 100644 --- a/Marlin/src/gcode/calibrate/M425.cpp +++ b/Marlin/src/gcode/calibrate/M425.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 175a4d403435..47c72eece7f4 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp index 8b2e7f99ed49..557204cc1102 100644 --- a/Marlin/src/gcode/calibrate/M665.cpp +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp index 7f8d917b634e..e915aa8ff7b7 100644 --- a/Marlin/src/gcode/calibrate/M666.cpp +++ b/Marlin/src/gcode/calibrate/M666.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp index 865b03def394..b60f41748fec 100644 --- a/Marlin/src/gcode/calibrate/M852.cpp +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index 67a000739758..cb17fc45a6e8 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index a87f23e3b9f9..0d049ede16e4 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M218.cpp b/Marlin/src/gcode/config/M218.cpp index 5c7d5eac719c..7701320e9eae 100644 --- a/Marlin/src/gcode/config/M218.cpp +++ b/Marlin/src/gcode/config/M218.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M220.cpp b/Marlin/src/gcode/config/M220.cpp index f24c11e23de0..1bec6a778204 100644 --- a/Marlin/src/gcode/config/M220.cpp +++ b/Marlin/src/gcode/config/M220.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M221.cpp b/Marlin/src/gcode/config/M221.cpp index 7f170e012bbc..7ba22d1901d5 100644 --- a/Marlin/src/gcode/config/M221.cpp +++ b/Marlin/src/gcode/config/M221.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M281.cpp b/Marlin/src/gcode/config/M281.cpp index 22ca8a4c1388..018ca1c0928d 100644 --- a/Marlin/src/gcode/config/M281.cpp +++ b/Marlin/src/gcode/config/M281.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/gcode/config/M301.cpp b/Marlin/src/gcode/config/M301.cpp index a68b64e0583f..7b3f57608bad 100644 --- a/Marlin/src/gcode/config/M301.cpp +++ b/Marlin/src/gcode/config/M301.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp index aa178ea206e6..14fbd9f57202 100644 --- a/Marlin/src/gcode/config/M302.cpp +++ b/Marlin/src/gcode/config/M302.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M304.cpp b/Marlin/src/gcode/config/M304.cpp index 2a851494244c..10739be3f8c3 100644 --- a/Marlin/src/gcode/config/M304.cpp +++ b/Marlin/src/gcode/config/M304.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M305.cpp b/Marlin/src/gcode/config/M305.cpp index d45e18f1b3a9..3e7206aee49d 100644 --- a/Marlin/src/gcode/config/M305.cpp +++ b/Marlin/src/gcode/config/M305.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index ace2aabf61f7..1e7374542c3d 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M540.cpp b/Marlin/src/gcode/config/M540.cpp index a8ec628d5a2f..54d52f3a31e2 100644 --- a/Marlin/src/gcode/config/M540.cpp +++ b/Marlin/src/gcode/config/M540.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M575.cpp b/Marlin/src/gcode/config/M575.cpp index a81d1e57c9d7..4144c366d114 100644 --- a/Marlin/src/gcode/config/M575.cpp +++ b/Marlin/src/gcode/config/M575.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M672.cpp b/Marlin/src/gcode/config/M672.cpp index 96204899edd8..58dc27177046 100644 --- a/Marlin/src/gcode/config/M672.cpp +++ b/Marlin/src/gcode/config/M672.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp index 4f7279fc34b3..0a7d52b633cc 100644 --- a/Marlin/src/gcode/config/M92.cpp +++ b/Marlin/src/gcode/config/M92.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp index ea6ab20d0fb2..df145d5d11c9 100644 --- a/Marlin/src/gcode/control/M108_M112_M410.cpp +++ b/Marlin/src/gcode/control/M108_M112_M410.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp index d93e1404af74..e31c3e2fb7b2 100644 --- a/Marlin/src/gcode/control/M111.cpp +++ b/Marlin/src/gcode/control/M111.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M120_M121.cpp b/Marlin/src/gcode/control/M120_M121.cpp index b25834cbda4f..570f2e935bb4 100644 --- a/Marlin/src/gcode/control/M120_M121.cpp +++ b/Marlin/src/gcode/control/M120_M121.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp index b8dcb9802e4c..499feef71586 100644 --- a/Marlin/src/gcode/control/M17_M18_M84.cpp +++ b/Marlin/src/gcode/control/M17_M18_M84.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp index 3b0a928b8f13..ffad722f3f7a 100644 --- a/Marlin/src/gcode/control/M211.cpp +++ b/Marlin/src/gcode/control/M211.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M226.cpp b/Marlin/src/gcode/control/M226.cpp index 0dfbfd62528e..52e0e57a87f0 100644 --- a/Marlin/src/gcode/control/M226.cpp +++ b/Marlin/src/gcode/control/M226.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M280.cpp b/Marlin/src/gcode/control/M280.cpp index 21a6c9890d9c..6ccbb7becc2f 100644 --- a/Marlin/src/gcode/control/M280.cpp +++ b/Marlin/src/gcode/control/M280.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp index 2ddccde0d25b..1326c30669a2 100644 --- a/Marlin/src/gcode/control/M3-M5.cpp +++ b/Marlin/src/gcode/control/M3-M5.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M350_M351.cpp b/Marlin/src/gcode/control/M350_M351.cpp index 54b29a21d361..463bd2ad5815 100644 --- a/Marlin/src/gcode/control/M350_M351.cpp +++ b/Marlin/src/gcode/control/M350_M351.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M380_M381.cpp b/Marlin/src/gcode/control/M380_M381.cpp index 756021a59b0b..3f5b25246543 100644 --- a/Marlin/src/gcode/control/M380_M381.cpp +++ b/Marlin/src/gcode/control/M380_M381.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M400.cpp b/Marlin/src/gcode/control/M400.cpp index 3926299807bb..9a5ad4e9df80 100644 --- a/Marlin/src/gcode/control/M400.cpp +++ b/Marlin/src/gcode/control/M400.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp index 0d703ca4bd47..c88113db49df 100644 --- a/Marlin/src/gcode/control/M42.cpp +++ b/Marlin/src/gcode/control/M42.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 7740c013f557..5dc36428b503 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M7-M9.cpp b/Marlin/src/gcode/control/M7-M9.cpp index 1fc8a93e2e92..a33e43288b75 100644 --- a/Marlin/src/gcode/control/M7-M9.cpp +++ b/Marlin/src/gcode/control/M7-M9.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 98efcce04dad..0dede7ea644c 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M85.cpp b/Marlin/src/gcode/control/M85.cpp index 224defed738a..9c8c02c59aa0 100644 --- a/Marlin/src/gcode/control/M85.cpp +++ b/Marlin/src/gcode/control/M85.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M997.cpp b/Marlin/src/gcode/control/M997.cpp index 1d9b12204db8..6c28d42f41ee 100644 --- a/Marlin/src/gcode/control/M997.cpp +++ b/Marlin/src/gcode/control/M997.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp index 79cd5e1854e2..53d74322a39a 100644 --- a/Marlin/src/gcode/control/M999.cpp +++ b/Marlin/src/gcode/control/M999.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 1d34cf4d5862..46cdfebf11ce 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp index 17f9ff71faa6..4eb6dfcc7628 100644 --- a/Marlin/src/gcode/eeprom/M500-M504.cpp +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/L6470/M122.cpp b/Marlin/src/gcode/feature/L6470/M122.cpp index ec5f9aea287d..d2b7f73997f8 100644 --- a/Marlin/src/gcode/feature/L6470/M122.cpp +++ b/Marlin/src/gcode/feature/L6470/M122.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp index 497fa7562295..cd7fc3dcb5d1 100644 --- a/Marlin/src/gcode/feature/L6470/M906.cpp +++ b/Marlin/src/gcode/feature/L6470/M906.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp index a3eaf7b26a6b..29efc06dd9c7 100644 --- a/Marlin/src/gcode/feature/L6470/M916-918.cpp +++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp index 683f6fff1b12..5c7155d7c9b5 100644 --- a/Marlin/src/gcode/feature/advance/M900.cpp +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/baricuda/M126-M129.cpp b/Marlin/src/gcode/feature/baricuda/M126-M129.cpp index d96ee03af165..edeba0d270b8 100644 --- a/Marlin/src/gcode/feature/baricuda/M126-M129.cpp +++ b/Marlin/src/gcode/feature/baricuda/M126-M129.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp index 33ef9bf1a186..9664ce15222b 100644 --- a/Marlin/src/gcode/feature/camera/M240.cpp +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -100,9 +100,9 @@ * M240: Trigger a camera by... * * - CHDK : Emulate a Canon RC-1 with a configurable ON duration. - * http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + * https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ * - PHOTOGRAPH_PIN : Pulse a digital pin 16 times. - * See http://www.doc-diy.net/photo/rc-1_hacked/ + * See https://www.doc-diy.net/photo/rc-1_hacked/ * - PHOTO_SWITCH_POSITION : Bump a physical switch with the X-carriage using a * configured position, delay, and retract length. * diff --git a/Marlin/src/gcode/feature/cancel/M486.cpp b/Marlin/src/gcode/feature/cancel/M486.cpp index 19216b2cb901..1f14ae0fd26c 100644 --- a/Marlin/src/gcode/feature/cancel/M486.cpp +++ b/Marlin/src/gcode/feature/cancel/M486.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index ff793451bde8..4d2acd189c6d 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp index 6337665d4cf2..fc99cc5c1d06 100644 --- a/Marlin/src/gcode/feature/clean/G12.cpp +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/controllerfan/M710.cpp b/Marlin/src/gcode/feature/controllerfan/M710.cpp index c19919b2d486..67d4ad8abf54 100644 --- a/Marlin/src/gcode/feature/controllerfan/M710.cpp +++ b/Marlin/src/gcode/feature/controllerfan/M710.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index 23cc34965047..54599a045134 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp index 41e6e90aa167..516289fe2779 100644 --- a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp +++ b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp index 75e5b6a5886e..05f015036001 100644 --- a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp +++ b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp index 6c48774c307c..538f16cde60b 100644 --- a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp +++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp index 13406f36005e..13c2cd1d10ed 100644 --- a/Marlin/src/gcode/feature/i2c/M260_M261.cpp +++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index 88e4ec1e27e6..88f02951add2 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/leds/M7219.cpp b/Marlin/src/gcode/feature/leds/M7219.cpp index acbd55957f9e..a6ee71174b54 100644 --- a/Marlin/src/gcode/feature/leds/M7219.cpp +++ b/Marlin/src/gcode/feature/leds/M7219.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/macro/M810-M819.cpp b/Marlin/src/gcode/feature/macro/M810-M819.cpp index c106de298aa2..7b9e1a13f1f5 100644 --- a/Marlin/src/gcode/feature/macro/M810-M819.cpp +++ b/Marlin/src/gcode/feature/macro/M810-M819.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/mixing/M163-M165.cpp b/Marlin/src/gcode/feature/mixing/M163-M165.cpp index 61be64edec9d..a4cb64e7d62c 100644 --- a/Marlin/src/gcode/feature/mixing/M163-M165.cpp +++ b/Marlin/src/gcode/feature/mixing/M163-M165.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp index b4618c811191..5f2c4f042a56 100644 --- a/Marlin/src/gcode/feature/mixing/M166.cpp +++ b/Marlin/src/gcode/feature/mixing/M166.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/pause/G27.cpp b/Marlin/src/gcode/feature/pause/G27.cpp index 7f2f0d48b7df..ea6aadf173c0 100644 --- a/Marlin/src/gcode/feature/pause/G27.cpp +++ b/Marlin/src/gcode/feature/pause/G27.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/pause/G60.cpp b/Marlin/src/gcode/feature/pause/G60.cpp index 73bd0c24890b..6f695b99a942 100644 --- a/Marlin/src/gcode/feature/pause/G60.cpp +++ b/Marlin/src/gcode/feature/pause/G60.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/pause/G61.cpp b/Marlin/src/gcode/feature/pause/G61.cpp index a0526d4c5d7a..d8049f02bcef 100644 --- a/Marlin/src/gcode/feature/pause/G61.cpp +++ b/Marlin/src/gcode/feature/pause/G61.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index cb59985278fa..db78e870d71a 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 844dfba3d0a4..673c7387ef98 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp index 620b8f4f27d5..a62b5cd46d18 100644 --- a/Marlin/src/gcode/feature/pause/M603.cpp +++ b/Marlin/src/gcode/feature/pause/M603.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index 45e6b394afc9..7449787d780b 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp index 356fe6749559..08e2d96cc001 100644 --- a/Marlin/src/gcode/feature/power_monitor/M430.cpp +++ b/Marlin/src/gcode/feature/power_monitor/M430.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index c53e8fbcccbe..58e810e5d075 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp index ea933872be11..5a08053e7c9d 100644 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ b/Marlin/src/gcode/feature/powerloss/M413.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp index 0a9c519451a0..91e35dbf657c 100644 --- a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp +++ b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/runout/M412.cpp b/Marlin/src/gcode/feature/runout/M412.cpp index 79e08edf9a15..130f9c83e3ac 100644 --- a/Marlin/src/gcode/feature/runout/M412.cpp +++ b/Marlin/src/gcode/feature/runout/M412.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/trinamic/M122.cpp b/Marlin/src/gcode/feature/trinamic/M122.cpp index 2669b323cec6..46e4365f38c2 100644 --- a/Marlin/src/gcode/feature/trinamic/M122.cpp +++ b/Marlin/src/gcode/feature/trinamic/M122.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp index f88e116839d6..e72d03e76728 100644 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index 95ad310ed0e0..e834ebd67d95 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp index 582e779cc2d6..8c840db5bf9c 100644 --- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp +++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 0b0a29cc2039..7f00ec5a3401 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 72ae1f92df85..b3f339e295ec 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -33,7 +33,7 @@ * Helpful G-code references: * - https://marlinfw.org/meta/gcode * - https://reprap.org/wiki/G-code - * - http://linuxcnc.org/docs/html/gcode.html + * - https://linuxcnc.org/docs/html/gcode.html * * Help to document Marlin's G-codes online: * - https://github.com/MarlinFirmware/MarlinDocumentation diff --git a/Marlin/src/gcode/geometry/G17-G19.cpp b/Marlin/src/gcode/geometry/G17-G19.cpp index 14f3e80bbc79..7510eaba8c3d 100644 --- a/Marlin/src/gcode/geometry/G17-G19.cpp +++ b/Marlin/src/gcode/geometry/G17-G19.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/geometry/G53-G59.cpp b/Marlin/src/gcode/geometry/G53-G59.cpp index e24247b2c5c3..05bc522768a2 100644 --- a/Marlin/src/gcode/geometry/G53-G59.cpp +++ b/Marlin/src/gcode/geometry/G53-G59.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp index 16717de14de6..1a0382ed7c2b 100644 --- a/Marlin/src/gcode/geometry/G92.cpp +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index 13e82a0c7316..2a007427a79c 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M110.cpp b/Marlin/src/gcode/host/M110.cpp index 126063116af2..b12b38ea0f12 100644 --- a/Marlin/src/gcode/host/M110.cpp +++ b/Marlin/src/gcode/host/M110.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M113.cpp b/Marlin/src/gcode/host/M113.cpp index 872986561d79..ce826d6acde6 100644 --- a/Marlin/src/gcode/host/M113.cpp +++ b/Marlin/src/gcode/host/M113.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp index 389188ada8eb..85a38f6462a8 100644 --- a/Marlin/src/gcode/host/M114.cpp +++ b/Marlin/src/gcode/host/M114.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 41bcec798180..c3ff9c8c1a9c 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 81bb830d8310..3be290254125 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M119.cpp b/Marlin/src/gcode/host/M119.cpp index b3cb7290b33f..f0066bddffee 100644 --- a/Marlin/src/gcode/host/M119.cpp +++ b/Marlin/src/gcode/host/M119.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M16.cpp b/Marlin/src/gcode/host/M16.cpp index 996ce7c41901..1ac85803961d 100644 --- a/Marlin/src/gcode/host/M16.cpp +++ b/Marlin/src/gcode/host/M16.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 146abe24d4a7..87ca23becd48 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/gcode/host/M876.cpp b/Marlin/src/gcode/host/M876.cpp index fe0ca1541abe..0d8256cf0874 100644 --- a/Marlin/src/gcode/host/M876.cpp +++ b/Marlin/src/gcode/host/M876.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp index d39578ca76da..1d18b706029c 100644 --- a/Marlin/src/gcode/lcd/M0_M1.cpp +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/lcd/M117.cpp b/Marlin/src/gcode/lcd/M117.cpp index 7e314731f8d3..8459135f3018 100644 --- a/Marlin/src/gcode/lcd/M117.cpp +++ b/Marlin/src/gcode/lcd/M117.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index f935170a9b56..abd4dcc7439b 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/lcd/M250.cpp b/Marlin/src/gcode/lcd/M250.cpp index 839fd259697c..f42daaeac428 100644 --- a/Marlin/src/gcode/lcd/M250.cpp +++ b/Marlin/src/gcode/lcd/M250.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/lcd/M300.cpp b/Marlin/src/gcode/lcd/M300.cpp index 5d7e766b2de5..56d9ee5d7350 100644 --- a/Marlin/src/gcode/lcd/M300.cpp +++ b/Marlin/src/gcode/lcd/M300.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp index 8e87d2e2d53a..7a5454419da9 100644 --- a/Marlin/src/gcode/lcd/M73.cpp +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp index df0825a512d4..3aa082c25e83 100644 --- a/Marlin/src/gcode/motion/G0_G1.cpp +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 5255db23b1ee..59a5346356b2 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/motion/G4.cpp b/Marlin/src/gcode/motion/G4.cpp index d157face9002..3a37fe5b2c4e 100644 --- a/Marlin/src/gcode/motion/G4.cpp +++ b/Marlin/src/gcode/motion/G4.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/motion/G5.cpp b/Marlin/src/gcode/motion/G5.cpp index 5d289e11d815..804db5a742af 100644 --- a/Marlin/src/gcode/motion/G5.cpp +++ b/Marlin/src/gcode/motion/G5.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/motion/G6.cpp b/Marlin/src/gcode/motion/G6.cpp index 4405ff6b9cc1..168dc28abd23 100644 --- a/Marlin/src/gcode/motion/G6.cpp +++ b/Marlin/src/gcode/motion/G6.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/gcode/motion/G80.cpp b/Marlin/src/gcode/motion/G80.cpp index 700038df0f22..f674596ddd51 100644 --- a/Marlin/src/gcode/motion/G80.cpp +++ b/Marlin/src/gcode/motion/G80.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index aadf6294864d..7158525ed9d9 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index a025cebc884c..91a24d1dd0eb 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 06e41ccf13d8..5474e5e5f394 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index 167e364fa707..4347f55aa8f8 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/probe/G31_G32.cpp b/Marlin/src/gcode/probe/G31_G32.cpp index e2e43e35edc9..af44257d6195 100644 --- a/Marlin/src/gcode/probe/G31_G32.cpp +++ b/Marlin/src/gcode/probe/G31_G32.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/probe/G38.cpp b/Marlin/src/gcode/probe/G38.cpp index 512e1ff89f49..b06cd47359c7 100644 --- a/Marlin/src/gcode/probe/G38.cpp +++ b/Marlin/src/gcode/probe/G38.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp index af6a0cdbc95c..8e9bd11b81d7 100644 --- a/Marlin/src/gcode/probe/M401_M402.cpp +++ b/Marlin/src/gcode/probe/M401_M402.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/probe/M851.cpp b/Marlin/src/gcode/probe/M851.cpp index c2e746cf0b5c..ee60e9ebc011 100644 --- a/Marlin/src/gcode/probe/M851.cpp +++ b/Marlin/src/gcode/probe/M851.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/probe/M951.cpp b/Marlin/src/gcode/probe/M951.cpp index cc94e70c93bc..f461fc2b079d 100644 --- a/Marlin/src/gcode/probe/M951.cpp +++ b/Marlin/src/gcode/probe/M951.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 330f0513efdf..c77db0bf2a1f 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 25731782d319..966af2871ffe 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/gcode/scara/M360-M364.cpp b/Marlin/src/gcode/scara/M360-M364.cpp index cd901d5dd45f..562beee4f98e 100644 --- a/Marlin/src/gcode/scara/M360-M364.cpp +++ b/Marlin/src/gcode/scara/M360-M364.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 8f1427a9abae..54bc452f97de 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp index c45fcb038a97..6d4c55752cc3 100644 --- a/Marlin/src/gcode/sd/M20.cpp +++ b/Marlin/src/gcode/sd/M20.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M21_M22.cpp b/Marlin/src/gcode/sd/M21_M22.cpp index 2d5bccaf8438..77df751fc774 100644 --- a/Marlin/src/gcode/sd/M21_M22.cpp +++ b/Marlin/src/gcode/sd/M21_M22.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M23.cpp b/Marlin/src/gcode/sd/M23.cpp index 8cd9a33689ae..b88f66b59162 100644 --- a/Marlin/src/gcode/sd/M23.cpp +++ b/Marlin/src/gcode/sd/M23.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp index 86f34f136129..c27e03862cbf 100644 --- a/Marlin/src/gcode/sd/M24_M25.cpp +++ b/Marlin/src/gcode/sd/M24_M25.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M26.cpp b/Marlin/src/gcode/sd/M26.cpp index d2e9e8e72a9d..e0557bfa14fa 100644 --- a/Marlin/src/gcode/sd/M26.cpp +++ b/Marlin/src/gcode/sd/M26.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M27.cpp b/Marlin/src/gcode/sd/M27.cpp index 9c71e510a69e..8592b8af2582 100644 --- a/Marlin/src/gcode/sd/M27.cpp +++ b/Marlin/src/gcode/sd/M27.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M28_M29.cpp b/Marlin/src/gcode/sd/M28_M29.cpp index 45e0782fa77e..6f3f2450a195 100644 --- a/Marlin/src/gcode/sd/M28_M29.cpp +++ b/Marlin/src/gcode/sd/M28_M29.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M30.cpp b/Marlin/src/gcode/sd/M30.cpp index 2fd407341b30..b95a895f1e92 100644 --- a/Marlin/src/gcode/sd/M30.cpp +++ b/Marlin/src/gcode/sd/M30.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M32.cpp b/Marlin/src/gcode/sd/M32.cpp index 35a6fb1d641b..a6f9fbcd8db1 100644 --- a/Marlin/src/gcode/sd/M32.cpp +++ b/Marlin/src/gcode/sd/M32.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M33.cpp b/Marlin/src/gcode/sd/M33.cpp index 7c6654a02e93..b611c8bc0863 100644 --- a/Marlin/src/gcode/sd/M33.cpp +++ b/Marlin/src/gcode/sd/M33.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M34.cpp b/Marlin/src/gcode/sd/M34.cpp index ff1a8939a0f2..2dd7dc580c93 100644 --- a/Marlin/src/gcode/sd/M34.cpp +++ b/Marlin/src/gcode/sd/M34.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M524.cpp b/Marlin/src/gcode/sd/M524.cpp index 401330361494..b27814cc38be 100644 --- a/Marlin/src/gcode/sd/M524.cpp +++ b/Marlin/src/gcode/sd/M524.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/sd/M928.cpp b/Marlin/src/gcode/sd/M928.cpp index b8b9175f02d3..03a7877a90d0 100644 --- a/Marlin/src/gcode/sd/M928.cpp +++ b/Marlin/src/gcode/sd/M928.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/stats/M31.cpp b/Marlin/src/gcode/stats/M31.cpp index 019598cb8336..b39108bb903e 100644 --- a/Marlin/src/gcode/stats/M31.cpp +++ b/Marlin/src/gcode/stats/M31.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp index 41d550cb59ac..908e6e5a31ee 100644 --- a/Marlin/src/gcode/stats/M75-M78.cpp +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index f8eca4bc028f..a289983b9294 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/temp/M105.cpp b/Marlin/src/gcode/temp/M105.cpp index 7d68ccadc0f1..eefc3ae9f17f 100644 --- a/Marlin/src/gcode/temp/M105.cpp +++ b/Marlin/src/gcode/temp/M105.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index ffc00eafa32a..17ff8c3c8f60 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index 4af09bdfe038..9438b9e0c23c 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp index 772bfe402b19..41a79825aa3b 100644 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ b/Marlin/src/gcode/temp/M141_M191.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/temp/M155.cpp b/Marlin/src/gcode/temp/M155.cpp index 8859736f50ca..30129a0e6ff7 100644 --- a/Marlin/src/gcode/temp/M155.cpp +++ b/Marlin/src/gcode/temp/M155.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 31d16faff411..3340e4fa49a1 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/units/G20_G21.cpp b/Marlin/src/gcode/units/G20_G21.cpp index 4961ae160148..6f1d5adbccbd 100644 --- a/Marlin/src/gcode/units/G20_G21.cpp +++ b/Marlin/src/gcode/units/G20_G21.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/units/M149.cpp b/Marlin/src/gcode/units/M149.cpp index d8d962c5be35..5d9f83206980 100644 --- a/Marlin/src/gcode/units/M149.cpp +++ b/Marlin/src/gcode/units/M149.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/units/M82_M83.cpp b/Marlin/src/gcode/units/M82_M83.cpp index bf5aff0b8526..d93f0ea5adf3 100644 --- a/Marlin/src/gcode/units/M82_M83.cpp +++ b/Marlin/src/gcode/units/M82_M83.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 972d1042ee42..a552e5b9ce7d 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 849add1df959..26204fc5c772 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index eb0155949ec7..401a64d72d3d 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h index 90fc11004238..d1184cff5f25 100644 --- a/Marlin/src/inc/MarlinConfig.h +++ b/Marlin/src/inc/MarlinConfig.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/inc/MarlinConfigPre.h b/Marlin/src/inc/MarlinConfigPre.h index d84f75120026..1b15d4981730 100644 --- a/Marlin/src/inc/MarlinConfigPre.h +++ b/Marlin/src/inc/MarlinConfigPre.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2654233485d3..f8e4dc669aee 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 8d96b0b00483..ec64e054e065 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -97,7 +97,7 @@ * documentation about a specific Marlin release. Displayed in the Info Menu. */ #ifndef WEBSITE_URL - #define WEBSITE_URL "http://marlinfw.org" + #define WEBSITE_URL "https://marlinfw.org" #endif /** diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index 7804914d6698..a924528c3053 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.h b/Marlin/src/lcd/HD44780/ultralcd_HD44780.h index 4fce2daa07f6..604d26a029b4 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.h +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h index 4ab165c7a0b6..1511c6993323 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index 25224934c50c..df7f8dd44b8f 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dogm/dogm_Bootscreen.h b/Marlin/src/lcd/dogm/dogm_Bootscreen.h index 0d90736c6de0..c9001119d9d4 100644 --- a/Marlin/src/lcd/dogm/dogm_Bootscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Bootscreen.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 8bf37fcd0220..70802f905e1d 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h index fd07e4af1e13..2aca88ca79d3 100644 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h index b6930cb14cb4..451383045b01 100644 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index ae8952ab3365..bdd9f25703ec 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index 1854ac1c674e..70cb7c66d793 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp index 1542d9db0dca..e70b3671b541 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp index 599ee2a9efaf..838bee0ffc4c 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 0f602246b42f..dbd6f4c117b4 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp index 94956e74108f..85339e83495a 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index 728d028deb70..22f460afe701 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,13 +26,13 @@ * Implementation of the LCD display routines for a DOGM128 graphic display. * by STB for ErikZalm/Marlin. Common LCD 128x64 pixel graphic displays. * - * Demonstrator: http://www.reprap.org/wiki/STB_Electronics - * License: http://opensource.org/licenses/BSD-3-Clause + * Demonstrator: https://www.reprap.org/wiki/STB_Electronics + * License: https://opensource.org/licenses/BSD-3-Clause * * With the use of: * u8glib by Oliver Kraus * https://github.com/olikraus/U8glib_Arduino - * License: http://opensource.org/licenses/BSD-3-Clause + * License: https://opensource.org/licenses/BSD-3-Clause */ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 61a0a94abcfe..1b6dd0b9def8 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -70,7 +70,7 @@ #elif ENABLED(U8GLIB_LM6059_AF) - // Based on the Adafruit ST7565 (http://www.adafruit.com/products/250) + // Based on the Adafruit ST7565 (https://www.adafruit.com/products/250) #if ENABLED(ALTERNATIVE_LCD) #define U8G_CLASS U8GLIB_LM6059 // 8 stripes (HW-SPI) diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index ea65b972eb9e..e6bd80c2c2fd 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h index 6297b2f7a9a6..85e76444d4ee 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index db7bfc6dd768..4f661ca9536d 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/dwin.h index 3667761b4010..e834ef3e24e6 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/dwin.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 59232e63b3c9..3c14a95936e7 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dwin/dwin_lcd.h b/Marlin/src/lcd/dwin/dwin_lcd.h index e7624b0b5af2..3fae1ccfc91a 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.h +++ b/Marlin/src/lcd/dwin/dwin_lcd.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp b/Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp index 5201e06a0914..25356ab406a0 100644 --- a/Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp +++ b/Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dwin/eeprom_BL24CXX.h b/Marlin/src/lcd/dwin/eeprom_BL24CXX.h index 7ffb64d4d3ec..e253cc9be269 100644 --- a/Marlin/src/lcd/dwin/eeprom_BL24CXX.h +++ b/Marlin/src/lcd/dwin/eeprom_BL24CXX.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/dwin/rotary_encoder.cpp b/Marlin/src/lcd/dwin/rotary_encoder.cpp index e4d60b4ce377..62e2cda35126 100644 --- a/Marlin/src/lcd/dwin/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/rotary_encoder.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/dwin/rotary_encoder.h b/Marlin/src/lcd/dwin/rotary_encoder.h index d650d53f65df..5c5a8f86a29b 100644 --- a/Marlin/src/lcd/dwin/rotary_encoder.h +++ b/Marlin/src/lcd/dwin/rotary_encoder.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index c79d7e027ef0..b788587c9412 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index 7f635798886e..ee536ea21905 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h index 39ed3174f07e..b34a04875d1a 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index d5958d2b202d..7988985c2e4b 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h index a7274fc2f873..df738dbfd144 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h b/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h index 58621cfd571e..8c193c7c1edd 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp index e5826a9180b7..3beed892e35b 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h index 51f84a1886bb..f6a65fe8a061 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp index d5ac981e5b5d..82c06d7a4afb 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h index 1bfdf542549f..3ff5e06dc18c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index 616ff04d7cb5..f9d4351e02d9 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h index 85788df300e8..451c11adba16 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp index 57d17acbd20e..0c38c8216c1d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../compat.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h index 2917cb0b1e7b..3edc2a9de1c8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ class SPIFlash { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp index 68886166c2d3..46683401dca7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../compat.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h index d64182fd5b0b..fcaa610e8bdb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h index c3e8052a0e51..11ad0798b56f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h index dadb0328ca8a..7476c9e67e4c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/LICENSE.txt b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/LICENSE.txt index 94a9ed024d38..e60008693e01 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/LICENSE.txt +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/LICENSE.txt @@ -1,7 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h index a60cc7d500d7..e431cfde1ff5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once @@ -67,9 +67,9 @@ * http://www.hotmcu.com/43-graphical-lcd-touchscreen-480x272-spi-ft800-p-111.html?cPath=6_16 * http://www.hotmcu.com/5-graphical-lcd-touchscreen-480x272-spi-ft800-p-124.html?cPath=6_16 * Datasheet: - * http://www.hantronix.com/files/data/1278363262430-3.pdf - * http://www.haoyuelectronics.com/Attachment/HY43-LCD/LCD%20DataSheet.pdf - * http://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf + * https://www.hantronix.com/files/data/1278363262430-3.pdf + * https://www.haoyuelectronics.com/Attachment/HY43-LCD/LCD%20DataSheet.pdf + * https://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf */ #elif defined(LCD_HAOYU_FT800CB) #if !HAS_RESOLUTION @@ -92,7 +92,7 @@ * Settings for the Haoyu Electronics, 5" Graphical LCD Touchscreen, 800x480, SPI, FT810 * http://www.hotmcu.com/5-graphical-lcd-touchscreen-800x480-spi-ft810-p-286.html * Datasheet: - * http://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf + * https://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf */ #elif defined(LCD_HAOYU_FT810CB) #if !HAS_RESOLUTION diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index e4524f29d587..a70268254fe9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_basic.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h index 0426911edb27..1bb35a599577 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /**************************************************************************** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h index 5f60881bdd0e..1e6642fedc19 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /**************************************************************************** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h index e8f9f424d0a0..75a2d54fca52 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h index ff17d019d788..11151a574145 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /**************************************************************************** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h index 3e4044e1947d..7e3165c2661d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /**************************************************************************** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h index 471530cadf83..dd4be7a79387 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp index fe8771e14691..d91d08fbfa05 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_basic.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h index 3e10b4b96246..30ec786c60ae 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h index 8922f3eb3ecd..436c67edf2eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h index 2a095c344553..b763c890c20b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp index 08d208202048..7224b681bba5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h index 73aec64a8c22..94ccbb7a605b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp index 9a55c55ae62a..728e433154ae 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h index 3d603726bbac..4ae4bce3efab 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp index 9761eba7ef59..9c5599ebe8ea 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h index 7eeea9c8154a..d9bede92dfbc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h index 329bea46f19a..e1904511b264 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h index ec8154b22f69..1975d36af716 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h index 4560996da76d..7da621321141 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h index fde505287340..2b18244e22fb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp index ec1c0d1cbb4d..bebee5467da7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h index 1420b53fc90b..972c38395b14 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h index dcfa290230f9..fbdfe2fe998a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp index 9d67260fee41..6a5b6e3cf879 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h index e177ec57dfb9..e2650b10aeff 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp index 75a445a926b0..9600bd128946 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h index a0f99c6b08f3..261995147cd4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp index c7b35e92dfef..58ec96ac15fb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h index 9db912752966..700da7bcf2f9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp index 0db6b0d360a4..c5126721abb2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h index 85ece6b774ab..f1e22e17ddf5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp index fd9beeaab121..733cf8f6603a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h index 9cf6c181f5af..f5bf644ef9e7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp index 85411a320df6..b50c12fc6df1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h index 17ccfe6e3018..7decdfd38f66 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ namespace FTDI { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp index 6f6e9f5484a4..09473c1c263d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h index fedb89d172e9..16f7e197b589 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp index eef14d29322e..4aa2580c633a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h index 704de9508878..2adad2327afa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ namespace FTDI { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h index 64a14121d975..37e03238e034 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py index c295dfc5b8d4..a7de06d68bb3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py @@ -13,7 +13,7 @@ # GNU General Public License for more details. # # To view a copy of the GNU General Public License, go to the following -# location: . +# location: . from __future__ import print_function from PIL import Image diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h index da6a2bc32593..5357de3ef36c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h index 22260801b364..3abc6fca2dc8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py index 2778f94d9850..da08014e893e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py @@ -13,7 +13,7 @@ # GNU General Public License for more details. # # To view a copy of the GNU General Public License, go to the following -# location: . +# location: . from __future__ import print_function import argparse, re, sys @@ -56,7 +56,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h index 5a7d3c960bba..5c1a74f66e9d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp index 624c58576c30..912c95731d12 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h index 54f843993312..873e84455ad0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index f521a4010a93..b00c836ce470 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once @@ -74,7 +74,7 @@ namespace Language_en { PROGMEM Language_Str MSG_LICENSE = u8"This program is free software: you can redistribute it and/or modify it under the terms of " "the GNU General Public License as published by the Free Software Foundation, either version 3 " "of the License, or (at your option) any later version.\n\nTo view a copy of the GNU General " - "Public License, go to the following location: http://www.gnu.org/licenses."; + "Public License, go to the following location: https://www.gnu.org/licenses."; PROGMEM Language_Str MSG_RUNOUT_1 = u8"Runout 1"; PROGMEM Language_Str MSG_RUNOUT_2 = u8"Runout 2"; PROGMEM Language_Str MSG_DISPLAY_MENU = u8"Display"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index 9c0396f03b73..a9b4ec6cd8b2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "compat.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h index a5068fe97227..5ad84c60b0ff 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp index 93aff7ca5f61..47a35cd0a805 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index d015f46ffed5..12bfe5e68dbf 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp index 17750c02ec02..bd09d2a5cd20 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp index 0d6b97d46aba..8d65518455dd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp index 37f4e6e06d68..1c4ef594bb4e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp index d449876baf00..c84dd45f004f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 6ba7deea9733..f8a30e82411e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp index ea6ba93c8b20..76ebdca587e4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp index 79a6112e4fc9..da772971ce01 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp index 3ae2d680ce63..48ce320482b2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp index 1f6aa45c1746..e2bb8a241402 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h index 1c7c02093d0f..9279fd7df0d6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h index 32f52f8e4660..f03e3413f833 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index 1f928db6f69f..c5e26da98a32 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index 0a583d1cb846..6d72fc92a2e4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp index cb3827226b06..0d8d71b45ce1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp index fcb0b67f88b1..2c2c0c6a18ec 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp index b82149c85959..776a9fe5f716 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index a01394981475..afa3211a01ae 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp index 933894259e73..e23592a46e9f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp index deae90fe9307..974ce3a6e1fe 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp index 1e16546003bb..574de2108829 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp index 63ce83765eda..4e5b174d53f0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index cc132064ecae..6b6affadd569 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp index 21be095f963e..8496955f732c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp index b3b674ebd311..8e56c4197bbd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp index 7f3a27e9e8fd..782ae7bbc7f8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp index b449634b1a1a..8845dfb5c0aa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp index fff0337f3173..6044d0a951eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp index bd8e648e1125..2698708e51ba 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp index 3972a14ef98a..575f75a74e9c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp index f1b0a69ad09f..f1808bf20e69 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index 7573bce33694..e3043024223a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp index 0026478f7b2e..b52096a13b9a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp index 48fae863a706..6c05c3a887ad 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp index c208014cc75b..b96c2be7c80c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp index 3c83e6e692d1..d365b12eb143 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp index 9c27ae6af5f0..d98324623c28 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp index 8906a14cf0f4..5b4c1c917536 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp index 0e35b4547581..fb90ae1133c7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp index 8f583356e03b..7854ce5e395c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index d319c6c8a621..12cb8d0891bb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp index 305fd0fc35b7..29ac2f1b4038 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp index ebe017124638..95e29c197de6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp index 95a4e6b44ade..d7e476e04ef5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index 4bf8ed190e0a..14ca6fe2973e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp index 5b439a91336b..07d6900c16f4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp index 0865b8ccbc44..091ad8f124fa 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp index 5fbb43cdb507..a8891162ea0d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp index 7d68ae2d671a..69eecaf54b36 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp index a5fe95490f74..94b8ac0fb50f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp index 5ffe20cce1e9..f4a99accd63d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index a0bc60d4884a..207277b824be 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 72b4a8b1a58f..82d1831e62b1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index ce77a00b8179..276727fc466b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp index 05df0f3995bb..de7eb92a8897 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp index e28e5d9b81f6..cb263248088e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index 41589dbd115d..ac1fccd579a6 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp index 75f283feff86..693d125fbf48 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp index fbba4beb8e1a..a8e948a9c3ed 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp index f47707f96547..f3957c0173bc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp index bcb6c56766eb..321c608abd92 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp index ca4fdad3ce61..340ffd055329 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h index d6e26fb5cbcd..ce3af4db878f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp index d2b2c22ed3b8..c254d2997f62 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp index 3520836bb87f..436445024a2f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp index 4d7477b300ad..8c3bc856b3c7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp index bd6653394d8b..4e3fb7d17ef9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp index b77cb5143e46..d7c456204123 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp index 7f06514aa514..f5cd03697c08 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../config.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h index 00952cfc5bd9..2cb039c84df9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h index f8b58098f5ea..f99c0fd3ebcd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -18,7 +18,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h index 3e5a985cc3b2..63115b418730 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h index a65cbea52ad8..eb9cadeba1e4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h index a9c1d4049e91..dd5088e0ce2b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp index e08373390f8d..f4a80bcc09fd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../compat.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h index c728d0012f2d..b2b889038650 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h index 6a73a07163c7..df7782ce87dd 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h @@ -17,7 +17,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index 804bc6548cad..3c6cffb20dcd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h index 7d01d7ac37c7..4466f4d33bef 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp index 2ad14357a143..5c56bdef43f8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h index 89b22c30fc5b..c3e3fe74ad33 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index a65bf818ec1b..ec92e1559cc7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h index 5904a8a2e97e..4c6c288d088d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index 864b5781b443..a2b02826c77d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h index 14d2b7cdf4b8..d071da20bb11 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index c87df26b1d37..19d2452142d9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index 894675b9c058..f68b0f8443fa 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index 6c7a73d8cfb1..f72cb2ab32fb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h index 95e26c2bedf9..010b612ff708 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index a8290d39fe1b..90a7ce64f6eb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h index 7ebf32b66cf3..a7b2afcd8ab5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index 0d907fea3d57..76c0e251e866 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h index 6ad2024e9f57..ef17885926f8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index 87c9a35105cc..f6ad744b4180 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h index 9fd373b8bdec..e93c0a0fad88 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 1237c12bbe9b..75fbb4d91f9f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h index 4d967b4f069d..4b6b2b022169 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index d4e6fa81cbb4..3a28ebde62d4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h index 346e0bb3f7ff..4ec33afce397 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index ed5af48b90e3..223ecf170338 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h index 407ff311e904..c2583c7ef346 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp index 1fbaf056e223..1a423efdaa81 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h index 27f21d4b4ccb..8ca562f0cfe0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp index f66c2bde9916..f66898b7925b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h index 5b0d4aba6e3e..ce541ee68b8d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 27d011e00095..82defbebde82 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h index c042b70cf917..db0e3617641b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index e8647aaa3719..345b15882ba0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h index 1b060d44ba2a..987282c07906 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index e15de7021f1c..daf950703104 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h index 1e0cc86eec70..1f7d9f909def 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 1551705704c1..31ea1f6d82b7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index fbb3a00d78d0..742fffe331c5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index 45354def6562..6c7f83405b59 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h index e2300e419245..1cb60b5681e3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index d980d4c08da0..14b9ee80c592 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h index b05b6fed1967..14be3bce4f26 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index af0d1f440ce5..ef2a29a930a3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 924c131018ca..612ba4b51cad 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp index 312229a16cad..2d7b7d440b69 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index 913b67ab258b..a4061eec2c2e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h index a1e2972aa7f0..6dc9fb6368c0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 4e9eee892953..8cf2233715f6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 4176ee023005..c0130d0e7e41 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp index 49413a9b1cf6..c081e92bf14b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h index 723518863455..9605d65085d7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 038f5f47400e..137dae2e2d74 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index c1dd8eb0a4d5..5cea0e3ac856 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index d43ba086dbcd..e800cbc12ba4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index e78067d89826..6778331cc9c5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index 50a9deaf2ef5..c8b0a7194d00 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index f83771b838fc..75d1fd539d8b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index 7e782c3fefd0..5da3dd168150 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h index 13720d1bbf0b..f7b0e0d31060 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 3fa626762528..ac69bf06697d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index c1e40e77f36f..81ff4b1b037d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 7e29714443ac..cdee6880e210 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 9ac425305724..32834eafc6ef 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 5e1f2cfacf2f..b5dbb11a0613 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -38,7 +38,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 103cf6c1047f..ae6f31d43e2f 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -39,7 +39,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_tft.cpp index 6782f8d9d6af..6383ee7b5305 100644 --- a/Marlin/src/lcd/extui_anycubic_tft.cpp +++ b/Marlin/src/lcd/extui_anycubic_tft.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui_dgus_lcd.cpp b/Marlin/src/lcd/extui_dgus_lcd.cpp index e2d307d5357b..c3978eb7e187 100644 --- a/Marlin/src/lcd/extui_dgus_lcd.cpp +++ b/Marlin/src/lcd/extui_dgus_lcd.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/extui_example.cpp b/Marlin/src/lcd/extui_example.cpp index 3d99611d0691..5258a5b6a27d 100644 --- a/Marlin/src/lcd/extui_example.cpp +++ b/Marlin/src/lcd/extui_example.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #include "../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui_malyan_lcd.cpp b/Marlin/src/lcd/extui_malyan_lcd.cpp index 53cef9915be6..38a8fbc0f99a 100644 --- a/Marlin/src/lcd/extui_malyan_lcd.cpp +++ b/Marlin/src/lcd/extui_malyan_lcd.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index 324c5b2c0109..1cb64f985bcb 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index e7c497e7eb3c..8917d98e681a 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index 3eed7933c55d..1c4a029ff7dd 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 3796284f4ee5..c21cacddc89b 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -30,7 +30,7 @@ * * Translated by Petr Zahradnik, Computer Laboratory * Blog and video blog Zahradnik se bavi - * http://www.zahradniksebavi.cz + * https://www.zahradniksebavi.cz * */ diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index fc69aa55c334..7a9321d001d1 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 2d14f47b16db..ebd08050373b 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index eb288ba8ab4b..cee8dd0e55d5 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index c79bca37d429..d7bead9ea669 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 48c6e5b1a368..de8cfc85ff71 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index fbd6981f3ec8..2b10bfe313e1 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 35c4717a4057..5b38299e76fe 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index 8166fa3136bd..77424df35359 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 5205205ce6c3..d403477eb015 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 6f4c5e5e711e..4415fc5e1c12 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index 24a1f1dcc701..4873f5c25492 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index d84155f419f5..182ed27072bb 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 264e7bd0531b..6de5d9e0323e 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index 8a74dcabba8d..5f679dd49d2c 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h index 7627a7d15565..2ffcdf7b41e0 100644 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ b/Marlin/src/lcd/language/language_ko_KR.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index 701f861217a6..c8c79e472add 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 12bab2380411..79190ddfcb42 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 41bfdc741494..1180649c989b 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 49a336ce3ff1..e0a52fc3906a 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index de9c1106dea2..39e5cb9e2cd8 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 15d23e1326ed..6228e92346ab 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 982803b1734b..321fa5e05f4f 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -29,7 +29,7 @@ * See also https://marlinfw.org/docs/development/lcd_language.html * * Translated by Michal HoleÅ¡, Farma MaM - * http://www.facebook.com/farmamam + * https://www.facebook.com/farmamam * */ #define DISPLAY_CHARSET_ISO10646_SK diff --git a/Marlin/src/lcd/language/language_test.h b/Marlin/src/lcd/language/language_test.h index 147379f5bd48..b15f20619e7d 100644 --- a/Marlin/src/lcd/language/language_test.h +++ b/Marlin/src/lcd/language/language_test.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 484ece89d510..bb68a6171766 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 55e0eb4d3f9c..686657246f3b 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 9d0ba7e21346..227a4950f367 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index c5b1b844068a..cf772caaef66 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index efc9b570bbcb..94a7944b3598 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index 653e6d10cece..c982cfe2aa86 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/game/brickout.cpp b/Marlin/src/lcd/menu/game/brickout.cpp index 6fe0a31ffaea..4bdc9243801e 100644 --- a/Marlin/src/lcd/menu/game/brickout.cpp +++ b/Marlin/src/lcd/menu/game/brickout.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/game/brickout.h b/Marlin/src/lcd/menu/game/brickout.h index 2d23bf4c6ebe..cf1fbc6d98bc 100644 --- a/Marlin/src/lcd/menu/game/brickout.h +++ b/Marlin/src/lcd/menu/game/brickout.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/game/game.cpp b/Marlin/src/lcd/menu/game/game.cpp index 18fb3c63dc08..c14bd2a68df8 100644 --- a/Marlin/src/lcd/menu/game/game.cpp +++ b/Marlin/src/lcd/menu/game/game.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/game/game.h b/Marlin/src/lcd/menu/game/game.h index a48c7b746146..e788f2980512 100644 --- a/Marlin/src/lcd/menu/game/game.h +++ b/Marlin/src/lcd/menu/game/game.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/game/invaders.cpp b/Marlin/src/lcd/menu/game/invaders.cpp index 31df47ce7f0f..56e4c224dd14 100644 --- a/Marlin/src/lcd/menu/game/invaders.cpp +++ b/Marlin/src/lcd/menu/game/invaders.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/game/invaders.h b/Marlin/src/lcd/menu/game/invaders.h index d2b8790ff080..c99e6c16ae76 100644 --- a/Marlin/src/lcd/menu/game/invaders.h +++ b/Marlin/src/lcd/menu/game/invaders.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/game/maze.cpp b/Marlin/src/lcd/menu/game/maze.cpp index d92f14ecd8b1..85f752ee7de5 100644 --- a/Marlin/src/lcd/menu/game/maze.cpp +++ b/Marlin/src/lcd/menu/game/maze.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/game/maze.h b/Marlin/src/lcd/menu/game/maze.h index 7917bab0d89d..ff5dde09f5e1 100644 --- a/Marlin/src/lcd/menu/game/maze.h +++ b/Marlin/src/lcd/menu/game/maze.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/game/snake.cpp b/Marlin/src/lcd/menu/game/snake.cpp index d6af22455312..f8892a4e7a39 100644 --- a/Marlin/src/lcd/menu/game/snake.cpp +++ b/Marlin/src/lcd/menu/game/snake.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/game/snake.h b/Marlin/src/lcd/menu/game/snake.h index c846d5646647..09a3a722de1e 100644 --- a/Marlin/src/lcd/menu/game/snake.h +++ b/Marlin/src/lcd/menu/game/snake.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/game/types.h b/Marlin/src/lcd/menu/game/types.h index 16ff8d82b675..f6e6c78aa063 100644 --- a/Marlin/src/lcd/menu/game/types.h +++ b/Marlin/src/lcd/menu/game/types.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index e858b5d5375a..2a9e4766d846 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 55a8c3934ddf..e8edea76d16b 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/menu_addon.h b/Marlin/src/lcd/menu/menu_addon.h index e66a19409f1e..c276c8865be2 100644 --- a/Marlin/src/lcd/menu/menu_addon.h +++ b/Marlin/src/lcd/menu/menu_addon.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 3def4689a5b9..81baa6156aa7 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp index bbeb6829e7cc..2aad9a415f0c 100644 --- a/Marlin/src/lcd/menu/menu_backlash.cpp +++ b/Marlin/src/lcd/menu/menu_backlash.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index fca5ca8af9d8..6dbe7c6d1801 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index fc13ab80315c..3796f44ff612 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp index f49e478c26f5..095e4eb7b1ad 100644 --- a/Marlin/src/lcd/menu/menu_cancelobject.cpp +++ b/Marlin/src/lcd/menu/menu_cancelobject.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 7845b75ea78b..ef3ad1ffed1d 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp index 1ba781197fbe..729254cda4a3 100644 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ b/Marlin/src/lcd/menu/menu_custom.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index 7c25ca0afc2b..6b99355a60c6 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 90639c3af521..869935b59a51 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_game.cpp b/Marlin/src/lcd/menu/menu_game.cpp index edf36e521b53..21e101404a52 100644 --- a/Marlin/src/lcd/menu/menu_game.cpp +++ b/Marlin/src/lcd/menu/menu_game.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 671fee099e06..697d4b767e7b 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_job_recovery.cpp b/Marlin/src/lcd/menu/menu_job_recovery.cpp index d19758429c3e..a2743ef58b5d 100644 --- a/Marlin/src/lcd/menu/menu_job_recovery.cpp +++ b/Marlin/src/lcd/menu/menu_job_recovery.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index a361d97d46f7..2719b3d8501c 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index b4f591a62cd5..51b67209dc5b 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index 7b3d1e549c94..c22314fa9f0a 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index 764e0423e2d3..3f57d257ad49 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index e2ce91934061..e9627b8411b4 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_mmu2.h b/Marlin/src/lcd/menu/menu_mmu2.h index 0221b4c765f3..4230c0146466 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.h +++ b/Marlin/src/lcd/menu/menu_mmu2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 1821161cb150..9b16b68e4e21 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp index 3486d54a574b..1627e7c80b32 100644 --- a/Marlin/src/lcd/menu/menu_power_monitor.cpp +++ b/Marlin/src/lcd/menu/menu_power_monitor.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index c2a0e9fc0cd8..00a98d12444a 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 38908b8d8c14..4be98f132d1b 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index f8c6eb3a8ade..e74619d295ed 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 1b386206d327..2d40318156e4 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 3eeee14d4de9..705b19869a8b 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/thermistornames.h b/Marlin/src/lcd/thermistornames.h index 1c66b2a7d265..bd0ca0e554e5 100644 --- a/Marlin/src/lcd/thermistornames.h +++ b/Marlin/src/lcd/thermistornames.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index bed72b19a399..45612f6c55c2 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 2b9efab359e1..f3c06177bb20 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index a664936adb05..dd85473e9802 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.h b/Marlin/src/libs/L64XX/L64XX_Marlin.h index 371f0991c23c..c8d273990f5a 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.h +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/bresenham.h b/Marlin/src/libs/bresenham.h index e18531498b11..ade231e26dc7 100644 --- a/Marlin/src/libs/bresenham.h +++ b/Marlin/src/libs/bresenham.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/buzzer.cpp b/Marlin/src/libs/buzzer.cpp index d684dce81625..84596953596c 100644 --- a/Marlin/src/libs/buzzer.cpp +++ b/Marlin/src/libs/buzzer.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/buzzer.h b/Marlin/src/libs/buzzer.h index 3a72a0bd86a6..022d94deafea 100644 --- a/Marlin/src/libs/buzzer.h +++ b/Marlin/src/libs/buzzer.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/circularqueue.h b/Marlin/src/libs/circularqueue.h index 54a6edaabe20..4d4a464b9c6a 100644 --- a/Marlin/src/libs/circularqueue.h +++ b/Marlin/src/libs/circularqueue.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/crc16.cpp b/Marlin/src/libs/crc16.cpp index 71cda50aebaa..c2195619c772 100644 --- a/Marlin/src/libs/crc16.cpp +++ b/Marlin/src/libs/crc16.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/crc16.h b/Marlin/src/libs/crc16.h index 65e036d08999..1760ecd6f880 100644 --- a/Marlin/src/libs/crc16.h +++ b/Marlin/src/libs/crc16.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/duration_t.h b/Marlin/src/libs/duration_t.h index 897ea1e8694d..31d8bab38581 100644 --- a/Marlin/src/libs/duration_t.h +++ b/Marlin/src/libs/duration_t.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/hex_print_routines.cpp b/Marlin/src/libs/hex_print_routines.cpp index 293192e6efbf..3ab81e596a0c 100644 --- a/Marlin/src/libs/hex_print_routines.cpp +++ b/Marlin/src/libs/hex_print_routines.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/hex_print_routines.h b/Marlin/src/libs/hex_print_routines.h index ac47ed7701c6..2fac6c989216 100644 --- a/Marlin/src/libs/hex_print_routines.h +++ b/Marlin/src/libs/hex_print_routines.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp index aac83f9aca8e..ce3a342b92ba 100644 --- a/Marlin/src/libs/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h index 721c499decad..5cd6a02514c5 100644 --- a/Marlin/src/libs/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 6796b4d11261..21e6ffb7cd13 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/nozzle.h b/Marlin/src/libs/nozzle.h index 3ff0670ce837..81594b13817d 100644 --- a/Marlin/src/libs/nozzle.h +++ b/Marlin/src/libs/nozzle.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index 709e58bdc5e2..3b36c180e838 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index 7943ba0dc3f5..e52a7d9889ce 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/private_spi.h b/Marlin/src/libs/private_spi.h index 9ce68c4909b2..c2a054235b48 100644 --- a/Marlin/src/libs/private_spi.h +++ b/Marlin/src/libs/private_spi.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/softspi.h b/Marlin/src/libs/softspi.h index 300eb9387118..5d48f9fd8cb9 100644 --- a/Marlin/src/libs/softspi.h +++ b/Marlin/src/libs/softspi.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/stopwatch.cpp b/Marlin/src/libs/stopwatch.cpp index 13706a5b8e40..601efe55178f 100644 --- a/Marlin/src/libs/stopwatch.cpp +++ b/Marlin/src/libs/stopwatch.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/stopwatch.h b/Marlin/src/libs/stopwatch.h index 24ba60196387..6e8e95a9a5f1 100644 --- a/Marlin/src/libs/stopwatch.h +++ b/Marlin/src/libs/stopwatch.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index c0da29e702bd..75a30aef8222 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h index bd596f2343ab..58428314d9d4 100644 --- a/Marlin/src/libs/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 9a9a805099c9..72ff0576283b 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/configuration_store.h b/Marlin/src/module/configuration_store.h index e96fe5909bfa..c654b11bd5ef 100644 --- a/Marlin/src/module/configuration_store.h +++ b/Marlin/src/module/configuration_store.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 3e8b69045579..9361729462a7 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index ff18e74c71c5..5e9a78bd8672 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index a9a0a7e9bf67..289270072d97 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index a5ae8d2f92ef..888d25a8bdf3 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 346042437d44..24ce57a764a7 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 6a984e5ebc53..d33ce623a466 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 8352c2b3a6a1..65a9e4e05927 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -1833,7 +1833,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif // Number of steps for each axis - // See http://www.corexy.com/theory.html + // See https://www.corexy.com/theory.html #if CORE_IS_XY block->steps.set(ABS(da + db), ABS(da - db), ABS(dc)); #elif CORE_IS_XZ diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 07bead3caf0c..f3a3a0e0fc7c 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp index 1377abc0349e..4025b773ed5c 100644 --- a/Marlin/src/module/planner_bezier.cpp +++ b/Marlin/src/module/planner_bezier.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/planner_bezier.h b/Marlin/src/module/planner_bezier.h index e7ef4719e1b0..41a88b4058fd 100644 --- a/Marlin/src/module/planner_bezier.h +++ b/Marlin/src/module/planner_bezier.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 244a2a97b3ac..86aedf2161a9 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/printcounter.h b/Marlin/src/module/printcounter.h index bb4cf3c795f4..66d8cbb7b38e 100644 --- a/Marlin/src/module/printcounter.h +++ b/Marlin/src/module/printcounter.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 524b6228bc54..4fab4ec27b49 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index f8cb9e9d00fa..14036a18d943 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 5fbbfd65a6bc..6c961827c772 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index 2f60ebbf1579..e2acaf30822c 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/servo.cpp b/Marlin/src/module/servo.cpp index 9ebfb03758ff..27e5a2af2e03 100644 --- a/Marlin/src/module/servo.cpp +++ b/Marlin/src/module/servo.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h index 335ce698e012..29bd3b8798d4 100644 --- a/Marlin/src/module/servo.h +++ b/Marlin/src/module/servo.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/speed_lookuptable.h b/Marlin/src/module/speed_lookuptable.h index 088cb23c7ff6..b173ebec0847 100644 --- a/Marlin/src/module/speed_lookuptable.h +++ b/Marlin/src/module/speed_lookuptable.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index b240c5519d71..20514853ea1b 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -38,7 +38,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Grbl. If not, see . + * along with Grbl. If not, see . */ /** @@ -2608,7 +2608,7 @@ void Stepper::init() { void Stepper::_set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { #if CORE_IS_XY // corexy positioning - // these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html + // these equations follow the form of the dA and dB equations on https://www.corexy.com/theory.html count_position.set(a + b, CORESIGN(a - b), c); #elif CORE_IS_XZ // corexz planning diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 4665f2dc012e..3b68553689cc 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -38,7 +38,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Grbl. If not, see . + * along with Grbl. If not, see . */ #include "../inc/MarlinConfig.h" diff --git a/Marlin/src/module/stepper/L64xx.cpp b/Marlin/src/module/stepper/L64xx.cpp index 74f2e12feda9..3e2bf0944666 100644 --- a/Marlin/src/module/stepper/L64xx.cpp +++ b/Marlin/src/module/stepper/L64xx.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/stepper/L64xx.h b/Marlin/src/module/stepper/L64xx.h index 989d84808f22..9c8b0b1bddee 100644 --- a/Marlin/src/module/stepper/L64xx.h +++ b/Marlin/src/module/stepper/L64xx.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/stepper/TMC26X.cpp b/Marlin/src/module/stepper/TMC26X.cpp index 9d9178b240ae..926f1a4e089f 100644 --- a/Marlin/src/module/stepper/TMC26X.cpp +++ b/Marlin/src/module/stepper/TMC26X.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/stepper/TMC26X.h b/Marlin/src/module/stepper/TMC26X.h index 39192cea2580..8977266b47bf 100644 --- a/Marlin/src/module/stepper/TMC26X.h +++ b/Marlin/src/module/stepper/TMC26X.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/stepper/indirection.cpp b/Marlin/src/module/stepper/indirection.cpp index c0702dc12d3a..6f9ac9ba0ab1 100644 --- a/Marlin/src/module/stepper/indirection.cpp +++ b/Marlin/src/module/stepper/indirection.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 0b36a5d0c022..a4db741966e0 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index 7d87853d81d4..3dda98698bb1 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h index 262e20840ef4..9cc3404cd2d7 100644 --- a/Marlin/src/module/stepper/trinamic.h +++ b/Marlin/src/module/stepper/trinamic.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index dfbcd0a15afc..1dc480a9279a 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 37700c7b8b9f..94eb42fd0fcd 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_1.h b/Marlin/src/module/thermistor/thermistor_1.h index 75ec433abc81..fad790837571 100644 --- a/Marlin/src/module/thermistor/thermistor_1.h +++ b/Marlin/src/module/thermistor/thermistor_1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_10.h b/Marlin/src/module/thermistor/thermistor_10.h index 991440bce523..c24ad40bf483 100644 --- a/Marlin/src/module/thermistor/thermistor_10.h +++ b/Marlin/src/module/thermistor/thermistor_10.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_1010.h b/Marlin/src/module/thermistor/thermistor_1010.h index 161e1385f9e6..8ab5e3b364c6 100644 --- a/Marlin/src/module/thermistor/thermistor_1010.h +++ b/Marlin/src/module/thermistor/thermistor_1010.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_1047.h b/Marlin/src/module/thermistor/thermistor_1047.h index cc99771be677..6e1b61f9d073 100644 --- a/Marlin/src/module/thermistor/thermistor_1047.h +++ b/Marlin/src/module/thermistor/thermistor_1047.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_11.h b/Marlin/src/module/thermistor/thermistor_11.h index 339f11d56b48..345d009a6498 100644 --- a/Marlin/src/module/thermistor/thermistor_11.h +++ b/Marlin/src/module/thermistor/thermistor_11.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_110.h b/Marlin/src/module/thermistor/thermistor_110.h index 264b6f5bab3f..215495e2c6a1 100644 --- a/Marlin/src/module/thermistor/thermistor_110.h +++ b/Marlin/src/module/thermistor/thermistor_110.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_12.h b/Marlin/src/module/thermistor/thermistor_12.h index 3b8cda870e74..d1ee23b2b7f7 100644 --- a/Marlin/src/module/thermistor/thermistor_12.h +++ b/Marlin/src/module/thermistor/thermistor_12.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_13.h b/Marlin/src/module/thermistor/thermistor_13.h index 9bf3e02081d8..bb622240c82d 100644 --- a/Marlin/src/module/thermistor/thermistor_13.h +++ b/Marlin/src/module/thermistor/thermistor_13.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_147.h b/Marlin/src/module/thermistor/thermistor_147.h index b1e782e11169..6d846ad5bed7 100644 --- a/Marlin/src/module/thermistor/thermistor_147.h +++ b/Marlin/src/module/thermistor/thermistor_147.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_15.h b/Marlin/src/module/thermistor/thermistor_15.h index 04d022101080..46dcce8c1e4f 100644 --- a/Marlin/src/module/thermistor/thermistor_15.h +++ b/Marlin/src/module/thermistor/thermistor_15.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_18.h b/Marlin/src/module/thermistor/thermistor_18.h index 0f12d6996ae4..9c2d81b3e698 100644 --- a/Marlin/src/module/thermistor/thermistor_18.h +++ b/Marlin/src/module/thermistor/thermistor_18.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_2.h b/Marlin/src/module/thermistor/thermistor_2.h index ec296ec670af..f07de0b5373e 100644 --- a/Marlin/src/module/thermistor/thermistor_2.h +++ b/Marlin/src/module/thermistor/thermistor_2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_20.h b/Marlin/src/module/thermistor/thermistor_20.h index a2d3c7a61833..73094f14604d 100644 --- a/Marlin/src/module/thermistor/thermistor_20.h +++ b/Marlin/src/module/thermistor/thermistor_20.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_201.h b/Marlin/src/module/thermistor/thermistor_201.h index 1ddd259172de..44d52806813a 100644 --- a/Marlin/src/module/thermistor/thermistor_201.h +++ b/Marlin/src/module/thermistor/thermistor_201.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_21.h b/Marlin/src/module/thermistor/thermistor_21.h index 144692cd12bd..cd867df29103 100644 --- a/Marlin/src/module/thermistor/thermistor_21.h +++ b/Marlin/src/module/thermistor/thermistor_21.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_22.h b/Marlin/src/module/thermistor/thermistor_22.h index dd4d9d9131c8..6f4a31050add 100644 --- a/Marlin/src/module/thermistor/thermistor_22.h +++ b/Marlin/src/module/thermistor/thermistor_22.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/thermistor/thermistor_23.h b/Marlin/src/module/thermistor/thermistor_23.h index eb156f4358de..02ff9fb2b6c8 100644 --- a/Marlin/src/module/thermistor/thermistor_23.h +++ b/Marlin/src/module/thermistor/thermistor_23.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/thermistor/thermistor_3.h b/Marlin/src/module/thermistor/thermistor_3.h index 1b44218d556d..74e00e2ba4f4 100644 --- a/Marlin/src/module/thermistor/thermistor_3.h +++ b/Marlin/src/module/thermistor/thermistor_3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_331.h b/Marlin/src/module/thermistor/thermistor_331.h index b8d4959a3be0..ccb0f6b62d2b 100644 --- a/Marlin/src/module/thermistor/thermistor_331.h +++ b/Marlin/src/module/thermistor/thermistor_331.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_332.h b/Marlin/src/module/thermistor/thermistor_332.h index 21c82ca12ebf..9502f1bdae9e 100644 --- a/Marlin/src/module/thermistor/thermistor_332.h +++ b/Marlin/src/module/thermistor/thermistor_332.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_4.h b/Marlin/src/module/thermistor/thermistor_4.h index 3cc6da9f25af..92d907249be9 100644 --- a/Marlin/src/module/thermistor/thermistor_4.h +++ b/Marlin/src/module/thermistor/thermistor_4.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_5.h b/Marlin/src/module/thermistor/thermistor_5.h index f1a04d2ed206..5d2c3e7b0424 100644 --- a/Marlin/src/module/thermistor/thermistor_5.h +++ b/Marlin/src/module/thermistor/thermistor_5.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_501.h b/Marlin/src/module/thermistor/thermistor_501.h index a1ef6e53cbd0..d40e341f7e31 100644 --- a/Marlin/src/module/thermistor/thermistor_501.h +++ b/Marlin/src/module/thermistor/thermistor_501.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_502.h b/Marlin/src/module/thermistor/thermistor_502.h index b414e562e6f5..69cee2431c5f 100644 --- a/Marlin/src/module/thermistor/thermistor_502.h +++ b/Marlin/src/module/thermistor/thermistor_502.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_51.h b/Marlin/src/module/thermistor/thermistor_51.h index 092bcb640814..d02dd47ba5d1 100644 --- a/Marlin/src/module/thermistor/thermistor_51.h +++ b/Marlin/src/module/thermistor/thermistor_51.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_512.h b/Marlin/src/module/thermistor/thermistor_512.h index ab59c585163a..e8021e1e48c4 100644 --- a/Marlin/src/module/thermistor/thermistor_512.h +++ b/Marlin/src/module/thermistor/thermistor_512.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/thermistor/thermistor_52.h b/Marlin/src/module/thermistor/thermistor_52.h index 031b094d8909..69666add20cf 100644 --- a/Marlin/src/module/thermistor/thermistor_52.h +++ b/Marlin/src/module/thermistor/thermistor_52.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_55.h b/Marlin/src/module/thermistor/thermistor_55.h index e137f174c773..2966d064eb83 100644 --- a/Marlin/src/module/thermistor/thermistor_55.h +++ b/Marlin/src/module/thermistor/thermistor_55.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_6.h b/Marlin/src/module/thermistor/thermistor_6.h index 35aeeabd77e5..68113419e583 100644 --- a/Marlin/src/module/thermistor/thermistor_6.h +++ b/Marlin/src/module/thermistor/thermistor_6.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_60.h b/Marlin/src/module/thermistor/thermistor_60.h index 3f43740b5e75..a3fe50559fd0 100644 --- a/Marlin/src/module/thermistor/thermistor_60.h +++ b/Marlin/src/module/thermistor/thermistor_60.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_61.h b/Marlin/src/module/thermistor/thermistor_61.h index 837ee3781a85..ed4c4c885956 100644 --- a/Marlin/src/module/thermistor/thermistor_61.h +++ b/Marlin/src/module/thermistor/thermistor_61.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_66.h b/Marlin/src/module/thermistor/thermistor_66.h index 0ab45d64d158..0ad5994ea811 100644 --- a/Marlin/src/module/thermistor/thermistor_66.h +++ b/Marlin/src/module/thermistor/thermistor_66.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_666.h b/Marlin/src/module/thermistor/thermistor_666.h index ab8b0380f10b..86493988e053 100644 --- a/Marlin/src/module/thermistor/thermistor_666.h +++ b/Marlin/src/module/thermistor/thermistor_666.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_67.h b/Marlin/src/module/thermistor/thermistor_67.h index 11fdca856835..7d6d7f697df3 100644 --- a/Marlin/src/module/thermistor/thermistor_67.h +++ b/Marlin/src/module/thermistor/thermistor_67.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_7.h b/Marlin/src/module/thermistor/thermistor_7.h index 1e6ab1d34ae3..7a737559841c 100644 --- a/Marlin/src/module/thermistor/thermistor_7.h +++ b/Marlin/src/module/thermistor/thermistor_7.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_70.h b/Marlin/src/module/thermistor/thermistor_70.h index d81424f9b611..466b9255533e 100644 --- a/Marlin/src/module/thermistor/thermistor_70.h +++ b/Marlin/src/module/thermistor/thermistor_70.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_71.h b/Marlin/src/module/thermistor/thermistor_71.h index c7bab2a0bcac..abd7fc5b986e 100644 --- a/Marlin/src/module/thermistor/thermistor_71.h +++ b/Marlin/src/module/thermistor/thermistor_71.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_75.h b/Marlin/src/module/thermistor/thermistor_75.h index 1df64cc420ea..79800d2e4048 100644 --- a/Marlin/src/module/thermistor/thermistor_75.h +++ b/Marlin/src/module/thermistor/thermistor_75.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_8.h b/Marlin/src/module/thermistor/thermistor_8.h index ec97df613387..9e19168fed0d 100644 --- a/Marlin/src/module/thermistor/thermistor_8.h +++ b/Marlin/src/module/thermistor/thermistor_8.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_9.h b/Marlin/src/module/thermistor/thermistor_9.h index e194df57c1ff..29097420ec11 100644 --- a/Marlin/src/module/thermistor/thermistor_9.h +++ b/Marlin/src/module/thermistor/thermistor_9.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_99.h b/Marlin/src/module/thermistor/thermistor_99.h index b6d6bbac9d02..839a511c0918 100644 --- a/Marlin/src/module/thermistor/thermistor_99.h +++ b/Marlin/src/module/thermistor/thermistor_99.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/thermistor/thermistor_998.h b/Marlin/src/module/thermistor/thermistor_998.h index 2802121c5040..e4cfbbaa0d2f 100644 --- a/Marlin/src/module/thermistor/thermistor_998.h +++ b/Marlin/src/module/thermistor/thermistor_998.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistor_999.h b/Marlin/src/module/thermistor/thermistor_999.h index cf6ebb3ae1d5..0271c47f8585 100644 --- a/Marlin/src/module/thermistor/thermistor_999.h +++ b/Marlin/src/module/thermistor/thermistor_999.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index afb3148dfd9e..44680a7baa41 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index b5c208495097..225f4cbb916b 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index d39d7bc7833f..d0cb57841bf1 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index 829c391c4dfe..e66bb669f71c 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -24,7 +24,7 @@ /** * E4d@Box pin assignments * E4d@Box is a small factor 3D printer control board based on the ESP32 microcontroller for Laser, CNC and 3d printers - * for more info check http://atbox.tech/ and join to Facebook page E4d@box. + * for more info check https://atbox.tech/ and join to Facebook page E4d@box. */ #ifndef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/pins/esp32/pins_ESP32.h b/Marlin/src/pins/esp32/pins_ESP32.h index e4da400528ed..5f793f1cf2e4 100644 --- a/Marlin/src/pins/esp32/pins_ESP32.h +++ b/Marlin/src/pins/esp32/pins_ESP32.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index 8a06f9a1693b..8a5b11ed71c6 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index 3dd50489df13..b38a88351d5a 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h index 11699375cf89..9361680c2371 100644 --- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h +++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -509,7 +509,7 @@ #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 diff --git a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h index 4561ff01639e..ffc149279c29 100644 --- a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h +++ b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h index 75dcbe06c92b..6ccfca1cac22 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index 4f43a2ad32c3..20edcb07a76f 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h index 3ec16ef48c09..d5e256066259 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index 612798c23dbc..9e26a335974b 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 00d815ff51d6..f467ba58cbec 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 6502edd49be3..cc35dfb0d4eb 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 8ff565fa8fa5..7012068d615b 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 054f155117e6..db8551c114a1 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 5a8e1ad63595..c4bc90c17f67 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 596c40540198..554c060cb44f 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -293,7 +293,7 @@ * All controllers can use J3 and J5 on the Re-ARM board. Custom cabling will be required. * * - https://github.com/wolfmanjm/universal-panel-adapter - * - http://panucattdevices.freshdesk.com/support/solutions/articles/1000243195-lcd-display-installation + * - https://panucattdevices.freshdesk.com/support/solutions/articles/1000243195-lcd-display-installation */ /** diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h index df7665f0ee7b..e717511c124f 100644 --- a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h +++ b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h index 4296f6927454..83cf17eee9f9 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index 306688bef3fc..042b724e8cfd 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h index 4b731ae9d343..592f666e391e 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h index 8255a55f02f5..a751286e3a81 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h index 9efddf210a59..d5c7d9868f97 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h index a32e55db92db..387090288184 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index 293ddce140c8..23275e86b6c8 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 6b147740a409..0712a274bbe6 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index bb03335c57d2..a1d3b08caa8f 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h index 7b0c0010a3b0..90d4340ba8f3 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h index d56d08c9e0f4..18bcc9e407e3 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h index 5db94b3d96f7..6f792ad5fa5c 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h index b021df109a08..7040c2babb18 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h index 29ec8e938ef7..4af0d991e962 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_EINSTART-S.h b/Marlin/src/pins/mega/pins_EINSTART-S.h index 8bb8f081f57e..eeaf0c419741 100644 --- a/Marlin/src/pins/mega/pins_EINSTART-S.h +++ b/Marlin/src/pins/mega/pins_EINSTART-S.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_ELEFU_3.h b/Marlin/src/pins/mega/pins_ELEFU_3.h index 3d35a72b1939..685611f78d22 100644 --- a/Marlin/src/pins/mega/pins_ELEFU_3.h +++ b/Marlin/src/pins/mega/pins_ELEFU_3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index 885751d319f6..ebfdd24bb49a 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h index 1a9fcfd27082..7e2ce20c6798 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 34d1f8122704..9b396d8db250 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h index 5e322a035624..e1956488c6c7 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h b/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h index 0f06aaf25642..26721df3641e 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index f296f1ba3e2e..2cbac0723c83 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h index c688823ddf75..19725eda2ffd 100644 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_LEAPFROG.h b/Marlin/src/pins/mega/pins_LEAPFROG.h index 188cbcad3da8..99872e1fb4e7 100644 --- a/Marlin/src/pins/mega/pins_LEAPFROG.h +++ b/Marlin/src/pins/mega/pins_LEAPFROG.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h index 36cb0e2c142d..61f5508cdc04 100644 --- a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h +++ b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h index bcb0f77570c9..6b90b884c239 100644 --- a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h +++ b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index db50dddc7d81..84346e5f6696 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index f3551114e241..481dc35fa3a1 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h index 3bee7e5f1a93..093889674873 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index b3a9f3916765..59fd1e54f8b9 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_MINITRONICS.h b/Marlin/src/pins/mega/pins_MINITRONICS.h index 35d1b59ecbfb..138d4b443111 100644 --- a/Marlin/src/pins/mega/pins_MINITRONICS.h +++ b/Marlin/src/pins/mega/pins_MINITRONICS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h index 4e02127c1206..bbccc93561e8 100644 --- a/Marlin/src/pins/mega/pins_OVERLORD.h +++ b/Marlin/src/pins/mega/pins_OVERLORD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h index 490316b624cb..40ef3a610f7e 100644 --- a/Marlin/src/pins/mega/pins_PICA.h +++ b/Marlin/src/pins/mega/pins_PICA.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/mega/pins_PICAOLD.h b/Marlin/src/pins/mega/pins_PICAOLD.h index 34861277a889..f53a4cdcd258 100644 --- a/Marlin/src/pins/mega/pins_PICAOLD.h +++ b/Marlin/src/pins/mega/pins_PICAOLD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/mega/pins_SILVER_GATE.h b/Marlin/src/pins/mega/pins_SILVER_GATE.h index dbe473ddb9b8..a67725d9bce6 100644 --- a/Marlin/src/pins/mega/pins_SILVER_GATE.h +++ b/Marlin/src/pins/mega/pins_SILVER_GATE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h index 6c53b7ea4e62..ba7f64768b0f 100644 --- a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h +++ b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index e92001a25c9e..ba8a47324197 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index c08acd383621..0766d818e75f 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 04ec39f4237c..3307cbde97e8 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 630d993d21a1..76c3f131a96e 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index ed5b008bf8d1..0df977a05bbd 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index 18bc3ddd1677..f89bba2d7ff1 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index fecbb2620dea..5abf1f2d90d0 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -34,7 +34,7 @@ * * Instructions for installing the Arduino RAMBo board type for the * Arduino IDE are available at: - * http://reprap.org/wiki/Rambo_firmware + * https://reprap.org/wiki/Rambo_firmware */ /** diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h index 5439929ba7cd..bba628f30782 100644 --- a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h +++ b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h index 974e9ad8b868..1989a1657fdb 100644 --- a/Marlin/src/pins/ramps/pins_3DRAG.h +++ b/Marlin/src/pins/ramps/pins_3DRAG.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -34,7 +34,7 @@ #endif #ifndef DEFAULT_SOURCE_CODE_URL - #define DEFAULT_SOURCE_CODE_URL "http://3dprint.elettronicain.it/" + #define DEFAULT_SOURCE_CODE_URL "https://3dprint.elettronicain.it/" #endif // diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h index a38e4e1b43aa..d142fb903e55 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h index 7605f10b6799..a23ada0aca2f 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h index 1aa9b67f7c1b..af1adabbbcd2 100644 --- a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h +++ b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h b/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h index 738b522e6680..b31df115637d 100644 --- a/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h +++ b/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h index 99392117962e..1420aaaa56d2 100644 --- a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h +++ b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h b/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h index 8f61ef47dc68..b9eee6bd5329 100644 --- a/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h +++ b/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h index 9ff9d3be62ed..21c3f6dbfee8 100644 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_FELIX2.h b/Marlin/src/pins/ramps/pins_FELIX2.h index bfd341db6d3d..6cc6997adc56 100644 --- a/Marlin/src/pins/ramps/pins_FELIX2.h +++ b/Marlin/src/pins/ramps/pins_FELIX2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h index c95db793c1af..f1e6e6727c75 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h index 3ed9fb969252..843eadb432fe 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h index c98ba6aff406..4a9b9e1d5964 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h index 2a789a216780..a804df4ed394 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index d3d3f0043fd7..ffaa72d988e7 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h index 0597e23a1600..4280204b99d9 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_K8200.h b/Marlin/src/pins/ramps/pins_K8200.h index 605223290780..5d4d2d7022a5 100644 --- a/Marlin/src/pins/ramps/pins_K8200.h +++ b/Marlin/src/pins/ramps/pins_K8200.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_K8400.h b/Marlin/src/pins/ramps/pins_K8400.h index 4c5ba7eca198..c36e291598eb 100644 --- a/Marlin/src/pins/ramps/pins_K8400.h +++ b/Marlin/src/pins/ramps/pins_K8400.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_K8600.h b/Marlin/src/pins/ramps/pins_K8600.h index 17c230fe32a3..0de01927528c 100644 --- a/Marlin/src/pins/ramps/pins_K8600.h +++ b/Marlin/src/pins/ramps/pins_K8600.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h index 09f35b1fe0f8..2783f69896a5 100644 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h b/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h index 6a31142450ae..a42dba874f41 100644 --- a/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h +++ b/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_10.h b/Marlin/src/pins/ramps/pins_MKS_BASE_10.h index b1010482c168..0be58653aadf 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_10.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_10.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_14.h b/Marlin/src/pins/ramps/pins_MKS_BASE_14.h index 0d5929b71448..3612f9b894c6 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_14.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_14.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_15.h b/Marlin/src/pins/ramps/pins_MKS_BASE_15.h index 683c6b7d0ee9..9e670d1bbdc8 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_15.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_15.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h index b769d655d695..42796acf8b6a 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h b/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h index 1b06657f09a9..3ce138b9751e 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_common.h b/Marlin/src/pins/ramps/pins_MKS_BASE_common.h index 2d0617190657..9047a4bcf0e6 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_common.h +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_common.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h index c4c90ba6fa03..08dd0f44bdfe 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L.h index ea45f912381a..522a34cda199 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h index 3236627c3b52..20f3dece4273 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_ORTUR_4.h b/Marlin/src/pins/ramps/pins_ORTUR_4.h index 91236cc38f63..cef01bf62a46 100644 --- a/Marlin/src/pins/ramps/pins_ORTUR_4.h +++ b/Marlin/src/pins/ramps/pins_ORTUR_4.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 7059bbb59927..e32c79afa9dd 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -553,7 +553,7 @@ #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 40 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN1 40 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. #define BTN_EN2 42 #define BTN_ENC -1 diff --git a/Marlin/src/pins/ramps/pins_RAMPS_13.h b/Marlin/src/pins/ramps/pins_RAMPS_13.h index 3e3f1499378b..032dd79c234d 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_13.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_13.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h index 601edc83d002..b2a412e305c8 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h b/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h index f2298d255735..ad56b7f9d1e9 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h index d6b08a1d6806..513c7fe8d5d6 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h index b3d1a7ca6363..d154b2fdd039 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h index f93b6dcc86fe..9af4a3e05c0f 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h index f319172bbbbb..c43d786aa2e2 100644 --- a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h +++ b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h index d56ab1bb7f27..406cbec8167f 100644 --- a/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h +++ b/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RL200.h b/Marlin/src/pins/ramps/pins_RL200.h index 7b0303476b08..3fccb90276f4 100644 --- a/Marlin/src/pins/ramps/pins_RL200.h +++ b/Marlin/src/pins/ramps/pins_RL200.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h index fd220dc5b79c..5b4f830328f6 100644 --- a/Marlin/src/pins/ramps/pins_RUMBA.h +++ b/Marlin/src/pins/ramps/pins_RUMBA.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h b/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h index 7dfa747bf450..39942613ffbf 100644 --- a/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h +++ b/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h b/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h index 2e944904604c..e15fc94ac4f4 100644 --- a/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h +++ b/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_TANGO.h b/Marlin/src/pins/ramps/pins_TANGO.h index 9be5c04b69a7..715444cee216 100644 --- a/Marlin/src/pins/ramps/pins_TANGO.h +++ b/Marlin/src/pins/ramps/pins_TANGO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h index 109340b3f3fa..98a20fb3fde1 100644 --- a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h +++ b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h index b29988823d8c..9508be0173d6 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index ce3160ffe93e..6382d3af51ad 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h index 92ed852867e9..d02a063e8086 100644 --- a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h +++ b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index f5c79d0b574b..ab3dc1a32b60 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -392,7 +392,7 @@ #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index b0a3f23249ed..cbf9523eacc0 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index 4e666b78cedb..f316fad7783b 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index 6872adf9ba35..955801558457 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_VORON.h b/Marlin/src/pins/ramps/pins_VORON.h index 31b273d09e6f..40ec71b6f0fb 100644 --- a/Marlin/src/pins/ramps/pins_VORON.h +++ b/Marlin/src/pins/ramps/pins_VORON.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V20.h b/Marlin/src/pins/ramps/pins_ZRIB_V20.h index 4ca20a707fb5..90433c62d751 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V20.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V20.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h index f55ec51567a3..4bf63f348f14 100644 --- a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h +++ b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h index 116a6b87eecc..289fa462cc8e 100644 --- a/Marlin/src/pins/sam/pins_ADSK.h +++ b/Marlin/src/pins/sam/pins_ADSK.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index 8b035e887604..dfe077ee4d45 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h index a0d7d1b7429f..134049781aca 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM1.h +++ b/Marlin/src/pins/sam/pins_ARCHIM1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h index 03d5ebef198e..bbd4804dbd50 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM2.h +++ b/Marlin/src/pins/sam/pins_ARCHIM2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h index e1f34bdfe062..b977ad1aba54 100644 --- a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h +++ b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index 8f1fb750122f..e0a56137f730 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 34706d5e90ac..9a488e312682 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index b3a9e456a29e..5d8716b67887 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index 0e67a77578cc..475a15d6f6de 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_RAMPS4DUE.h b/Marlin/src/pins/sam/pins_RAMPS4DUE.h index 5cb4f75f27fb..2bd894f9ae27 100644 --- a/Marlin/src/pins/sam/pins_RAMPS4DUE.h +++ b/Marlin/src/pins/sam/pins_RAMPS4DUE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h index 5da157baf276..5f8864ab1468 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h index 297aaa9cb82c..eb9889607d37 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h index 9dbae7773c84..55a42b2a4709 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h index bcd3f288ee5c..4c26d19cafdb 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_SMART.h +++ b/Marlin/src/pins/sam/pins_RAMPS_SMART.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 71596087de83..22353611b61b 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * * Ported sys0724 & Vynt */ diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 434223a2a45d..19b8ac97754b 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * * Ported sys0724 & Vynt */ diff --git a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h index ae01d5da4c1c..671307bc00cf 100644 --- a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h +++ b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index d95e86907f2b..319584b5eb56 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -420,7 +420,7 @@ #elif ENABLED(LCD_I2C_VIKI) // TO TEST - //#define BTN_EN1 40 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + //#define BTN_EN1 40 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. //#define BTN_EN2 42 //#define BTN_ENC -1 diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index 73145a3cdbb7..a2ef1e2c17dd 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -82,7 +82,7 @@ * Additional info: * * Anet Schematics - https://github.com/ralf-e/ANET-3D-Board-V1.0 - * Wiring RRDFG Smart Controller - http://www.thingiverse.com/thing:2103748 + * Wiring RRDFG Smart Controller - https://www.thingiverse.com/thing:2103748 * SkyNet3D Anet software development - https://github.com/SkyNet3D/Marlin/ * Anet Users / Skynet SW on Facebook - https://www.facebook.com/skynet3ddevelopment/ * @@ -209,7 +209,7 @@ * ==================================================================== * * Anet V1.0 controller | ZONESTAR_LCD | ANET_FULL_ | RepRapDiscount Full | Thingiverse RepRap wiring - * physical logical alt | | GRAPHICS_LCD | Graphics Display Wiring | http://www.thingiverse + * physical logical alt | | GRAPHICS_LCD | Graphics Display Wiring | https://www.thingiverse * pin pin functions | | | | .com/thing:2103748 *------------------------------------------------------------------------------------------------------------------------ * ANET-J3.1 8 *** | N/A | J3_TX *** | | diff --git a/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h b/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h index 4c991c5e9ef9..c3c38eb6f308 100644 --- a/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h +++ b/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h index b9a917d65de1..901e326742ab 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h index 6cd6fdaf27b3..a28b4c039ca9 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h index dd00e6f42b1a..ad54f3cd76f3 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6.h +++ b/Marlin/src/pins/sanguino/pins_GEN6.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h b/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h index 14e1c67b6fe8..a40c2ec15fde 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h +++ b/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h index bb0e44a3002a..75b75cdc6fd4 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_12.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_12.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_GEN7_13.h b/Marlin/src/pins/sanguino/pins_GEN7_13.h index 728dfd8a5ce4..6743c8cf75fc 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_13.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_13.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h index f53563cdece4..af0d824151d5 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_14.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h index a3279eb8e6b1..27ec622fcea7 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_MELZI.h b/Marlin/src/pins/sanguino/pins_MELZI.h index b73c1150de9e..887aae18584a 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI.h +++ b/Marlin/src/pins/sanguino/pins_MELZI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index 95466b327d7d..4817ce804349 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -28,7 +28,7 @@ * If you don't have a chip programmer you can use a spare Arduino plus a few * electronic components to write the bootloader. * - * See http://www.instructables.com/id/Burn-Arduino-Bootloader-with-Arduino-MEGA/ + * See https://www.instructables.com/id/Burn-Arduino-Bootloader-with-Arduino-MEGA/ * * Schematic: https://bit.ly/2XOnsWb */ diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h b/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h index 59baa2d6dd9b..0e09c1f00558 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h index 1b14d6efb0fc..8128fb86e664 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h index 1221c20806d7..9e433f19c424 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h index 33462d102a42..1cdf51117fed 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_V2.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_V2.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_OMCA.h b/Marlin/src/pins/sanguino/pins_OMCA.h index 774910bd7d46..eb5786dd11b0 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA.h +++ b/Marlin/src/pins/sanguino/pins_OMCA.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_OMCA_A.h b/Marlin/src/pins/sanguino/pins_OMCA_A.h index 73237743b820..922ef69b5e64 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA_A.h +++ b/Marlin/src/pins/sanguino/pins_OMCA_A.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index d5f09bd10b92..83c2d56d2b36 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h index 3254a01a15bd..c5c8b4f57e57 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_SETHI.h b/Marlin/src/pins/sanguino/pins_SETHI.h index b945869cbccb..19fea9ff537c 100644 --- a/Marlin/src/pins/sanguino/pins_SETHI.h +++ b/Marlin/src/pins/sanguino/pins_SETHI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sanguino/pins_STB_11.h b/Marlin/src/pins/sanguino/pins_STB_11.h index 774fb00403cb..b10a09840aaa 100644 --- a/Marlin/src/pins/sanguino/pins_STB_11.h +++ b/Marlin/src/pins/sanguino/pins_STB_11.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h index 9ca5aa1ee2f2..5f61389cf977 100644 --- a/Marlin/src/pins/sensitive_pins.h +++ b/Marlin/src/pins/sensitive_pins.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h index e8b4eed2fd32..0e5bd58987eb 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h index 88604496d28f..b8c2ed950392 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 7aa02eb3e7c7..3801a9bae4b5 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h index a5141ac27fe9..b658f3d714b8 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h index 829975861aa0..8d384c739681 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h index d6ca37942cfc..cb94f0bdcacd 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index c1b2f3624997..a8df0e5c02df 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index 5066fc04f522..db31eb377fcb 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index 0978369e0b4c..f99721f144a6 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index 810d916ccfb7..e3b7d2f547cf 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -186,7 +186,7 @@ #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 PB6 // 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN1 PB6 // 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. #define BTN_EN2 PA7 // 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index d99bba8369ab..8f529085c91f 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index a686b8af8311..021c2e176110 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 4c9aa1627081..cf7594f78428 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index a39635b91160..f56f580fc44b 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 500a420babba..7143176bd7fc 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h index 9c6412c0cb53..f07320db404c 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index a3645aff6e7c..03f9ce0216e4 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 947bbe55cbcb..3f5a39a90c03 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index a3645aff6e7c..03f9ce0216e4 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index 242368a67276..c39c89e42cec 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index 9ec0f267343f..c68c059265e4 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 87f1695b238b..e99b70270093 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h index 6e96df45c1b6..6a8f316b0dc2 100644 --- a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h +++ b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 7830f14f9852..86b6f613d2d8 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h index 46c80e9b63b6..2028cd9dd4d0 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h index 0b8a44327a72..d1f6dece5c15 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 155db5a2238d..0f55de824573 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index 07630160ba18..3cf0bce06d36 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index ab52cd6d1eb8..9cf8685dfab5 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 163d3e41e9f7..a4c179afce23 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index a86a4d0719a8..1d0fd15c23b2 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 2db04f55e570..2d6c98eb1e40 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h index 7311d91a80ff..1cd3780ec59d 100644 --- a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h +++ b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index d144c0e69244..475f31cb71c3 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -163,7 +163,7 @@ #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index 58b13b90dfe9..16e665621cd9 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -186,7 +186,7 @@ #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 0aec1f88c75c..2ca5897e9e69 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h index d98c79363954..232337f6df99 100644 --- a/Marlin/src/pins/stm32f4/pins_ARMED.h +++ b/Marlin/src/pins/stm32f4/pins_ARMED.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h index 5be4368789f0..676f1f8c9bfb 100644 --- a/Marlin/src/pins/stm32f4/pins_BEAST.h +++ b/Marlin/src/pins/stm32f4/pins_BEAST.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -186,7 +186,7 @@ #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index 91903b5883db..e0e827262fc9 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index a7594458f3cc..0e81237ad91b 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 4ecee9ce1dc1..776ab1d811b2 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.h index 64a8ddb35476..fb4b17b6fb22 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.h index 01ab1617662b..615751b62d37 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 42e3f1fac0a3..b6bb854d5be0 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 984cd13d86cb..497db5817b76 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 701bf2d7ad1b..03960584fb2f 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h index 355d1eb54ff0..b84c72466729 100644 --- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h +++ b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 114c44071526..126d571464ee 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index 258cd697fe7c..8f9a4339cd07 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index a9efe102102b..745d911e3a7a 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -13,7 +13,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h index 0aa6f709f67c..bb04cb82ecf3 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h index 12108fc1394b..de8d13c546dd 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h index 118b8d875f0e..d67962b1a61e 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 50c9949f3273..aa481a8b7433 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h index e9ae3f57048e..a0bd38b6acdc 100644 --- a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h +++ b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index 3a884f3544d1..01e9da590a58 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h index 3fba28161ee2..6706d26f645d 100644 --- a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h +++ b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/stm32f7/pins_THE_BORG.h b/Marlin/src/pins/stm32f7/pins_THE_BORG.h index ffb6638213ba..fa4279920ca0 100644 --- a/Marlin/src/pins/stm32f7/pins_THE_BORG.h +++ b/Marlin/src/pins/stm32f7/pins_THE_BORG.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h index 4ee74660ead9..f473ad145e62 100644 --- a/Marlin/src/pins/teensy2/pins_5DPRINT.h +++ b/Marlin/src/pins/teensy2/pins_5DPRINT.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -31,7 +31,7 @@ * There are two Arduino IDE extensions that are compatible with this board * and with the mainstream Marlin software. * - * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu * * Installation instructions are at the above URL. Don't bother loading the diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h index f7597dbbae74..ce1b4e3bbf74 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h index 575428f097b2..eeca39c14c9f 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -44,7 +44,7 @@ * There are two Arduino IDE extensions that are compatible with this board * and with the mainstream Marlin software. * - * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu * * Installation instructions are at the above URL. Don't bother loading the diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index 68c548f83313..51080b2fd19f 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -31,7 +31,7 @@ * There are two Arduino IDE extensions that are compatible with this board * and with the mainstream Marlin software. * - * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu * * Installation instructions are at the above URL. Don't bother loading the diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index c0e089a11244..7bf0f334f4ee 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h index 01003b056d8e..cdd9b634bdb7 100644 --- a/Marlin/src/pins/teensy2/pins_SAV_MKI.h +++ b/Marlin/src/pins/teensy2/pins_SAV_MKI.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -31,7 +31,7 @@ * There are two Arduino IDE extensions that are compatible with this board * and with the mainstream Marlin software. * - * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu * * Installation instructions are at the above URL. Don't bother loading the diff --git a/Marlin/src/pins/teensy2/pins_TEENSY2.h b/Marlin/src/pins/teensy2/pins_TEENSY2.h index f72cb2bfd35a..9ef31e84ba07 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSY2.h +++ b/Marlin/src/pins/teensy2/pins_TEENSY2.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -31,7 +31,7 @@ * There are two Arduino IDE extensions that are compatible with this board * and with the mainstream Marlin software. * - * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu * * Installation instructions are at the above URL. Don't bother loading the @@ -65,8 +65,8 @@ /** * Teensy++ 2.0 Breadboard pin assignments (AT90USB1286) * Requires the Teensyduino software with Teensy++ 2.0 selected in Arduino IDE! - * http://www.pjrc.com/teensy/teensyduino.html - * See http://reprap.org/wiki/Printrboard for more info + * https://www.pjrc.com/teensy/teensyduino.html + * See https://reprap.org/wiki/Printrboard for more info * * CLI build: HARDWARE_MOTHERBOARD=84 make * diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index 5061b849cf32..8ee07a427d8c 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -30,7 +30,7 @@ * There are two Arduino IDE extensions that are compatible with this board * and with the mainstream Marlin software. All have been used with Arduino 1.6.12 * - * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu * * Installation instructions are at the above URL. Don't bother loading the diff --git a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h index cdd396bc1342..863137e9c877 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -24,7 +24,7 @@ /** * Teensy 3.1 (MK20DX256) and Teensy 3.2 (MK20DX256) Breadboard pin assignments * Requires the Teensyduino software with Teensy 3.1 or Teensy 3.2 selected in Arduino IDE! - * http://www.pjrc.com/teensy/teensyduino.html + * https://www.pjrc.com/teensy/teensyduino.html */ #if !IS_32BIT_TEENSY diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h index 8528533d7b8b..02d8374f23ed 100644 --- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h +++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once @@ -24,7 +24,7 @@ /**************************************************************************************** * Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) Breadboard pin assignments * Requires the Teensyduino software with Teensy 3.5 or Teensy 3.6 selected in Arduino IDE! -* http://www.pjrc.com/teensy/teensyduino.html +* https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ #if !IS_32BIT_TEENSY diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index b5a3960890c8..c56d690b2ed2 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index 72590451bc0c..da19283ef1ec 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/Sd2Card_sdio.h b/Marlin/src/sd/Sd2Card_sdio.h index 50399a3af960..10fb757359f4 100644 --- a/Marlin/src/sd/Sd2Card_sdio.h +++ b/Marlin/src/sd/Sd2Card_sdio.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 6e43c9f7c695..98d762f10b6a 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/sd/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h index dbdcf0b58226..13a1be863d0f 100644 --- a/Marlin/src/sd/SdBaseFile.h +++ b/Marlin/src/sd/SdBaseFile.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/SdFatConfig.h b/Marlin/src/sd/SdFatConfig.h index 5057d16a8d3e..2e03a4181f7e 100644 --- a/Marlin/src/sd/SdFatConfig.h +++ b/Marlin/src/sd/SdFatConfig.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h index 0412852cdd01..dc6fb7d263bf 100644 --- a/Marlin/src/sd/SdFatStructs.h +++ b/Marlin/src/sd/SdFatStructs.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/SdFatUtil.cpp b/Marlin/src/sd/SdFatUtil.cpp index 08b21e5f352e..e2c467c5b6d4 100644 --- a/Marlin/src/sd/SdFatUtil.cpp +++ b/Marlin/src/sd/SdFatUtil.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/sd/SdFatUtil.h b/Marlin/src/sd/SdFatUtil.h index d820d3cb4d55..7afed2ede06b 100644 --- a/Marlin/src/sd/SdFatUtil.h +++ b/Marlin/src/sd/SdFatUtil.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp index cc0e7fc347b9..a4f048d9502c 100644 --- a/Marlin/src/sd/SdFile.cpp +++ b/Marlin/src/sd/SdFile.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/sd/SdFile.h b/Marlin/src/sd/SdFile.h index 4f235f497686..52c8f1f0dbbc 100644 --- a/Marlin/src/sd/SdFile.h +++ b/Marlin/src/sd/SdFile.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/SdInfo.h b/Marlin/src/sd/SdInfo.h index 9d6674dfa1fa..4affa21c509e 100644 --- a/Marlin/src/sd/SdInfo.h +++ b/Marlin/src/sd/SdInfo.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/SdVolume.cpp b/Marlin/src/sd/SdVolume.cpp index 0effc31aa57d..63731f728c60 100644 --- a/Marlin/src/sd/SdVolume.cpp +++ b/Marlin/src/sd/SdVolume.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/sd/SdVolume.h b/Marlin/src/sd/SdVolume.h index 1912b7adf665..1ffa888468be 100644 --- a/Marlin/src/sd/SdVolume.h +++ b/Marlin/src/sd/SdVolume.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 5b4054f21cbf..bc1f88083a53 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 8efa6c720e09..62a6d87acf69 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index c132b4a3b64f..78f338fdae0c 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index f7e59a282afb..55a1099a3a25 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp index 5601446f8108..8f0dbf42e957 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ /* USB functions */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h index 195b26e940ca..b1ec14699983 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h index 472fed59cf6e..838b927678ab 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h index f51e43f0ea8c..373b95a7f9bf 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h index 10478eb6441d..9ed35fff65c8 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h index 59c3b48f67b5..c948e5aba022 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h index 0fb5c02ff112..40e3e02a2f90 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp index 2512e3846c63..8ead0b0093b6 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h index 960651ff2fc2..e6cece7ffdb6 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ @@ -67,7 +67,7 @@ #define MASS_CMD_DIR_IN 0x80 //(1 << 7) /* - * Reference documents from T10 (http://www.t10.org) + * Reference documents from T10 (https://www.t10.org) * SCSI Primary Commands - 3 (SPC-3) * SCSI Block Commands - 2 (SBC-2) * Multi-Media Commands - 5 (MMC-5) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h index 39845fb730b2..6451981fb742 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp index 0ab58b91f3ed..dcc309025a69 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h index 960120d18d2c..12195dcf62a9 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp index 0c7061b77c30..5d25576c40c6 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h index 28a28414463e..403766da8ff1 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h index 2cde3fc34148..1e369fde2c91 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h index 41821173d36b..2de0d465e8f3 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ @@ -132,7 +132,7 @@ #if GCC_VERSION < 40602 // Test for GCC < 4.6.2 #ifdef PROGMEM #undef PROGMEM - #define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4 + #define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4 #ifdef PSTR #undef PSTR #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) // Copied from pgmspace.h in avr-libc source diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h index a08d58b23169..99c628f888d3 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h @@ -19,7 +19,7 @@ * ------------------- * * Circuits At Home, LTD - * Web : http://www.circuitsathome.com + * Web : https://www.circuitsathome.com * e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp index 16051b34c345..eb58f37d2f5a 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /* What follows is a modified version of the MAX3421e originally defined in diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h index 8fdad47ac2ec..07ca811a4def 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ #pragma once diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h index 26ed852a279e..b35e53686e8a 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h index 6ad9cff7f086..45830de9a162 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h index 1050d70c74e2..f127b4ed5348 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ @@ -28,7 +28,7 @@ e-mail : support@circuitsathome.com #define UHS_SCSI_H /* - * Reference documents from T10 (http://www.t10.org) + * Reference documents from T10 (https://www.t10.org) * SCSI Primary Commands - 3 (SPC-3) * SCSI Block Commands - 2 (SBC-2) * Multi-Media Commands - 5 (MMC-5) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h index 5c60f2d1839a..6442bcc4b713 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ #ifndef _UHS_UNOFFICIAL_IDs_h diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h index 190077d17c86..73640d5c6f00 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_address.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_address.h index 1c8b79191037..4d9d35bd6da0 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_address.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_address.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_hexdump.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_hexdump.h index bc111f7b616e..945512cfccbb 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_hexdump.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_hexdump.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ #if !defined(_usb_h_) || defined(__HEXDUMP_H__) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host.h index 7f7d18116c9a..5d711c1f7439 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ /* USB functions */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index eb96c7eb5d5d..dec083390e3c 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ @@ -206,7 +206,7 @@ uint8_t UHS_USB_HOST_BASE::doSoftReset(uint8_t parent, uint8_t port, uint8_t add * will not enumerate without it. For devices that do not * need it, the additional reset is harmless. Here is an * example of one of these documents, see page Five: - * http://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf + * https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf * * */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h index 9c94e4d0ee6d..05c76d399874 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_message.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_message.h index f5ed3d8b4075..c0cc78d15f97 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_message.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_message.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ #if !defined(_UHS_host_h_) || defined(__MESSAGE_H__) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h index 4b8d387d270f..4fc9b94079ab 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h index 09e336510771..94015fba72b3 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_settings.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_settings.h index a401c2851647..c516599d6b3f 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_settings.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_settings.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ @@ -115,7 +115,7 @@ e-mail : support@circuitsathome.com #if GCC_VERSION < 40602 // Test for GCC < 4.6.2 #ifdef PROGMEM #undef PROGMEM -#define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4 +#define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4 #ifdef PSTR #undef PSTR #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) // Copied from pgmspace.h in avr-libc source diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h index 9d945d69c52b..a9ed2e71a59f 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h index c19574b4af1c..625666170bca 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_util_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_util_INLINE.h index 4f53443fb0db..52015b59877a 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_util_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_util_INLINE.h @@ -20,7 +20,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h index f42a806d7038..8719293e7301 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h @@ -13,7 +13,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ #if !defined(USB_HOST_SHIELD_H) || defined(_max3421e_h_) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h index f0cdae2b6bab..56d6400979f9 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h @@ -13,7 +13,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h index ef2dfe013782..3166ae4b05f2 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h @@ -13,7 +13,7 @@ Contact information ------------------- Circuits At Home, LTD -Web : http://www.circuitsathome.com +Web : https://www.circuitsathome.com e-mail : support@circuitsathome.com */ diff --git a/README.md b/README.md index 187e11150daf..00ed7e96fd63 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Download earlier versions of Marlin on the [Releases page](https://github.com/Ma ## Building Marlin 2.0 -To build Marlin 2.0 you'll need [Arduino IDE 1.8.8 or newer](https://www.arduino.cc/en/main/software) or [PlatformIO](http://docs.platformio.org/en/latest/ide.html#platformio-ide). We've posted detailed instructions on [Building Marlin with Arduino](https://marlinfw.org/docs/basics/install_arduino.html) and [Building Marlin with PlatformIO for ReArm](https://marlinfw.org/docs/basics/install_rearm.html) (which applies well to other 32-bit boards). +To build Marlin 2.0 you'll need [Arduino IDE 1.8.8 or newer](https://www.arduino.cc/en/main/software) or [PlatformIO](https://docs.platformio.org/en/latest/ide.html#platformio-ide). We've posted detailed instructions on [Building Marlin with Arduino](https://marlinfw.org/docs/basics/install_arduino.html) and [Building Marlin with PlatformIO for ReArm](https://marlinfw.org/docs/basics/install_rearm.html) (which applies well to other 32-bit boards). ## Hardware Abstraction Layer (HAL) @@ -40,7 +40,7 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level boards|processor|speed|flash|sram|logic|fpu ----|---------|-----|-----|----|-----|--- - [Arduino Due](https://www.arduino.cc/en/Guide/ArduinoDue), [RAMPS-FD](http://www.reprap.org/wiki/RAMPS-FD), etc.|[SAM3X8E ARM-Cortex M3](http://www.microchip.com/wwwproducts/en/ATsam3x8e)|84MHz|512k|64+32k|3.3V|no + [Arduino Due](https://www.arduino.cc/en/Guide/ArduinoDue), [RAMPS-FD](https://www.reprap.org/wiki/RAMPS-FD), etc.|[SAM3X8E ARM-Cortex M3](https://www.microchip.com/wwwproducts/en/ATsam3x8e)|84MHz|512k|64+32k|3.3V|no #### ESP32 @@ -56,7 +56,7 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level [MKS SBASE](http://forums.reprap.org/read.php?13,499322)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no [Selena Compact](https://github.com/Ales2-k/Selena)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no [Azteeg X5 GT](https://www.panucatt.com/azteeg_X5_GT_reprap_3d_printer_controller_p/ax5gt.htm)|LPC1769 ARM-Cortex M3|120MHz|512k|32+16+16k|3.3-5V|no - [Smoothieboard](http://reprap.org/wiki/Smoothieboard)|LPC1769 ARM-Cortex M3|120MHz|512k|64k|3.3-5V|no + [Smoothieboard](https://reprap.org/wiki/Smoothieboard)|LPC1769 ARM-Cortex M3|120MHz|512k|64k|3.3-5V|no #### SAMD51 @@ -75,13 +75,13 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level boards|processor|speed|flash|sram|logic|fpu ----|---------|-----|-----|----|-----|--- - [STEVAL-3DP001V1](http://www.st.com/en/evaluation-tools/steval-3dp001v1.html)|[STM32F401VE Arm-Cortex M4](http://www.st.com/en/microcontrollers/stm32f401ve.html)|84MHz|512k|64+32k|3.3-5V|yes + [STEVAL-3DP001V1](https://www.st.com/en/evaluation-tools/steval-3dp001v1.html)|[STM32F401VE Arm-Cortex M4](http://www.st.com/en/microcontrollers/stm32f401ve.html)|84MHz|512k|64+32k|3.3-5V|yes #### Teensy++ 2.0 boards|processor|speed|flash|sram|logic|fpu ----|---------|-----|-----|----|-----|--- - [Teensy++ 2.0](http://www.microchip.com/wwwproducts/en/AT90USB1286)|[AT90USB1286](http://www.microchip.com/wwwproducts/en/AT90USB1286)|16MHz|128k|8k|5V|no + [Teensy++ 2.0](https://www.microchip.com/wwwproducts/en/AT90USB1286)|[AT90USB1286](https://www.microchip.com/wwwproducts/en/AT90USB1286)|16MHz|128k|8k|5V|no #### Teensy 3.1 / 3.2 @@ -104,13 +104,13 @@ Proposed patches should be submitted as a Pull Request against the ([bugfix-2.0. - Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. - Please submit your questions and concerns to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues). -### [RepRap.org Wiki Page](http://reprap.org/wiki/Marlin) +### [RepRap.org Wiki Page](https://reprap.org/wiki/Marlin) ## Credits The current Marlin dev team consists of: - - Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - USA   [Donate](http://www.thinkyhead.com/donate-to-marlin) / Flattr: [![Flattr Scott](http://api.flattr.com/button/flattr-badge-small.png)](https://flattr.com/submit/auto?user_id=thinkyhead&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) + - Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - USA   [Donate](https://www.thinkyhead.com/donate-to-marlin) / Flattr: [![Flattr Scott](http://api.flattr.com/button/flattr-badge-small.png)](https://flattr.com/submit/auto?user_id=thinkyhead&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) - Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - USA - Chris Pepper [[@p3p](https://github.com/p3p)] - UK - Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - USA diff --git a/platformio.ini b/platformio.ini index cfbd5e5a1923..246abc11bde4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -4,7 +4,7 @@ # # For detailed documentation with EXAMPLES: # -# http://docs.platformio.org/en/latest/projectconf.html +# https://docs.platformio.org/en/latest/projectconf.html # # Automatic targets - enable auto-uploading From e1191ded02bbc78a9d008ec79fb5ab3af794163b Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Thu, 23 Jul 2020 00:01:56 -0400 Subject: [PATCH 205/483] Fast Filament Change temperature check (#18738) --- Marlin/src/feature/pause.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 5ed6e4d97408..291401ca0db7 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -119,7 +119,7 @@ fil_change_settings_t fc_settings[EXTRUDERS]; * * Returns 'true' if heating was completed, 'false' for abort */ -static bool ensure_safe_temperature(const PauseMode mode=PAUSE_MODE_SAME) { +static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=PAUSE_MODE_SAME) { #if ENABLED(PREVENT_COLD_EXTRUSION) if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) { @@ -134,7 +134,13 @@ static bool ensure_safe_temperature(const PauseMode mode=PAUSE_MODE_SAME) { UNUSED(mode); #endif - return thermalManager.wait_for_hotend(active_extruder); + if (wait) + return thermalManager.wait_for_hotend(active_extruder); + + while (ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW) + idle(); + + return true; } /** @@ -156,7 +162,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l ) { TERN(HAS_LCD_MENU,,UNUSED(show_lcd)); - if (!ensure_safe_temperature(mode)) { + if (!ensure_safe_temperature(false, mode)) { #if HAS_LCD_MENU if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS, mode); #endif @@ -291,7 +297,7 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, constexpr float mix_multiplier = 1.0; #endif - if (!ensure_safe_temperature(mode)) { + if (!ensure_safe_temperature(false, mode)) { #if HAS_LCD_MENU if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS); #endif @@ -498,7 +504,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep HOTEND_LOOP() thermalManager.reset_hotend_idle_timer(e); // Wait for the heaters to reach the target temperatures - ensure_safe_temperature(); + ensure_safe_temperature(false); // Show the prompt to continue show_continue_prompt(is_reload); @@ -587,6 +593,8 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Unretract unscaled_e_move(PAUSE_PARK_RETRACT_LENGTH, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); + ensure_safe_temperature(); + // Intelligent resuming #if ENABLED(FWRETRACT) // If retracted before goto pause From e27f031a5585abb3e75e74be92c5a59309768fcd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 17 Jul 2020 09:30:41 -0500 Subject: [PATCH 206/483] General cleanup --- Marlin/src/HAL/AVR/eeprom.cpp | 2 +- Marlin/src/HAL/DUE/eeprom_flash.cpp | 2 +- Marlin/src/HAL/DUE/eeprom_wired.cpp | 2 +- Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/eeprom.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/eeprom.cpp | 2 +- Marlin/src/core/millis_t.h | 2 +- Marlin/src/inc/Conditionals_adv.h | 2 +- buildroot/bin/generate_version | 2 +- .../share/PlatformIO/scripts/common-features-dependencies.h | 2 +- buildroot/share/extras/header.h | 2 +- buildroot/share/fonts/README.md | 2 +- buildroot/share/fonts/genallfont.sh | 2 +- buildroot/share/vscode/auto_build.py | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp index d23ac2f32a5d..c7906985eb60 100644 --- a/Marlin/src/HAL/AVR/eeprom.cpp +++ b/Marlin/src/HAL/AVR/eeprom.cpp @@ -55,7 +55,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui crc16(crc, &v, 1); pos++; value++; - }; + } return false; } diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index 74d4e81fa6c0..d98f06039f51 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -993,7 +993,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui crc16(crc, &v, 1); pos++; value++; - }; + } return false; } diff --git a/Marlin/src/HAL/DUE/eeprom_wired.cpp b/Marlin/src/HAL/DUE/eeprom_wired.cpp index 496d81f28224..4599d6a7cd44 100644 --- a/Marlin/src/HAL/DUE/eeprom_wired.cpp +++ b/Marlin/src/HAL/DUE/eeprom_wired.cpp @@ -58,7 +58,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui crc16(crc, &v, 1); pos++; value++; - }; + } return false; } diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp index e495fd8ecf53..b4699d00dcc0 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -68,7 +68,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui crc16(crc, &v, 1); pos++; value++; - }; + } return false; } diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp index 9a0791e437a7..00b808fd4824 100644 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp @@ -92,7 +92,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui crc16(crc, &v, 1); pos++; value++; - }; + } return false; } diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp index f3df536cb2f3..c0d82dbd0754 100644 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp @@ -58,7 +58,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui crc16(crc, &v, 1); pos++; value++; - }; + } return false; } diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp index 12be9ff72c17..f66313225562 100644 --- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp @@ -54,7 +54,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui crc16(crc, &v, 1); pos++; value++; - }; + } return false; } diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp index de67ef9e1d73..d2d7324cdd97 100644 --- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp @@ -58,7 +58,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui crc16(crc, &v, 1); pos++; value++; - }; + } return false; } diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h index bf0b0bb30899..95bc40e1ecbb 100644 --- a/Marlin/src/core/millis_t.h +++ b/Marlin/src/core/millis_t.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 26204fc5c772..85cb26dadb51 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -208,7 +208,7 @@ #endif #endif -#if ENABLED(FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864) +#if EITHER(FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864) #define LED_CONTROL_MENU #define LED_USER_PRESET_STARTUP #define LED_COLOR_PRESETS diff --git a/buildroot/bin/generate_version b/buildroot/bin/generate_version index 70efe824a7c3..b88e3de918b7 100755 --- a/buildroot/bin/generate_version +++ b/buildroot/bin/generate_version @@ -63,7 +63,7 @@ cat > "${DIR}/Version.h" <. + * along with this program. If not, see . * */ #pragma once diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.h b/buildroot/share/PlatformIO/scripts/common-features-dependencies.h index 44d690fc1010..61e9dc79e5f7 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/buildroot/share/extras/header.h b/buildroot/share/extras/header.h index 71338b62d6b4..5d2c73dfbeef 100644 --- a/buildroot/share/extras/header.h +++ b/buildroot/share/extras/header.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/buildroot/share/fonts/README.md b/buildroot/share/fonts/README.md index 4e6f6f9b1528..f8f780661f07 100644 --- a/buildroot/share/fonts/README.md +++ b/buildroot/share/fonts/README.md @@ -16,7 +16,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ - ISO10646_Kana.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) - Marlin_symbols.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) -Additional changes to the original font files distributed with Marlin are copyrighted under the terms of the [GPLv3](http://www.gnu.org/licenses/gpl-3.0.txt) license. +Additional changes to the original font files distributed with Marlin are copyrighted under the terms of the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.txt) license. ## Documentation diff --git a/buildroot/share/fonts/genallfont.sh b/buildroot/share/fonts/genallfont.sh index 84f7bb92aa7f..66f8e2c84f78 100755 --- a/buildroot/share/fonts/genallfont.sh +++ b/buildroot/share/fonts/genallfont.sh @@ -116,7 +116,7 @@ if [ 1 = 1 ]; then * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include diff --git a/buildroot/share/vscode/auto_build.py b/buildroot/share/vscode/auto_build.py index 1d4ea12c7bec..5dd2d0d8a3fc 100644 --- a/buildroot/share/vscode/auto_build.py +++ b/buildroot/share/vscode/auto_build.py @@ -18,7 +18,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # ####################################### From c5b3031c69ca9d844d463005514ebfd44b0499c2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 24 Jul 2020 00:09:15 +0000 Subject: [PATCH 207/483] [cron] Bump distribution date (2020-07-24) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ec64e054e065..cc93a7bd9b03 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-23" + #define STRING_DISTRIBUTION_DATE "2020-07-24" #endif /** From 715271190cf9c818766396df8489d9f8529f11ea Mon Sep 17 00:00:00 2001 From: George Fu Date: Fri, 24 Jul 2020 09:01:50 +0800 Subject: [PATCH 208/483] Update FYSETC AIO II TMC UART pins (#18749) --- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index f56f580fc44b..6a30a2cb23ce 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -84,7 +84,7 @@ #define E0_DIR_PIN PC14 #define E0_ENABLE_PIN PC13 -#if HAS_TMC220x +#if HAS_TMC_UART /** * TMC2208/TMC2209 stepper drivers @@ -97,9 +97,14 @@ #define Y_HARDWARE_SERIAL Serial1 #define Z_HARDWARE_SERIAL Serial1 #define E0_HARDWARE_SERIAL Serial1 - #define TMC_SERIAL_MULTIPLEXER - #define SERIAL_MUL_PIN1 PB13 - #define SERIAL_MUL_PIN2 PB12 + + // The 4xTMC2209 module doesn't have a serial multiplexer and + // needs to set *_SLAVE_ADDRESS in Configuration_adv.h for X,Y,Z,E0 + #if HAS_DRIVER(TMC2208) + #define TMC_SERIAL_MULTIPLEXER + #define SERIAL_MUL_PIN1 PB13 + #define SERIAL_MUL_PIN2 PB12 + #endif #endif From d1e20eb29f15c0dc4faa21769251709c455d18b8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 23 Jul 2020 20:46:11 -0500 Subject: [PATCH 209/483] Update links, README, contributing, etc. --- .github/FUNDING.yml | 2 +- .github/contributing.md | 13 +++++----- .github/issue_template.md | 8 +++++-- Marlin/Configuration.h | 2 +- Marlin/Marlin.ino | 2 +- Marlin/src/HAL/AVR/fastio.h | 2 +- Marlin/src/HAL/DUE/Tone.cpp | 2 +- Marlin/src/HAL/DUE/fastio.h | 2 +- Marlin/src/HAL/DUE/usb/arduino_due_x.h | 2 +- Marlin/src/HAL/DUE/usb/compiler.h | 2 +- Marlin/src/HAL/DUE/usb/conf_access.h | 2 +- Marlin/src/HAL/DUE/usb/conf_clock.h | 2 +- Marlin/src/HAL/DUE/usb/conf_usb.h | 2 +- Marlin/src/HAL/DUE/usb/ctrl_access.c | 2 +- Marlin/src/HAL/DUE/usb/ctrl_access.h | 2 +- Marlin/src/HAL/DUE/usb/genclk.h | 2 +- Marlin/src/HAL/DUE/usb/mrepeat.h | 2 +- Marlin/src/HAL/DUE/usb/osc.h | 2 +- Marlin/src/HAL/DUE/usb/pll.h | 2 +- Marlin/src/HAL/DUE/usb/preprocessor.h | 2 +- Marlin/src/HAL/DUE/usb/sbc_protocol.h | 2 +- Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h | 2 +- Marlin/src/HAL/DUE/usb/spc_protocol.h | 2 +- Marlin/src/HAL/DUE/usb/stringz.h | 2 +- Marlin/src/HAL/DUE/usb/sysclk.c | 2 +- Marlin/src/HAL/DUE/usb/sysclk.h | 2 +- Marlin/src/HAL/DUE/usb/tpaste.h | 2 +- Marlin/src/HAL/DUE/usb/udc.c | 2 +- Marlin/src/HAL/DUE/usb/udc.h | 2 +- Marlin/src/HAL/DUE/usb/udc_desc.h | 2 +- Marlin/src/HAL/DUE/usb/udd.h | 2 +- Marlin/src/HAL/DUE/usb/udi.h | 2 +- Marlin/src/HAL/DUE/usb/udi_cdc.c | 2 +- Marlin/src/HAL/DUE/usb/udi_cdc.h | 4 ++-- Marlin/src/HAL/DUE/usb/udi_cdc_conf.h | 2 +- Marlin/src/HAL/DUE/usb/udi_cdc_desc.c | 2 +- Marlin/src/HAL/DUE/usb/udi_composite_desc.c | 2 +- Marlin/src/HAL/DUE/usb/udi_msc.c | 2 +- Marlin/src/HAL/DUE/usb/udi_msc.h | 4 ++-- Marlin/src/HAL/DUE/usb/uotghs_device_due.c | 2 +- Marlin/src/HAL/DUE/usb/uotghs_device_due.h | 2 +- Marlin/src/HAL/DUE/usb/uotghs_otg.h | 2 +- Marlin/src/HAL/DUE/usb/usb_protocol.h | 2 +- Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h | 2 +- Marlin/src/HAL/DUE/usb/usb_protocol_msc.h | 2 +- Marlin/src/HAL/DUE/usb/usb_task.c | 2 +- Marlin/src/HAL/DUE/usb/usb_task.h | 2 +- Marlin/src/HAL/LINUX/fastio.h | 2 +- Marlin/src/HAL/LPC1768/fastio.h | 2 +- Marlin/src/HAL/STM32F1/SPI.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/fastio.h | 2 +- Marlin/src/HAL/TEENSY35_36/fastio.h | 2 +- .../src/HAL/shared/backtrace/unwarmbytab.cpp | 2 +- Marlin/src/feature/dac/dac_mcp4728.cpp | 2 +- Marlin/src/gcode/motion/G5.cpp | 2 +- .../ftdi_eve_lib/basic/boards.h | 8 +++---- Marlin/src/module/scara.cpp | 2 +- Marlin/src/module/thermistor/thermistor_2.h | 2 +- Marlin/src/module/thermistor/thermistor_5.h | 2 +- Marlin/src/module/thermistor/thermistor_52.h | 2 +- Marlin/src/module/thermistor/thermistor_55.h | 2 +- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 2 +- Marlin/src/pins/sanguino/pins_OMCA.h | 4 ++-- .../src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 2 +- Marlin/src/sd/SdFatStructs.h | 2 +- Marlin/src/sd/SdInfo.h | 2 +- README.md | 10 ++++---- .../etc/udev/rules.d/99-platformio-udev.rules | 4 ++-- .../PlatformIO/boards/BigTree_Btt002.json | 2 +- .../PlatformIO/boards/BigTree_GTR_v1.json | 2 +- .../PlatformIO/boards/BigTree_SKR_Pro.json | 2 +- .../share/PlatformIO/boards/CHITU_F103.json | 2 +- .../share/PlatformIO/boards/FLYF407ZG.json | 2 +- buildroot/share/PlatformIO/boards/LERDGE.json | 2 +- .../PlatformIO/boards/blackSTM32F407VET6.json | 2 +- .../share/PlatformIO/boards/malyanM200.json | 2 +- buildroot/share/fonts/README.md | 4 ++-- buildroot/share/fonts/uxggenpages.md | 4 ++-- .../scripts/createTemperatureLookupMarlin.py | 4 ++-- buildroot/share/vscode/avrdude.conf | 24 +++++++++---------- buildroot/share/vscode/avrdude_linux.conf | 24 +++++++++---------- buildroot/share/vscode/avrdude_macOS.conf | 10 ++++---- platformio.ini | 2 +- 83 files changed, 132 insertions(+), 131 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 70734d4972cc..a9732429326e 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ github: [thinkyhead] patreon: thinkyhead -custom: ["http://www.thinkyhead.com/donate-to-marlin"] +custom: ["https://www.thinkyhead.com/donate-to-marlin"] diff --git a/.github/contributing.md b/.github/contributing.md index 589f14581a12..6bc7b5a00514 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -34,16 +34,15 @@ This project and everyone participating in it is governed by the [Marlin Code of We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions. -* [Marlin RepRap forum](http://forums.reprap.org/list.php?415) +* [Marlin RepRap forum](https://reprap.org/forum/list.php?415) * [MarlinFirmware on Facebook](https://www.facebook.com/groups/1049718498464482/) -If chat is more your speed, you can join the MarlinFirmware Slack team: +If chat is more your speed, you can join the MarlinFirmware Discord server: -* Join the Marlin Slack Team - * To obtain group access, please [send a request](http://www.thinkyhead.com/contact/9) to @thinkyhead. - * Even though Slack is a chat service, sometimes it takes several hours for community members to respond — please be patient! - * Use the `#general` channel for general questions or discussion about Marlin. - * Other channels exist for certain topics. Check the channel list. +* Use the link https://discord.gg/n5NJ59y to join up as a General User. +* Even though our Discord is pretty active, it may take a while for community members to respond — please be patient! +* Use the `#general` channel for general questions or discussion about Marlin. +* Other channels exist for certain topics or are limited to Patrons. Check the channel list. ## How Can I Contribute? diff --git a/.github/issue_template.md b/.github/issue_template.md index ecfb36f0d580..6cb34b8f588a 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -2,9 +2,13 @@ Have you read Marlin's Code of Conduct? By filing an Issue, you are expected to comply with it, including treating everyone with respect: https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.0.x/.github/code_of_conduct.md -Do you want to ask a question? Are you looking for support? Please don't post here. Instead please use the Marlin Firmware forum at http://forums.reprap.org/list.php?415 or the Marlin Facebook Group https://www.facebook.com/groups/1049718498464482/ or the Marlin Discord Server https://discord.gg/n5NJ59y. +Do you want to ask a question? Are you looking for support? Please don't post here. Instead use one of the following options: -Before filing an issue be sure to test the 1.1 and/or 2.0 "bugfix" branches to see whether the issue is already addressed. +- The Marlin Firmware forum at https://reprap.org/forum/list.php?415 +- The MarlinFirmware Facebook Group at https://www.facebook.com/groups/1049718498464482/ +- The MarlinFirmware Discord Server at https://discord.gg/n5NJ59y. + +Before filing an issue be sure to test the latest "bugfix" branch to see whether the issue is already addressed. --> diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 78044525618b..c11b02bc52e2 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -473,7 +473,7 @@ //=========================================================================== //============================= PID Settings ================================ //=========================================================================== -// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning +// PID Tuning Guide here: https://reprap.org/wiki/PID_Tuning // Comment the following line to disable PID and enable bang-bang. #define PIDTEMP diff --git a/Marlin/Marlin.ino b/Marlin/Marlin.ino index 213c18a94ec0..57c825445fb5 100644 --- a/Marlin/Marlin.ino +++ b/Marlin/Marlin.ino @@ -37,7 +37,7 @@ Configuration Getting Help - - http://forums.reprap.org/list.php?415 + - https://reprap.org/forum/list.php?415 The Marlin Discussion Forum is a great place to get help from other Marlin users who may have experienced similar issues to your own. diff --git a/Marlin/src/HAL/AVR/fastio.h b/Marlin/src/HAL/AVR/fastio.h index c3239186baca..bd6935aaf0ce 100644 --- a/Marlin/src/HAL/AVR/fastio.h +++ b/Marlin/src/HAL/AVR/fastio.h @@ -57,7 +57,7 @@ * * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); * - * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html */ #define _READ(IO) TEST(DIO ## IO ## _RPORT, DIO ## IO ## _PIN) diff --git a/Marlin/src/HAL/DUE/Tone.cpp b/Marlin/src/HAL/DUE/Tone.cpp index e6c72c728b67..9beb6022237f 100644 --- a/Marlin/src/HAL/DUE/Tone.cpp +++ b/Marlin/src/HAL/DUE/Tone.cpp @@ -24,7 +24,7 @@ /** * Description: Tone function for Arduino Due and compatible (SAM3X8E) - * Derived from http://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012 + * Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012 */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h index 9d6bfa164aed..286319302dd2 100644 --- a/Marlin/src/HAL/DUE/fastio.h +++ b/Marlin/src/HAL/DUE/fastio.h @@ -58,7 +58,7 @@ * * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); * - * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html */ // Read a pin diff --git a/Marlin/src/HAL/DUE/usb/arduino_due_x.h b/Marlin/src/HAL/DUE/usb/arduino_due_x.h index 7355f74f6d9b..b5be621791d2 100644 --- a/Marlin/src/HAL/DUE/usb/arduino_due_x.h +++ b/Marlin/src/HAL/DUE/usb/arduino_due_x.h @@ -43,7 +43,7 @@ #pragma once /** - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ /** diff --git a/Marlin/src/HAL/DUE/usb/compiler.h b/Marlin/src/HAL/DUE/usb/compiler.h index 33df080e2f89..7b746543c4c6 100644 --- a/Marlin/src/HAL/DUE/usb/compiler.h +++ b/Marlin/src/HAL/DUE/usb/compiler.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef UTILS_COMPILER_H diff --git a/Marlin/src/HAL/DUE/usb/conf_access.h b/Marlin/src/HAL/DUE/usb/conf_access.h index fdac1ab7e848..f401685223cb 100644 --- a/Marlin/src/HAL/DUE/usb/conf_access.h +++ b/Marlin/src/HAL/DUE/usb/conf_access.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _CONF_ACCESS_H_ diff --git a/Marlin/src/HAL/DUE/usb/conf_clock.h b/Marlin/src/HAL/DUE/usb/conf_clock.h index d0f68500ad71..97e70e99a5b9 100644 --- a/Marlin/src/HAL/DUE/usb/conf_clock.h +++ b/Marlin/src/HAL/DUE/usb/conf_clock.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CONF_CLOCK_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/conf_usb.h b/Marlin/src/HAL/DUE/usb/conf_usb.h index 7beb9b0bba7c..4de9e347e213 100644 --- a/Marlin/src/HAL/DUE/usb/conf_usb.h +++ b/Marlin/src/HAL/DUE/usb/conf_usb.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _CONF_USB_H_ diff --git a/Marlin/src/HAL/DUE/usb/ctrl_access.c b/Marlin/src/HAL/DUE/usb/ctrl_access.c index 0ec14e0b8f8d..99f97f62cb80 100644 --- a/Marlin/src/HAL/DUE/usb/ctrl_access.c +++ b/Marlin/src/HAL/DUE/usb/ctrl_access.c @@ -53,7 +53,7 @@ * ******************************************************************************/ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/ctrl_access.h b/Marlin/src/HAL/DUE/usb/ctrl_access.h index af6c8ceb963e..b33839076eae 100644 --- a/Marlin/src/HAL/DUE/usb/ctrl_access.h +++ b/Marlin/src/HAL/DUE/usb/ctrl_access.h @@ -53,7 +53,7 @@ * ******************************************************************************/ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ diff --git a/Marlin/src/HAL/DUE/usb/genclk.h b/Marlin/src/HAL/DUE/usb/genclk.h index 895aba035229..cde03bc0d107 100644 --- a/Marlin/src/HAL/DUE/usb/genclk.h +++ b/Marlin/src/HAL/DUE/usb/genclk.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CHIP_GENCLK_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/mrepeat.h b/Marlin/src/HAL/DUE/usb/mrepeat.h index 5a2017be99e9..8363d9cde380 100644 --- a/Marlin/src/HAL/DUE/usb/mrepeat.h +++ b/Marlin/src/HAL/DUE/usb/mrepeat.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _MREPEAT_H_ diff --git a/Marlin/src/HAL/DUE/usb/osc.h b/Marlin/src/HAL/DUE/usb/osc.h index 3a9543507bb8..953bcbbed1d3 100644 --- a/Marlin/src/HAL/DUE/usb/osc.h +++ b/Marlin/src/HAL/DUE/usb/osc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CHIP_OSC_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/pll.h b/Marlin/src/HAL/DUE/usb/pll.h index d3d2174870e5..8eaf27672b25 100644 --- a/Marlin/src/HAL/DUE/usb/pll.h +++ b/Marlin/src/HAL/DUE/usb/pll.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CHIP_PLL_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/preprocessor.h b/Marlin/src/HAL/DUE/usb/preprocessor.h index 184c03ae7103..c12d01cb642f 100644 --- a/Marlin/src/HAL/DUE/usb/preprocessor.h +++ b/Marlin/src/HAL/DUE/usb/preprocessor.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _PREPROCESSOR_H_ diff --git a/Marlin/src/HAL/DUE/usb/sbc_protocol.h b/Marlin/src/HAL/DUE/usb/sbc_protocol.h index 082b735fa619..ab845739fd48 100644 --- a/Marlin/src/HAL/DUE/usb/sbc_protocol.h +++ b/Marlin/src/HAL/DUE/usb/sbc_protocol.h @@ -52,7 +52,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _SBC_PROTOCOL_H_ #define _SBC_PROTOCOL_H_ diff --git a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h index 6df82c146b75..d77e4f95232b 100644 --- a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h +++ b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h @@ -42,7 +42,7 @@ * ******************************************************************************/ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ diff --git a/Marlin/src/HAL/DUE/usb/spc_protocol.h b/Marlin/src/HAL/DUE/usb/spc_protocol.h index 6fadb9f36caa..d67cc5c78803 100644 --- a/Marlin/src/HAL/DUE/usb/spc_protocol.h +++ b/Marlin/src/HAL/DUE/usb/spc_protocol.h @@ -45,7 +45,7 @@ */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _SPC_PROTOCOL_H_ #define _SPC_PROTOCOL_H_ diff --git a/Marlin/src/HAL/DUE/usb/stringz.h b/Marlin/src/HAL/DUE/usb/stringz.h index b914b7348933..fc9aaf38a4cf 100644 --- a/Marlin/src/HAL/DUE/usb/stringz.h +++ b/Marlin/src/HAL/DUE/usb/stringz.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _STRINGZ_H_ diff --git a/Marlin/src/HAL/DUE/usb/sysclk.c b/Marlin/src/HAL/DUE/usb/sysclk.c index 899244dd88d0..cbb4e2c9ef22 100644 --- a/Marlin/src/HAL/DUE/usb/sysclk.c +++ b/Marlin/src/HAL/DUE/usb/sysclk.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/sysclk.h b/Marlin/src/HAL/DUE/usb/sysclk.h index 48c99de2983e..16db8c86d373 100644 --- a/Marlin/src/HAL/DUE/usb/sysclk.h +++ b/Marlin/src/HAL/DUE/usb/sysclk.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CHIP_SYSCLK_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/tpaste.h b/Marlin/src/HAL/DUE/usb/tpaste.h index f8ec44a41def..2ad3f2758e8a 100644 --- a/Marlin/src/HAL/DUE/usb/tpaste.h +++ b/Marlin/src/HAL/DUE/usb/tpaste.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _TPASTE_H_ diff --git a/Marlin/src/HAL/DUE/usb/udc.c b/Marlin/src/HAL/DUE/usb/udc.c index 048a902d3b5e..60bf0cfff35c 100644 --- a/Marlin/src/HAL/DUE/usb/udc.c +++ b/Marlin/src/HAL/DUE/usb/udc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udc.h b/Marlin/src/HAL/DUE/usb/udc.h index 885bdf04d651..8d92eb5c038a 100644 --- a/Marlin/src/HAL/DUE/usb/udc.h +++ b/Marlin/src/HAL/DUE/usb/udc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDC_H_ diff --git a/Marlin/src/HAL/DUE/usb/udc_desc.h b/Marlin/src/HAL/DUE/usb/udc_desc.h index 88ed08a96118..052ca08eca78 100644 --- a/Marlin/src/HAL/DUE/usb/udc_desc.h +++ b/Marlin/src/HAL/DUE/usb/udc_desc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDC_DESC_H_ diff --git a/Marlin/src/HAL/DUE/usb/udd.h b/Marlin/src/HAL/DUE/usb/udd.h index c87763de23fa..7ec8c03dee63 100644 --- a/Marlin/src/HAL/DUE/usb/udd.h +++ b/Marlin/src/HAL/DUE/usb/udd.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDD_H_ diff --git a/Marlin/src/HAL/DUE/usb/udi.h b/Marlin/src/HAL/DUE/usb/udi.h index 709908cad947..febf03b7181e 100644 --- a/Marlin/src/HAL/DUE/usb/udi.h +++ b/Marlin/src/HAL/DUE/usb/udi.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDI_H_ diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.c b/Marlin/src/HAL/DUE/usb/udi_cdc.c index 60c9546ce236..cbe23dbb68fb 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc.c +++ b/Marlin/src/HAL/DUE/usb/udi_cdc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.h b/Marlin/src/HAL/DUE/usb/udi_cdc.h index 526419c86002..0ecf7bb00e5e 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc.h +++ b/Marlin/src/HAL/DUE/usb/udi_cdc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDI_CDC_H_ @@ -701,7 +701,7 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s * another "Composite Device" module, like "USB HID Mouse (Composite Device)". * * Also, you can refer to application note - * + * * AVR4902 ASF - USB Composite Device. * * \section udi_cdc_use_case_composite_setup Setup steps diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h b/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h index cbd3eb00ae71..d406a87743f3 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h +++ b/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDI_CDC_CONF_H_ diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc_desc.c b/Marlin/src/HAL/DUE/usb/udi_cdc_desc.c index 8f730ba823d1..97c334e2a854 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc_desc.c +++ b/Marlin/src/HAL/DUE/usb/udi_cdc_desc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udi_composite_desc.c b/Marlin/src/HAL/DUE/usb/udi_composite_desc.c index 07bdd1b9d692..da74fbe60dfe 100644 --- a/Marlin/src/HAL/DUE/usb/udi_composite_desc.c +++ b/Marlin/src/HAL/DUE/usb/udi_composite_desc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udi_msc.c b/Marlin/src/HAL/DUE/usb/udi_msc.c index 627bca0d4f5a..b7c3bb5ea016 100644 --- a/Marlin/src/HAL/DUE/usb/udi_msc.c +++ b/Marlin/src/HAL/DUE/usb/udi_msc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udi_msc.h b/Marlin/src/HAL/DUE/usb/udi_msc.h index c632ee4aacee..730dbc8eec56 100644 --- a/Marlin/src/HAL/DUE/usb/udi_msc.h +++ b/Marlin/src/HAL/DUE/usb/udi_msc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDI_MSC_H_ @@ -290,7 +290,7 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, * another "Composite Device" module, like "USB HID Mouse (Composite Device)". * * Also, you can refer to application note - * + * * AVR4902 ASF - USB Composite Device. * * \section udi_msc_use_case_composite_setup Setup steps diff --git a/Marlin/src/HAL/DUE/usb/uotghs_device_due.c b/Marlin/src/HAL/DUE/usb/uotghs_device_due.c index 2a10190c7eca..e13232a39c7d 100644 --- a/Marlin/src/HAL/DUE/usb/uotghs_device_due.c +++ b/Marlin/src/HAL/DUE/usb/uotghs_device_due.c @@ -42,7 +42,7 @@ */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/uotghs_device_due.h b/Marlin/src/HAL/DUE/usb/uotghs_device_due.h index 97877994bf66..6df26d63dfd4 100644 --- a/Marlin/src/HAL/DUE/usb/uotghs_device_due.h +++ b/Marlin/src/HAL/DUE/usb/uotghs_device_due.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef UOTGHS_DEVICE_DUE_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/uotghs_otg.h b/Marlin/src/HAL/DUE/usb/uotghs_otg.h index 86c903b2c18f..eca5e938bbe1 100644 --- a/Marlin/src/HAL/DUE/usb/uotghs_otg.h +++ b/Marlin/src/HAL/DUE/usb/uotghs_otg.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef UOTGHS_OTG_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol.h b/Marlin/src/HAL/DUE/usb/usb_protocol.h index 31c783f974cf..ea51a8689649 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol.h +++ b/Marlin/src/HAL/DUE/usb/usb_protocol.h @@ -44,7 +44,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _USB_PROTOCOL_H_ diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h b/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h index 49fc7387ef31..d594db52e33b 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h +++ b/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _USB_PROTOCOL_CDC_H_ #define _USB_PROTOCOL_CDC_H_ diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h b/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h index db8f9cafd081..0fef30804662 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h +++ b/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _USB_PROTOCOL_MSC_H_ diff --git a/Marlin/src/HAL/DUE/usb/usb_task.c b/Marlin/src/HAL/DUE/usb/usb_task.c index 29d02faef703..66bdb265d881 100644 --- a/Marlin/src/HAL/DUE/usb/usb_task.c +++ b/Marlin/src/HAL/DUE/usb/usb_task.c @@ -41,7 +41,7 @@ * */ -// Support and FAQ: visit Atmel Support +// Support and FAQ: visit Atmel Support #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/usb_task.h b/Marlin/src/HAL/DUE/usb/usb_task.h index fad62fda504b..e9831ae0628a 100644 --- a/Marlin/src/HAL/DUE/usb/usb_task.h +++ b/Marlin/src/HAL/DUE/usb/usb_task.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _USB_TASK_H_ diff --git a/Marlin/src/HAL/LINUX/fastio.h b/Marlin/src/HAL/LINUX/fastio.h index 8f18d6ab607a..4567c62a5106 100644 --- a/Marlin/src/HAL/LINUX/fastio.h +++ b/Marlin/src/HAL/LINUX/fastio.h @@ -44,7 +44,7 @@ * * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); * - * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html */ /// Read a pin diff --git a/Marlin/src/HAL/LPC1768/fastio.h b/Marlin/src/HAL/LPC1768/fastio.h index 31cd8772d16d..c553ffb1820d 100644 --- a/Marlin/src/HAL/LPC1768/fastio.h +++ b/Marlin/src/HAL/LPC1768/fastio.h @@ -56,7 +56,7 @@ * * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); * - * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html */ /// Read a pin diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp index 991ceb3148ee..80095ba1dce8 100644 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -216,7 +216,7 @@ void SPIClass::setDataMode(uint8_t dataMode) { /** * Notes: * As far as we know the AVR numbers for dataMode match the numbers required by the STM32. - * From the AVR doc http://www.atmel.com/images/doc2585.pdf section 2.4 + * From the AVR doc https://www.atmel.com/images/doc2585.pdf section 2.4 * * SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge * 0 0 0 Falling Rising diff --git a/Marlin/src/HAL/TEENSY31_32/fastio.h b/Marlin/src/HAL/TEENSY31_32/fastio.h index c564a718357b..9a299de9c763 100644 --- a/Marlin/src/HAL/TEENSY31_32/fastio.h +++ b/Marlin/src/HAL/TEENSY31_32/fastio.h @@ -39,7 +39,7 @@ * * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); * - * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html */ #define _READ(P) bool(CORE_PIN ## P ## _PINREG & CORE_PIN ## P ## _BITMASK) diff --git a/Marlin/src/HAL/TEENSY35_36/fastio.h b/Marlin/src/HAL/TEENSY35_36/fastio.h index c564a718357b..9a299de9c763 100644 --- a/Marlin/src/HAL/TEENSY35_36/fastio.h +++ b/Marlin/src/HAL/TEENSY35_36/fastio.h @@ -39,7 +39,7 @@ * * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); * - * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html */ #define _READ(P) bool(CORE_PIN ## P ## _PINREG & CORE_PIN ## P ## _BITMASK) diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp index 207cd56aa82e..f524673ecd74 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp @@ -4,7 +4,7 @@ * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * file, You can obtain one at https://mozilla.org/MPL/2.0/. * * This library was modified, some bugs fixed, stack address validated * and adapted to be used in Marlin 3D printer firmware as backtracer diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index 90ad31290f33..4976b3690729 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -24,7 +24,7 @@ * mcp4728.cpp - Arduino library for MicroChip MCP4728 I2C D/A converter * * For implementation details, please take a look at the datasheet: - * http://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf + * https://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf * * For discussion and feedback, please go to: * https://arduino.cc/forum/index.php/topic,51842.0.html diff --git a/Marlin/src/gcode/motion/G5.cpp b/Marlin/src/gcode/motion/G5.cpp index 804db5a742af..35cc4280239b 100644 --- a/Marlin/src/gcode/motion/G5.cpp +++ b/Marlin/src/gcode/motion/G5.cpp @@ -29,7 +29,7 @@ /** * Parameters interpreted according to: - * http://linuxcnc.org/docs/2.6/html/gcode/parser.html#sec:G5-Cubic-Spline + * https://linuxcnc.org/docs/2.6/html/gcode/gcode.html#sec:G5-Cubic-Spline * However I, J omission is not supported at this point; all * parameters can be omitted and default to zero. */ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h index e431cfde1ff5..c09d10f1488c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h @@ -113,9 +113,9 @@ /** * Settings for the 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) - * http://www.4dsystems.com.au/product/4DLCD_FT843/ + * https://4dsystems.com.au/4dlcd-ft843 * Datasheet: - * http://www.4dsystems.com.au/productpages/4DLCD-FT843/downloads/FT843-4.3-Display_datasheet_R_1_2.pdf + * https://4dsystems.com.au/mwdownloads/download/link/id/52/ */ #elif defined(LCD_4DSYSTEMS_4DLCD_FT843) #if !HAS_RESOLUTION @@ -136,9 +136,7 @@ /** * Settings for the Aleph Objects Color LCD User Interface - * https://code.alephobjects.com/source/aotctl/ - * Datasheet: - * http://www.hantronix.com/files/data/s1501799605s500-gh7.pdf + * Datasheet https://www.hantronix.com/files/data/s1501799605s500-gh7.pdf */ #elif defined(LCD_ALEPHOBJECTS_CLCD_UI) #if !HAS_RESOLUTION diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 6c961827c772..e4b2f0b75c51 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -100,7 +100,7 @@ void inverse_kinematics(const xyz_pos_t &raw) { /** * Morgan SCARA Inverse Kinematics. Results in 'delta'. * - * See http://forums.reprap.org/read.php?185,283327 + * See https://reprap.org/forum/read.php?185,283327 * * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. diff --git a/Marlin/src/module/thermistor/thermistor_2.h b/Marlin/src/module/thermistor/thermistor_2.h index f07de0b5373e..d0e1e4f3dfca 100644 --- a/Marlin/src/module/thermistor/thermistor_2.h +++ b/Marlin/src/module/thermistor/thermistor_2.h @@ -23,7 +23,7 @@ // // R25 = 200 kOhm, beta25 = 4338 K, 4.7 kOhm pull-up, ATC Semitec 204GT-2 -// Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf +// Verified by linagee. Source: https://www.mouser.com/datasheet/2/362/semitec%20usa%20corporation_gtthermistor-1202937.pdf // Calculated using 4.7kohm pullup, voltage divider math, and manufacturer provided temp/resistance // const temp_entry_t temptable_2[] PROGMEM = { diff --git a/Marlin/src/module/thermistor/thermistor_5.h b/Marlin/src/module/thermistor/thermistor_5.h index 5d2c3e7b0424..1d5fa2fec739 100644 --- a/Marlin/src/module/thermistor/thermistor_5.h +++ b/Marlin/src/module/thermistor/thermistor_5.h @@ -24,7 +24,7 @@ // R25 = 100 kOhm, beta25 = 4267 K, 4.7 kOhm pull-up // 100k ParCan thermistor (104GT-2) // ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan) -// Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf +// Verified by linagee. Source: https://www.mouser.com/datasheet/2/362/semitec%20usa%20corporation_gtthermistor-1202937.pdf // Calculated using 4.7kohm pullup, voltage divider math, and manufacturer provided temp/resistance const temp_entry_t temptable_5[] PROGMEM = { { OV( 1), 713 }, diff --git a/Marlin/src/module/thermistor/thermistor_52.h b/Marlin/src/module/thermistor/thermistor_52.h index 69666add20cf..5c9cb9dc4df9 100644 --- a/Marlin/src/module/thermistor/thermistor_52.h +++ b/Marlin/src/module/thermistor/thermistor_52.h @@ -23,7 +23,7 @@ // R25 = 200 kOhm, beta25 = 4338 K, 1 kOhm pull-up, // 200k ATC Semitec 204GT-2 (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) -// Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf +// Verified by linagee. Source: https://www.mouser.com/datasheet/2/362/semitec%20usa%20corporation_gtthermistor-1202937.pdf // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance // Advantage: More resolution and better linearity from 150C to 200C const temp_entry_t temptable_52[] PROGMEM = { diff --git a/Marlin/src/module/thermistor/thermistor_55.h b/Marlin/src/module/thermistor/thermistor_55.h index 2966d064eb83..707b7d420a12 100644 --- a/Marlin/src/module/thermistor/thermistor_55.h +++ b/Marlin/src/module/thermistor/thermistor_55.h @@ -23,7 +23,7 @@ // R25 = 100 kOhm, beta25 = 4267 K, 1 kOhm pull-up, // 100k ATC Semitec 104GT-2 (Used on ParCan) (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) -// Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf +// Verified by linagee. Source: https://www.mouser.com/datasheet/2/362/semitec%20usa%20corporation_gtthermistor-1202937.pdf // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance // Advantage: More resolution and better linearity from 150C to 200C const temp_entry_t temptable_55[] PROGMEM = { diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index dfe077ee4d45..7cd81456b17d 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -23,7 +23,7 @@ /** * Alligator Board R2 - * http://www.3dartists.org/ + * https://reprap.org/wiki/Alligator_Board */ #ifndef __SAM3X8E__ diff --git a/Marlin/src/pins/sanguino/pins_OMCA.h b/Marlin/src/pins/sanguino/pins_OMCA.h index eb5786dd11b0..8e4c6d2b641d 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA.h +++ b/Marlin/src/pins/sanguino/pins_OMCA.h @@ -49,7 +49,7 @@ * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM * +--------+ * - * REF http://sanguino.cc/hardware + * REF http://sanguino.wikidot.com/hardware */ /** @@ -70,7 +70,7 @@ * * When installing select 1.0.2 * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Installation instructions can be found at http://learn.sparkfun.com/pages/CustomBoardsArduino * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index e0e827262fc9..e6350f71dcdb 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -23,7 +23,7 @@ /** * STM32F407VET6 with RAMPS-like shield - * 'Black' STM32F407VET6 board - http://wiki.stm32duino.com/index.php?title=STM32F407 + * 'Black' STM32F407VET6 board - https://www.stm32duino.com/viewtopic.php?t=485 * Shield - https://github.com/jmz52/Hardware */ diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h index dc6fb7d263bf..e06e05981ad2 100644 --- a/Marlin/src/sd/SdFatStructs.h +++ b/Marlin/src/sd/SdFatStructs.h @@ -39,7 +39,7 @@ /** * mostly from Microsoft document fatgen103.doc - * http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + * https://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx */ uint8_t const BOOTSIG0 = 0x55, // Value for byte 510 of boot block or MBR diff --git a/Marlin/src/sd/SdInfo.h b/Marlin/src/sd/SdInfo.h index 4affa21c509e..bfa5a01ae2af 100644 --- a/Marlin/src/sd/SdInfo.h +++ b/Marlin/src/sd/SdInfo.h @@ -39,7 +39,7 @@ // Version 3.01 // May 18, 2010 // -// http://www.sdcard.org/developers/tech/sdcard/pls/simplified_specs +// https://www.sdcard.org/downloads/pls/index.html // SD card commands uint8_t const CMD0 = 0x00, // GO_IDLE_STATE - init card in spi mode if CS low diff --git a/README.md b/README.md index 00ed7e96fd63..042cf3303b8a 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level boards|processor|speed|flash|sram|logic|fpu ----|---------|-----|-----|----|-----|--- - [Re-ARM](https://www.kickstarter.com/projects/1245051645/re-arm-for-ramps-simple-32-bit-upgrade)|[LPC1768 ARM-Cortex M3](http://www.nxp.com/products/microcontrollers-and-processors/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|100MHz|512k|32+16+16k|3.3-5V|no - [MKS SBASE](http://forums.reprap.org/read.php?13,499322)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no + [Re-ARM](https://www.kickstarter.com/projects/1245051645/re-arm-for-ramps-simple-32-bit-upgrade)|[LPC1768 ARM-Cortex M3](https://www.nxp.com/products/microcontrollers-and-processors/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|100MHz|512k|32+16+16k|3.3-5V|no + [MKS SBASE](https://reprap.org/forum/read.php?13,499322)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no [Selena Compact](https://github.com/Ales2-k/Selena)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no [Azteeg X5 GT](https://www.panucatt.com/azteeg_X5_GT_reprap_3d_printer_controller_p/ax5gt.htm)|LPC1769 ARM-Cortex M3|120MHz|512k|32+16+16k|3.3-5V|no [Smoothieboard](https://reprap.org/wiki/Smoothieboard)|LPC1769 ARM-Cortex M3|120MHz|512k|64k|3.3-5V|no @@ -75,7 +75,7 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level boards|processor|speed|flash|sram|logic|fpu ----|---------|-----|-----|----|-----|--- - [STEVAL-3DP001V1](https://www.st.com/en/evaluation-tools/steval-3dp001v1.html)|[STM32F401VE Arm-Cortex M4](http://www.st.com/en/microcontrollers/stm32f401ve.html)|84MHz|512k|64+32k|3.3-5V|yes + [STEVAL-3DP001V1](https://www.st.com/en/evaluation-tools/steval-3dp001v1.html)|[STM32F401VE Arm-Cortex M4](https://www.st.com/en/microcontrollers-microprocessors/stm32f401ve.html)|84MHz|512k|64+32k|3.3-5V|yes #### Teensy++ 2.0 @@ -110,12 +110,12 @@ Proposed patches should be submitted as a Pull Request against the ([bugfix-2.0. The current Marlin dev team consists of: - - Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - USA   [Donate](https://www.thinkyhead.com/donate-to-marlin) / Flattr: [![Flattr Scott](http://api.flattr.com/button/flattr-badge-small.png)](https://flattr.com/submit/auto?user_id=thinkyhead&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) + - Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - USA   [Donate](https://www.thinkyhead.com/donate-to-marlin) / Flattr: [![Flattr Scott](https://api.flattr.com/button/flattr-badge-small.png)](https://flattr.com/submit/auto?user_id=thinkyhead&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) - Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - USA - Chris Pepper [[@p3p](https://github.com/p3p)] - UK - Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - USA - João Brazio [[@jbrazio](https://github.com/jbrazio)] - Portugal - - Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - Netherlands   [![Flattr Erik](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) + - Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - Netherlands   [![Flattr Erik](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) ## License diff --git a/buildroot/etc/udev/rules.d/99-platformio-udev.rules b/buildroot/etc/udev/rules.d/99-platformio-udev.rules index 6daaf922bff5..3c829882d1cd 100644 --- a/buildroot/etc/udev/rules.d/99-platformio-udev.rules +++ b/buildroot/etc/udev/rules.d/99-platformio-udev.rules @@ -4,7 +4,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -16,7 +16,7 @@ # # INSTALLATION # -# Please visit > http://docs.platformio.org/en/latest/faq.html#platformio-udev-rules +# Please visit > https://docs.platformio.org/en/latest/faq.html#platformio-udev-rules # ##################################################################################### diff --git a/buildroot/share/PlatformIO/boards/BigTree_Btt002.json b/buildroot/share/PlatformIO/boards/BigTree_Btt002.json index ef3333cbb936..d0d092f1eaba 100644 --- a/buildroot/share/PlatformIO/boards/BigTree_Btt002.json +++ b/buildroot/share/PlatformIO/boards/BigTree_Btt002.json @@ -41,6 +41,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "http://www.st.com/en/microcontrollers/stm32f407vg.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407vg.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json b/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json index 669a7520bbce..32236301c347 100644 --- a/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json +++ b/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json @@ -41,6 +41,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "http://www.st.com/en/microcontrollers/stm32f407zg.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407zg.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json b/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json index 357b3acca942..211ceacdca0b 100644 --- a/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json +++ b/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json @@ -41,6 +41,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "http://www.st.com/en/microcontrollers/stm32f407zg.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407zg.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/CHITU_F103.json b/buildroot/share/PlatformIO/boards/CHITU_F103.json index ab772aea07d0..ecf7bff66c87 100644 --- a/buildroot/share/PlatformIO/boards/CHITU_F103.json +++ b/buildroot/share/PlatformIO/boards/CHITU_F103.json @@ -43,6 +43,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "http://www.st.com/en/microcontrollers/stm32f103ze.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f103ze.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/FLYF407ZG.json b/buildroot/share/PlatformIO/boards/FLYF407ZG.json index 060b50ee8c05..7e585c5057ca 100644 --- a/buildroot/share/PlatformIO/boards/FLYF407ZG.json +++ b/buildroot/share/PlatformIO/boards/FLYF407ZG.json @@ -59,6 +59,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "http://www.st.com/en/microcontrollers/stm32f407ZG.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407ZG.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/LERDGE.json b/buildroot/share/PlatformIO/boards/LERDGE.json index b3e4ca44fa90..21df8db48e7e 100644 --- a/buildroot/share/PlatformIO/boards/LERDGE.json +++ b/buildroot/share/PlatformIO/boards/LERDGE.json @@ -59,6 +59,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "http://www.st.com/en/microcontrollers/stm32f407ZG.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407ZG.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json b/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json index 1778ddaaf020..176563408602 100644 --- a/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json +++ b/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json @@ -59,6 +59,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "http://www.st.com/en/microcontrollers/stm32f407ve.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407ve.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/malyanM200.json b/buildroot/share/PlatformIO/boards/malyanM200.json index bd783fe899fc..4dbf76077404 100644 --- a/buildroot/share/PlatformIO/boards/malyanM200.json +++ b/buildroot/share/PlatformIO/boards/malyanM200.json @@ -30,6 +30,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series/stm32f103/stm32f103cb.html", + "url": "https://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series/stm32f103/stm32f103cb.html", "vendor": "Generic" } diff --git a/buildroot/share/fonts/README.md b/buildroot/share/fonts/README.md index f8f780661f07..cc09b5281063 100644 --- a/buildroot/share/fonts/README.md +++ b/buildroot/share/fonts/README.md @@ -5,7 +5,7 @@ The original author of the following font files is [A. Hardtung](https://github.com/AnHardt). Any copyright is dedicated to the Public Domain. -http://creativecommons.org/publicdomain/zero/1.0/ +https://creativecommons.org/publicdomain/zero/1.0/ - HD44780_C.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) - HD44780_J.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) @@ -20,4 +20,4 @@ Additional changes to the original font files distributed with Marlin are copyri ## Documentation -For detailed information about [adding new fonts](http://www.marlinfw.org/docs/development/fonts.html) to Marlin visit our documentation website. +For detailed information about [adding new fonts](https://www.marlinfw.org/docs/development/fonts.html) to Marlin visit our documentation website. diff --git a/buildroot/share/fonts/uxggenpages.md b/buildroot/share/fonts/uxggenpages.md index c2d94735c709..5e40c392f7f6 100644 --- a/buildroot/share/fonts/uxggenpages.md +++ b/buildroot/share/fonts/uxggenpages.md @@ -99,11 +99,11 @@ At this time, the font file `marlin-6x12-3.bdf` is used to generate the font dat - [WQY](http://wenq.org/) - [WQY 9pt bitmap font](http://wenq.org/daily/wqy-bitmapfont-bdf-gb18030-nightly_build.tar.gz) -- [unifont (16x8 or 16x16)](http://unifoundry.com/unifont.html) +- [unifont (16x8 or 16x16)](https://unifoundry.com/unifont.html) Documents related to the old version of the language engine: -- [Marlin Fonts Documentation](http://www.marlinfw.org/docs/development/fonts.html) +- [Marlin Fonts Documentation](https://www.marlinfw.org/docs/development/fonts.html) - [Marlin LCD Language](https://marlinfw.org/docs/development/lcd_language.html) - [U8GLIB](https://github.com/olikraus/u8glib.git) - [UTF-8 for U8GLIB](https://github.com/yhfudev/u8glib-fontutf8.git) diff --git a/buildroot/share/scripts/createTemperatureLookupMarlin.py b/buildroot/share/scripts/createTemperatureLookupMarlin.py index 03450bc0e0be..b2d8964f556c 100755 --- a/buildroot/share/scripts/createTemperatureLookupMarlin.py +++ b/buildroot/share/scripts/createTemperatureLookupMarlin.py @@ -2,10 +2,10 @@ """Thermistor Value Lookup Table Generator Generates lookup to temperature values for use in a microcontroller in C format based on: -http://en.wikipedia.org/wiki/Steinhart-Hart_equation +https://en.wikipedia.org/wiki/Steinhart-Hart_equation The main use is for Arduino programs that read data from the circuit board described here: -http://reprap.org/wiki/Temperature_Sensor_v2.0 +https://reprap.org/wiki/Temperature_Sensor_v2.0 Usage: python createTemperatureLookupMarlin.py [options] diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf index 1194847f775d..10b39a27d24c 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/vscode/avrdude.conf @@ -147,7 +147,7 @@ # This flag was added to work around a problem with the # at90s4433/2333's; see the at90s4433 errata at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # @@ -184,7 +184,7 @@ # section avr061.zip which accompanies the application note # AVR061 available from: # -# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# https://www.atmel.com/atmel/acrobat/doc2525.pdf # #define ATTINY10 0x10 /* the _old_ one that never existed! */ @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + desc = "Brian Dean's Programmer, https://www.bsdhome.com/avrdude/"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -655,7 +655,7 @@ programmer programmer id = "alf"; - desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; + desc = "Nightshade ALF-PgmAVR, https://nightshade.homeip.net/"; type = par; vcc = 2, 3, 4, 5; buff = 6; @@ -682,7 +682,7 @@ programmer programmer id = "picoweb"; - desc = "Picoweb Programming Cable, http://www.picoweb.net/"; + desc = "Picoweb Programming Cable, https://www.picoweb.net/"; type = par; reset = 2; sck = 3; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on http://electropol.free.fr) +# disconnect port (download on https://electropol.free.fr) programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +# https://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 programmer id = "89isp"; desc = "Atmel at89isp cable"; @@ -836,7 +836,7 @@ programmer programmer id = "siprog"; - desc = "Lancos SI-Prog "; + desc = "Lancos SI-Prog "; type = serbb; reset = ~3; sck = 7; diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf index 46e7ace34b21..b1eca4e319c2 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -147,7 +147,7 @@ # This flag was added to work around a problem with the # at90s4433/2333's; see the at90s4433 errata at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # @@ -184,7 +184,7 @@ # section avr061.zip which accompanies the application note # AVR061 available from: # -# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# https://www.atmel.com/atmel/acrobat/doc2525.pdf # #define ATTINY10 0x10 /* the _old_ one that never existed! */ @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + desc = "Brian Dean's Programmer, https://www.bsdhome.com/avrdude/"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -655,7 +655,7 @@ programmer programmer id = "alf"; - desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; + desc = "Nightshade ALF-PgmAVR, https://nightshade.homeip.net/"; type = par; vcc = 2, 3, 4, 5; buff = 6; @@ -682,7 +682,7 @@ programmer programmer id = "picoweb"; - desc = "Picoweb Programming Cable, http://www.picoweb.net/"; + desc = "Picoweb Programming Cable, https://www.picoweb.net/"; type = par; reset = 2; sck = 3; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on http://electropol.free.fr) +# disconnect port (download on https://electropol.free.fr) programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +# https://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 programmer id = "89isp"; desc = "Atmel at89isp cable"; @@ -836,7 +836,7 @@ programmer programmer id = "siprog"; - desc = "Lancos SI-Prog "; + desc = "Lancos SI-Prog "; type = serbb; reset = ~3; sck = 7; diff --git a/buildroot/share/vscode/avrdude_macOS.conf b/buildroot/share/vscode/avrdude_macOS.conf index d933567452fc..2212ab46e7b0 100644 --- a/buildroot/share/vscode/avrdude_macOS.conf +++ b/buildroot/share/vscode/avrdude_macOS.conf @@ -147,7 +147,7 @@ # This flag was added to work around a problem with the # at90s4433/2333's; see the at90s4433 errata at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # @@ -184,7 +184,7 @@ # section avr061.zip which accompanies the application note # AVR061 available from: # -# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# https://www.atmel.com/atmel/acrobat/doc2525.pdf # #define ATTINY10 0x10 /* the _old_ one that never existed! */ @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; @@ -630,7 +630,7 @@ programmer programmer id = "siprog"; - desc = "Lancos SI-Prog "; + desc = "Lancos SI-Prog "; type = serbb; reset = ~3; sck = 7; diff --git a/platformio.ini b/platformio.ini index 246abc11bde4..edc027a6d315 100644 --- a/platformio.ini +++ b/platformio.ini @@ -769,7 +769,7 @@ upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" # # STM32F407VET6 with RAMPS-like shield -# 'Black' STM32F407VET6 board - http://wiki.stm32duino.com/index.php?title=STM32F407 +# 'Black' STM32F407VET6 board - https://wiki.stm32duino.com/index.php?title=STM32F407 # Shield - https://github.com/jmz52/Hardware # [env:STM32F407VE_black] From 9156c32a54b52fd6fc151644025330f229897eb4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 23 Jul 2020 21:00:55 -0500 Subject: [PATCH 210/483] ibid. --- buildroot/share/vscode/avrdude.conf | 24 +++++++++++------------ buildroot/share/vscode/avrdude_linux.conf | 24 +++++++++++------------ buildroot/share/vscode/avrdude_macOS.conf | 10 +++++----- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf index 10b39a27d24c..1194847f775d 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/vscode/avrdude.conf @@ -147,7 +147,7 @@ # This flag was added to work around a problem with the # at90s4433/2333's; see the at90s4433 errata at: # -# https://www.atmel.com/atmel/acrobat/doc1280.pdf +# http://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # @@ -184,7 +184,7 @@ # section avr061.zip which accompanies the application note # AVR061 available from: # -# https://www.atmel.com/atmel/acrobat/doc2525.pdf +# http://www.atmel.com/atmel/acrobat/doc2525.pdf # #define ATTINY10 0x10 /* the _old_ one that never existed! */ @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, https://www.fischl.de/usbasp/"; + desc = "USBasp, http://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, https://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, https://www.bsdhome.com/avrdude/"; + desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -655,7 +655,7 @@ programmer programmer id = "alf"; - desc = "Nightshade ALF-PgmAVR, https://nightshade.homeip.net/"; + desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; type = par; vcc = 2, 3, 4, 5; buff = 6; @@ -682,7 +682,7 @@ programmer programmer id = "picoweb"; - desc = "Picoweb Programming Cable, https://www.picoweb.net/"; + desc = "Picoweb Programming Cable, http://www.picoweb.net/"; type = par; reset = 2; sck = 3; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on https://electropol.free.fr) +# disconnect port (download on http://electropol.free.fr) programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# https://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 programmer id = "89isp"; desc = "Atmel at89isp cable"; @@ -836,7 +836,7 @@ programmer programmer id = "siprog"; - desc = "Lancos SI-Prog "; + desc = "Lancos SI-Prog "; type = serbb; reset = ~3; sck = 7; diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf index b1eca4e319c2..46e7ace34b21 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -147,7 +147,7 @@ # This flag was added to work around a problem with the # at90s4433/2333's; see the at90s4433 errata at: # -# https://www.atmel.com/atmel/acrobat/doc1280.pdf +# http://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # @@ -184,7 +184,7 @@ # section avr061.zip which accompanies the application note # AVR061 available from: # -# https://www.atmel.com/atmel/acrobat/doc2525.pdf +# http://www.atmel.com/atmel/acrobat/doc2525.pdf # #define ATTINY10 0x10 /* the _old_ one that never existed! */ @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, https://www.fischl.de/usbasp/"; + desc = "USBasp, http://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, https://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, https://www.bsdhome.com/avrdude/"; + desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -655,7 +655,7 @@ programmer programmer id = "alf"; - desc = "Nightshade ALF-PgmAVR, https://nightshade.homeip.net/"; + desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; type = par; vcc = 2, 3, 4, 5; buff = 6; @@ -682,7 +682,7 @@ programmer programmer id = "picoweb"; - desc = "Picoweb Programming Cable, https://www.picoweb.net/"; + desc = "Picoweb Programming Cable, http://www.picoweb.net/"; type = par; reset = 2; sck = 3; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on https://electropol.free.fr) +# disconnect port (download on http://electropol.free.fr) programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# https://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 programmer id = "89isp"; desc = "Atmel at89isp cable"; @@ -836,7 +836,7 @@ programmer programmer id = "siprog"; - desc = "Lancos SI-Prog "; + desc = "Lancos SI-Prog "; type = serbb; reset = ~3; sck = 7; diff --git a/buildroot/share/vscode/avrdude_macOS.conf b/buildroot/share/vscode/avrdude_macOS.conf index 2212ab46e7b0..d933567452fc 100644 --- a/buildroot/share/vscode/avrdude_macOS.conf +++ b/buildroot/share/vscode/avrdude_macOS.conf @@ -147,7 +147,7 @@ # This flag was added to work around a problem with the # at90s4433/2333's; see the at90s4433 errata at: # -# https://www.atmel.com/atmel/acrobat/doc1280.pdf +# http://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # @@ -184,7 +184,7 @@ # section avr061.zip which accompanies the application note # AVR061 available from: # -# https://www.atmel.com/atmel/acrobat/doc2525.pdf +# http://www.atmel.com/atmel/acrobat/doc2525.pdf # #define ATTINY10 0x10 /* the _old_ one that never existed! */ @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, https://www.fischl.de/usbasp/"; + desc = "USBasp, http://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, https://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; @@ -630,7 +630,7 @@ programmer programmer id = "siprog"; - desc = "Lancos SI-Prog "; + desc = "Lancos SI-Prog "; type = serbb; reset = ~3; sck = 7; From 2c61e6ba2802919ec8c2caacc34865335464098f Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Thu, 23 Jul 2020 22:27:40 -0400 Subject: [PATCH 211/483] Add CONTROLLER_FAN_IGNORE_Z (#18735) --- Marlin/Configuration_adv.h | 1 + Marlin/src/feature/controllerfan.cpp | 32 ++++++++------------ Marlin/src/feature/mmu2/mmu2.cpp | 2 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 4 +++ buildroot/tests/mega2560-tests | 6 ++-- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0945a6c43409..f27e2722cd10 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -375,6 +375,7 @@ #if ENABLED(USE_CONTROLLER_FAN) //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan //#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered + //#define CONTROLLER_FAN_IGNORE_Z // Ignore Z stepper. Useful when stepper timeout is disabled. #define CONTROLLERFAN_SPEED_MIN 0 // (0-255) Minimum speed. (If set below this value the fan is turned off.) #define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled #define CONTROLLERFAN_SPEED_IDLE 0 // (0-255) Idle speed, used when motors are disabled diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index c9a2dad03dbf..fa5a86b0194e 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -55,30 +55,24 @@ void ControllerFan::update() { #define MOTOR_IS_ON(A,B) (A##_ENABLE_READ() == bool(B##_ENABLE_ON)) #define _OR_ENABLED_E(N) || MOTOR_IS_ON(E##N,E) - const bool motor_on = MOTOR_IS_ON(Z,Z) - #if HAS_Z2_ENABLE - || MOTOR_IS_ON(Z2,Z) - #endif - #if HAS_Z3_ENABLE - || MOTOR_IS_ON(Z3,Z) - #endif - #if HAS_Z4_ENABLE - || MOTOR_IS_ON(Z4,Z) - #endif - || (DISABLED(CONTROLLER_FAN_USE_Z_ONLY) && ( - MOTOR_IS_ON(X,X) || MOTOR_IS_ON(Y,Y) - #if HAS_X2_ENABLE - || MOTOR_IS_ON(X2,X) - #endif - #if HAS_Y2_ENABLE - || MOTOR_IS_ON(Y2,Y) - #endif + const bool motor_on = ( + ( DISABLED(CONTROLLER_FAN_IGNORE_Z) && + ( MOTOR_IS_ON(Z,Z) + || TERN0(HAS_Z2_ENABLE, MOTOR_IS_ON(Z2,Z)) + || TERN0(HAS_Z3_ENABLE, MOTOR_IS_ON(Z3,Z)) + || TERN0(HAS_Z4_ENABLE, MOTOR_IS_ON(Z4,Z)) + ) + ) || ( + DISABLED(CONTROLLER_FAN_USE_Z_ONLY) && + ( MOTOR_IS_ON(X,X) || MOTOR_IS_ON(Y,Y) + || TERN0(HAS_X2_ENABLE, MOTOR_IS_ON(X2,X)) + || TERN0(HAS_Y2_ENABLE, MOTOR_IS_ON(Y2,Y)) #if E_STEPPERS REPEAT(E_STEPPERS, _OR_ENABLED_E) #endif ) ) - ; + ); // If any of the drivers or the heated bed are enabled... if (motor_on || TERN0(HAS_HEATED_BED, thermalManager.temp_bed.soft_pwm_amount > 0)) diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp index aeff7918dde6..35f2db45a907 100644 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -466,7 +466,7 @@ void MMU2::check_version() { } } -static bool mmu2_not_responding() { +static void mmu2_not_responding() { LCD_MESSAGEPGM(MSG_MMU2_NOT_RESPONDING); BUZZ(100, 659); BUZZ(200, 698); diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index 59fd1e54f8b9..efa99164208d 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -197,6 +197,10 @@ #endif #endif +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN EX2_FAN_PIN +#endif + // // Misc. Functions // diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index 3a969c9cf72a..a3920b94688c 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -103,7 +103,8 @@ exec_test $1 $2 "MEGACONTROLLER | Minipanel | M100 | PWM_MOTOR_CURRENT | PRINTCO restore_configs opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO opt_set LCD_LANGUAGE el_gr -opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY +opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY \ + USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z opt_set MIXING_STEPPERS 5 opt_set LCD_LANGUAGE ru exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" @@ -141,7 +142,8 @@ opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE FILAMENT_WIDTH_SENSOR \ Z_SAFE_HOMING SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER \ SD_ABORT_ON_ENDSTOP_HIT HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT ADVANCED_OK M114_DETAIL \ - VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS EXTRA_FAN_SPEED FWRETRACT + VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS EXTRA_FAN_SPEED FWRETRACT \ + USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_USE_Z_ONLY opt_set FAN_MIN_PWM 50 opt_set FAN_KICKSTART_TIME 100 opt_set XY_FREQUENCY_LIMIT 15 From f23393c1ec8a821e3eca4277f73846ff018d05f3 Mon Sep 17 00:00:00 2001 From: Mark Langezaal Date: Fri, 24 Jul 2020 04:28:44 +0200 Subject: [PATCH 212/483] Simplify encoder handling (#18754) --- Marlin/src/lcd/ultralcd.cpp | 51 +++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 45612f6c55c2..9968a3218ae2 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -49,6 +49,8 @@ MarlinUI ui; bool MarlinUI::wait_for_move; // = false #endif +constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; + #if HAS_SPI_LCD #if ENABLED(STATUS_MESSAGE_SCROLLING) uint8_t MarlinUI::status_scroll_offset; // = 0 @@ -440,13 +442,13 @@ bool MarlinUI::get_blink() { #endif { #if HAS_LCD_MENU - if (RRK(EN_KEYPAD_UP)) encoderPosition -= ENCODER_PULSES_PER_STEP; - else if (RRK(EN_KEYPAD_DOWN)) encoderPosition += ENCODER_PULSES_PER_STEP; + if (RRK(EN_KEYPAD_UP)) encoderPosition -= epps; + else if (RRK(EN_KEYPAD_DOWN)) encoderPosition += epps; else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } else if (RRK(EN_KEYPAD_RIGHT)) encoderPosition = 0; #else - if (RRK(EN_KEYPAD_UP) || RRK(EN_KEYPAD_LEFT)) encoderPosition -= ENCODER_PULSES_PER_STEP; - else if (RRK(EN_KEYPAD_DOWN) || RRK(EN_KEYPAD_RIGHT)) encoderPosition += ENCODER_PULSES_PER_STEP; + if (RRK(EN_KEYPAD_UP) || RRK(EN_KEYPAD_LEFT)) encoderPosition -= epps; + else if (RRK(EN_KEYPAD_DOWN) || RRK(EN_KEYPAD_RIGHT)) encoderPosition += epps; #endif } #endif @@ -841,7 +843,7 @@ void MarlinUI::update() { RESET_STATUS_TIMEOUT(); if (touch_buttons & (EN_A | EN_B)) { // Menu arrows, in priority if (ELAPSED(ms, next_button_update_ms)) { - encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * (ENCODER_PULSES_PER_STEP) * encoderDirection; + encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * epps * encoderDirection; if (touch_buttons & EN_A) encoderDiff *= -1; TERN_(AUTO_BED_LEVELING_UBL, external_encoder()); next_button_update_ms = ms + repeat_delay; // Assume the repeat delay @@ -901,26 +903,21 @@ void MarlinUI::update() { #if ENCODER_PULSES_PER_STEP > 1 // When reversing the encoder direction, a movement step can be missed because // encoderDiff has a non-zero residual value, making the controller unresponsive. - // The fix clears the residual value when the encoder is reversed. + // The fix clears the residual value when the encoder is idle. // Also check if past half the threshold to compensate for missed single steps. static int8_t lastEncoderDiff; - int8_t prevDiff = lastEncoderDiff; - lastEncoderDiff = encoderDiff; // Store before updating encoderDiff to save actual steps - - // When not past threshold, and reversing... or past half the threshold - if (WITHIN(abs_diff, 1, (ENCODER_PULSES_PER_STEP) - 1) // Not past threshold - && (abs_diff > (ENCODER_PULSES_PER_STEP) / 2 // Passed half the threshold? Done! Call it a full step. - || (ABS(encoderDiff - prevDiff) >= (ENCODER_PULSES_PER_STEP) // A big change when abs_diff is small implies reverse - && ABS(prevDiff) < (ENCODER_PULSES_PER_STEP) // ...especially when starting from a partial or no step. - ) - ) - ) { - abs_diff = ENCODER_PULSES_PER_STEP; - encoderDiff = (encoderDiff < 0 ? -1 : 1) * abs_diff; // Treat as full step + + // Timeout? No decoder change since last check. 10 or 20 times per second. + if (encoderDiff == lastEncoderDiff && abs_diff <= epps / 2) // Same direction & size but not over a half-step? + encoderDiff = 0; // Clear residual pulses. + else if (WITHIN(abs_diff, epps / 2 + 1, epps - 1)) { // Past half of threshold? + abs_diff = epps; // Treat as a full step size + encoderDiff = (encoderDiff < 0 ? -1 : 1) * abs_diff; // ...in the spin direction. } + lastEncoderDiff = encoderDiff; #endif - const bool encoderPastThreshold = (abs_diff >= (ENCODER_PULSES_PER_STEP)); + const bool encoderPastThreshold = (abs_diff >= epps); if (encoderPastThreshold || lcd_clicked) { if (encoderPastThreshold) { @@ -929,7 +926,7 @@ void MarlinUI::update() { int32_t encoderMultiplier = 1; if (encoderRateMultiplierEnabled) { - const float encoderMovementSteps = float(abs_diff) / (ENCODER_PULSES_PER_STEP); + const float encoderMovementSteps = float(abs_diff) / epps; if (lastEncoderMovementMillis) { // Note that the rate is always calculated between two passes through the @@ -958,7 +955,7 @@ void MarlinUI::update() { #endif // ENCODER_RATE_MULTIPLIER - encoderPosition += (encoderDiff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); + encoderPosition += (encoderDiff * encoderMultiplier) / epps; encoderDiff = 0; } @@ -1191,7 +1188,7 @@ void MarlinUI::update() { // #if ANY_BUTTON(UP, DWN, LFT, RT) - const int8_t pulses = (ENCODER_PULSES_PER_STEP) * encoderDirection; + const int8_t pulses = epps * encoderDirection; if (false) { // for the else-ifs below @@ -1547,17 +1544,17 @@ void MarlinUI::update() { const int8_t xdir = col < (LCD_WIDTH ) / 2 ? -1 : 1, ydir = row < (LCD_HEIGHT) / 2 ? -1 : 1; if (on_edit_screen) - encoderDiff = (ENCODER_PULSES_PER_STEP) * ydir; + encoderDiff = epps * ydir; else if (screen_items > 0) { // Last 3 cols act as a scroll :-) if (col > (LCD_WIDTH) - 5) // 2 * LCD_HEIGHT to scroll to bottom of next page. (LCD_HEIGHT would only go 1 item down.) - encoderDiff = (ENCODER_PULSES_PER_STEP) * (encoderLine - encoderTopLine + 2 * (LCD_HEIGHT)) * ydir; + encoderDiff = epps * (encoderLine - encoderTopLine + 2 * (LCD_HEIGHT)) * ydir; else - encoderDiff = (ENCODER_PULSES_PER_STEP) * (row - encoderPosition + encoderTopLine); + encoderDiff = epps * (row - encoderPosition + encoderTopLine); } else if (!on_status_screen()) - encoderDiff = (ENCODER_PULSES_PER_STEP) * xdir; + encoderDiff = epps * xdir; } #endif From 1d2d616a7c010160b12131c2c344e36abe95378e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 23 Jul 2020 23:35:19 -0500 Subject: [PATCH 213/483] Fix ESP3D_WIFISUPPORT ini typo --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index edc027a6d315..f51f0a3194ee 100644 --- a/platformio.ini +++ b/platformio.ini @@ -54,7 +54,7 @@ TOUCH_UI_FTDI_EVE = src_filter=+ HAS_DGUS_LCD = src_filter=+ DWIN_CREALITY_LCD = src_filter=+ HAS_LCD_MENU = src_filter=+ -(ESP32_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer +(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer ESP3DLib=https://github.com/luc-github/ESP3DLib.git arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git ESP32SSDP=https://github.com/luc-github/ESP32SSDP.git From 8c88c33d9f1a4166db4d5ad0079904d040cf18b8 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 24 Jul 2020 01:47:01 -0300 Subject: [PATCH 214/483] Apply lib_ignore from [features] (#18762) --- .../PlatformIO/scripts/common-features-dependencies.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py index 179af2229421..48081bbd4655 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py @@ -123,6 +123,12 @@ def install_features_dependencies(): proj.set("env:" + env["PIOENV"], "src_filter", [src_filter]) env.Replace(SRC_FILTER=src_filter) + if 'lib_ignore' in FEATURE_DEPENDENCIES[feature]: + print("Ignoring libs for %s... " % feature) + lib_ignore = env.GetProjectOption("lib_ignore") + [FEATURE_DEPENDENCIES[feature]['lib_ignore']] + proj = env.GetProjectConfig() + proj.set("env:" + env["PIOENV"], "lib_ignore", lib_ignore) + # search the current compiler, considering the OS def search_compiler(): if env['PLATFORM'] == 'win32': From 451f48231d922d473bae27d2f8992857f0bc3fe2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 24 Jul 2020 03:09:14 -0500 Subject: [PATCH 215/483] Ender 3 V2 BL24C16 EEPROM support (#18758) --- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 81 ++++++ Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp | 51 ++++ Marlin/src/HAL/shared/eeprom_api.h | 20 +- Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/gcode/eeprom/M500-M504.cpp | 36 +++ Marlin/src/inc/Conditionals_post.h | 3 + Marlin/src/inc/SanityCheck.h | 9 +- Marlin/src/lcd/dwin/dwin.cpp | 9 +- Marlin/src/lcd/dwin/dwin.h | 2 +- Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp | 263 ----------------- Marlin/src/libs/BL24CXX.cpp | 273 ++++++++++++++++++ .../dwin/eeprom_BL24CXX.h => libs/BL24CXX.h} | 36 +-- Marlin/src/libs/hex_print_routines.cpp | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 8 +- buildroot/tests/STM32F103RET6_creality-tests | 1 + 15 files changed, 495 insertions(+), 303 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp create mode 100644 Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp delete mode 100644 Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp create mode 100644 Marlin/src/libs/BL24CXX.cpp rename Marlin/src/{lcd/dwin/eeprom_BL24CXX.h => libs/BL24CXX.h} (65%) diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp new file mode 100644 index 000000000000..f77306a88a17 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -0,0 +1,81 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +// +// PersistentStore +// + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM." +#endif + +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { eeprom_init(); return true; } +bool PersistentStore::access_finish() { return true; } + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t v = *value; + uint8_t * const p = (uint8_t * const)pos; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + delay(2); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + } + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t * const p = (uint8_t * const)pos; + uint8_t c = eeprom_read_byte(p); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // IIC_BL24CXX_EEPROM diff --git a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp new file mode 100644 index 000000000000..33dd277addbe --- /dev/null +++ b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp @@ -0,0 +1,51 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Platform-independent Arduino functions for I2C EEPROM. + * Enable USE_SHARED_EEPROM if not supplied by the framework. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +#include "../../libs/BL24CXX.h" +#include "../shared/eeprom_if.h" + +void eeprom_init() { BL24CXX::init(); } + +// ------------------------ +// Public functions +// ------------------------ + +void eeprom_write_byte(uint8_t *pos, unsigned char value) { + const unsigned eeprom_address = (unsigned)pos; + return BL24CXX::writeOneByte(eeprom_address, value); +} + +uint8_t eeprom_read_byte(uint8_t *pos) { + const unsigned eeprom_address = (unsigned)pos; + return BL24CXX::readOneByte(eeprom_address); +} + +#endif // IIC_BL24CXX_EEPROM diff --git a/Marlin/src/HAL/shared/eeprom_api.h b/Marlin/src/HAL/shared/eeprom_api.h index b97267484e62..6445f7a4aae4 100644 --- a/Marlin/src/HAL/shared/eeprom_api.h +++ b/Marlin/src/HAL/shared/eeprom_api.h @@ -29,20 +29,38 @@ class PersistentStore { public: + + // Total available persistent storage space (in bytes) + static size_t capacity(); + + // Prepare to read or write static bool access_start(); + + // Housecleaning after read or write static bool access_finish(); + + // Write one or more bytes of data and update the CRC + // Return 'true' on write error static bool write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc); + + // Read one or more bytes of data and update the CRC + // Return 'true' on read error static bool read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing=true); - static size_t capacity(); + // Write one or more bytes of data + // Return 'true' on write error static inline bool write_data(const int pos, const uint8_t* value, const size_t size=sizeof(uint8_t)) { int data_pos = pos; uint16_t crc = 0; return write_data(data_pos, value, size, &crc); } + // Write a single byte of data + // Return 'true' on write error static inline bool write_data(const int pos, const uint8_t value) { return write_data(pos, &value); } + // Read one or more bytes of data + // Return 'true' on read error static inline bool read_data(const int pos, uint8_t* value, const size_t size=1) { int data_pos = pos; uint16_t crc = 0; diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 55c0bda4ac01..7ba577504abd 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -72,7 +72,7 @@ #endif #if ENABLED(IIC_BL24CXX_EEPROM) - #include "lcd/dwin/eeprom_BL24CXX.h" + #include "libs/BL24CXX.h" #endif #if ENABLED(DIRECT_STEPPING) @@ -1171,7 +1171,7 @@ void setup() { #if ENABLED(IIC_BL24CXX_EEPROM) BL24CXX::init(); const uint8_t err = BL24CXX::check(); - SERIAL_ECHO_TERNARY(err, "I2C_EEPROM Check ", "failed", "succeeded", "!\n"); + SERIAL_ECHO_TERNARY(err, "BL24CXX Check ", "failed", "succeeded", "!\n"); #endif #if ENABLED(DWIN_CREALITY_LCD) diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp index 4eb6dfcc7628..5aee68ba997a 100644 --- a/Marlin/src/gcode/eeprom/M500-M504.cpp +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -58,11 +58,47 @@ void GcodeSuite::M502() { #endif // !DISABLE_M503 #if ENABLED(EEPROM_SETTINGS) + + #if ENABLED(MARLIN_DEV_MODE) + #include "../../libs/hex_print_routines.h" + #endif + /** * M504: Validate EEPROM Contents */ void GcodeSuite::M504() { + #if ENABLED(MARLIN_DEV_MODE) + const bool dowrite = parser.seenval('W'); + if (dowrite || parser.seenval('R')) { + uint8_t val = 0; + int addr = parser.value_ushort(); + if (dowrite) { + val = parser.byteval('V'); + persistentStore.write_data(addr, &val); + SERIAL_ECHOLNPAIR("Wrote address ", addr, " with ", int(val)); + } + else { + if (parser.seenval('T')) { + const int endaddr = parser.value_ushort(); + while (addr <= endaddr) { + persistentStore.read_data(addr, &val); + SERIAL_ECHOLNPAIR("0x", hex_word(addr), ":", hex_byte(val)); + addr++; + safe_delay(10); + } + SERIAL_EOL(); + } + else { + persistentStore.read_data(addr, &val); + SERIAL_ECHOLNPAIR("Read address ", addr, " and got ", int(val)); + } + } + return; + } + #endif + if (settings.validate()) SERIAL_ECHO_MSG("EEPROM OK"); } + #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 401a64d72d3d..e12310e07c51 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -50,6 +50,8 @@ #define USE_EMULATED_EEPROM 1 #elif ANY(I2C_EEPROM, SPI_EEPROM) #define USE_WIRED_EEPROM 1 + #elif ENABLED(IIC_BL24CXX_EEPROM) + // nothing #else #define USE_FALLBACK_EEPROM 1 #endif @@ -60,6 +62,7 @@ #undef SDCARD_EEPROM_EMULATION #undef SRAM_EEPROM_EMULATION #undef FLASH_EEPROM_EMULATION + #undef IIC_BL24CXX_EEPROM #endif #ifdef TEENSYDUINO diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index f8e4dc669aee..a90571b17555 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2131,8 +2131,13 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal */ #if ENABLED(EEPROM_SETTINGS) #if 1 < 0 \ - + ENABLED(I2C_EEPROM) + ENABLED(SPI_EEPROM) + ENABLED(QSPI_EEPROM) \ - + ENABLED(SDCARD_EEPROM_EMULATION) + ENABLED(FLASH_EEPROM_EMULATION) + ENABLED(SRAM_EEPROM_EMULATION) + + ENABLED(I2C_EEPROM) \ + + ENABLED(SPI_EEPROM) \ + + ENABLED(QSPI_EEPROM) \ + + ENABLED(SDCARD_EEPROM_EMULATION) \ + + ENABLED(FLASH_EEPROM_EMULATION) \ + + ENABLED(SRAM_EEPROM_EMULATION) \ + + ENABLED(IIC_BL24CXX_EEPROM) #error "Please select only one method of EEPROM Persistent Storage." #endif #endif diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 4f661ca9536d..fd2b6810cc6d 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -185,10 +185,11 @@ int temphot = 0, tempbed = 0; float zprobe_zoffset = 0; float last_zoffset = 0, last_probe_zoffset = 0; -#define FONT_EEPROM_OFFSET 0 +#define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) + // BL24CXX::check() uses 0x00 void lcd_select_language(void) { - BL24CXX::read(FONT_EEPROM_OFFSET, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); + BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); if (HMI_flag.language_flag) DWIN_JPG_CacheTo1(Language_Chinese); else @@ -198,12 +199,12 @@ void lcd_select_language(void) { void set_english_to_eeprom(void) { HMI_flag.language_flag = 0; DWIN_JPG_CacheTo1(Language_English); - BL24CXX::write(FONT_EEPROM_OFFSET, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); } void set_chinese_to_eeprom(void) { HMI_flag.language_flag = 1; DWIN_JPG_CacheTo1(Language_Chinese); - BL24CXX::write(FONT_EEPROM_OFFSET, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); } void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/dwin.h index e834ef3e24e6..2d24d2504e7e 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/dwin.h @@ -27,7 +27,7 @@ #include "dwin_lcd.h" #include "rotary_encoder.h" -#include "eeprom_BL24CXX.h" +#include "../../libs/BL24CXX.h" #include diff --git a/Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp b/Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp deleted file mode 100644 index 25356ab406a0..000000000000 --- a/Marlin/src/lcd/dwin/eeprom_BL24CXX.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/******************************************************************************** - * @file eeprom_BL24CXX.cpp - * @brief i2c EEPROM for Ender 3 v2 board (4.2.2) - ********************************************************************************/ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(IIC_BL24CXX_EEPROM) - -#include "eeprom_BL24CXX.h" -#include "../../MarlinCore.h" - -#include - -/******************** IIC ********************/ - -// åˆå§‹åŒ–IIC -void IIC::init() { - SET_OUTPUT(IIC_EEPROM_SDA); - SET_OUTPUT(IIC_EEPROM_SCL); - - IIC_SCL_1(); - IIC_SDA_1(); -} - -// 产生IICèµ·å§‹ä¿¡å· -void IIC::start() { - SDA_OUT(); // sda线输出 - IIC_SDA_1(); - IIC_SCL_1(); - delay_us(4); - IIC_SDA_0(); // START:when CLK is high, DATA change form high to low - delay_us(4); - IIC_SCL_0(); // é’³ä½I2C总线,准备å‘é€æˆ–æŽ¥æ”¶æ•°æ® -} - -// 产生IICåœæ­¢ä¿¡å· -void IIC::stop() { - SDA_OUT(); // sda线输出 - IIC_SCL_0(); - IIC_SDA_0(); // STOP:when CLK is high DATA change form low to high - delay_us(4); - IIC_SCL_1(); - IIC_SDA_1(); // å‘é€I2C总线结æŸä¿¡å· - delay_us(4); -} - -// 等待应答信å·åˆ°æ¥ -// 返回值:1,接收应答失败 -// 0,接收应答æˆåŠŸ -uint8_t IIC::wait_ack() { - uint8_t ucErrTime=0; - SDA_IN(); // SDA设置为输入 - IIC_SDA_1();delay_us(1); - IIC_SCL_1();delay_us(1); - while (READ_SDA()) { - ucErrTime++; - if (ucErrTime>250) { - stop(); - return 1; - } - } - IIC_SCL_0(); // 时钟输出0 - return 0; -} - -// 产生ACK应答 -void IIC::ack() { - IIC_SCL_0(); - SDA_OUT(); - IIC_SDA_0(); - delay_us(2); - IIC_SCL_1(); - delay_us(2); - IIC_SCL_0(); -} - -// ä¸äº§ç”ŸACK应答 -void IIC::nAck() { - IIC_SCL_0(); - SDA_OUT(); - IIC_SDA_1(); - delay_us(2); - IIC_SCL_1(); - delay_us(2); - IIC_SCL_0(); -} - -// IICå‘é€ä¸€ä¸ªå­—节 -// 返回从机有无应答 -// 1,有应答 -// 0,无应答 -void IIC::send_byte(uint8_t txd) { - SDA_OUT(); - IIC_SCL_0(); // 拉低时钟开始数æ®ä¼ è¾“ - LOOP_L_N(t, 8) { - // IIC_SDA = (txd & 0x80) >> 7; - if (txd & 0x80) IIC_SDA_1(); else IIC_SDA_0(); - txd <<= 1; - delay_us(2); // 对TEA5767这三个延时都是必须的 - IIC_SCL_1(); - delay_us(2); - IIC_SCL_0(); - delay_us(2); - } -} - -// 读1个字节,ack=1时,å‘é€ACK,ack=0,å‘é€nACK -uint8_t IIC::read_byte(unsigned char ack_chr) { - unsigned char receive = 0; - SDA_IN(); // SDA设置为输入 - LOOP_L_N(i, 8) { - IIC_SCL_0(); - delay_us(2); - IIC_SCL_1(); - receive <<= 1; - if (READ_SDA()) receive++; - delay_us(1); - } - ack_chr ? ack() : nAck(); // å‘é€ACK / å‘é€nACK - return receive; -} - -/******************** EEPROM ********************/ - -// åˆå§‹åŒ–IICæŽ¥å£ -void BL24CXX::init() { IIC::init(); } - -// 在BL24CXX指定地å€è¯»å‡ºä¸€ä¸ªæ•°æ® -// ReadAddr:å¼€å§‹è¯»æ•°çš„åœ°å€ -// 返回值 :è¯»åˆ°çš„æ•°æ® -uint8_t BL24CXX::readOneByte(uint16_t ReadAddr) { - uint8_t temp = 0; - IIC::start(); - if (EE_TYPE > BL24C16) { - IIC::send_byte(0xA0); // å‘é€å†™å‘½ä»¤ - IIC::wait_ack(); - IIC::send_byte(ReadAddr >> 8); // å‘é€é«˜åœ°å€ - IIC::wait_ack(); - } - else - IIC::send_byte(0xA0 + ((ReadAddr >> 8) << 1)); // å‘é€å™¨ä»¶åœ°å€0xA0,å†™æ•°æ® - - IIC::wait_ack(); - IIC::send_byte(ReadAddr & 0xFF); // å‘é€ä½Žåœ°å€ - IIC::wait_ack(); - IIC::start(); - IIC::send_byte(0xA1); // è¿›å…¥æŽ¥æ”¶æ¨¡å¼ - IIC::wait_ack(); - temp = IIC::read_byte(0); - IIC::stop(); // 产生一个åœæ­¢æ¡ä»¶ - return temp; -} - -// 在BL24CXX指定地å€å†™å…¥ä¸€ä¸ªæ•°æ® -// WriteAddr :写入数æ®çš„ç›®çš„åœ°å€ -// DataToWrite:è¦å†™å…¥çš„æ•°æ® -void BL24CXX::writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite) { - IIC::start(); - if (EE_TYPE > BL24C16) { - IIC::send_byte(0xA0); // å‘é€å†™å‘½ä»¤ - IIC::wait_ack(); - IIC::send_byte(WriteAddr >> 8); // å‘é€é«˜åœ°å€ - } - else { - IIC::send_byte(0xA0 + ((WriteAddr >> 8) << 1)); // å‘é€å™¨ä»¶åœ°å€0xA0,å†™æ•°æ® - } - IIC::wait_ack(); - IIC::send_byte(WriteAddr & 0xFF); // å‘é€ä½Žåœ°å€ - IIC::wait_ack(); - IIC::send_byte(DataToWrite); // å‘é€å­—节 - IIC::wait_ack(); - IIC::stop(); // 产生一个åœæ­¢æ¡ä»¶ - delay(10); -} - -// 在BL24CXX里é¢çš„指定地å€å¼€å§‹å†™å…¥é•¿åº¦ä¸ºLençš„æ•°æ® -// 该函数用于写入16bit或者32bitçš„æ•°æ®. -// WriteAddr :å¼€å§‹å†™å…¥çš„åœ°å€ -// DataToWrite:æ•°æ®æ•°ç»„é¦–åœ°å€ -// Len :è¦å†™å…¥æ•°æ®çš„长度2,4 -void BL24CXX::writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len) { - LOOP_L_N(t, Len) - writeOneByte(WriteAddr + t, (DataToWrite >> (8 * t)) & 0xFF); -} - -// 在BL24CXX里é¢çš„指定地å€å¼€å§‹è¯»å‡ºé•¿åº¦ä¸ºLençš„æ•°æ® -// 该函数用于读出16bit或者32bitçš„æ•°æ®. -// ReadAddr :å¼€å§‹è¯»å‡ºçš„åœ°å€ -// 返回值 :æ•°æ® -// Len :è¦è¯»å‡ºæ•°æ®çš„长度2,4 -uint32_t BL24CXX::readLenByte(uint16_t ReadAddr, uint8_t Len) { - uint32_t temp = 0; - LOOP_L_N(t, Len) { - temp <<= 8; - temp += readOneByte(ReadAddr + Len - t - 1); - } - return temp; -} - -// 检查BL24CXX是å¦æ­£å¸¸ -// 这里用了24XX的最åŽä¸€ä¸ªåœ°å€(255)æ¥å­˜å‚¨æ ‡å¿—å­—. -// 如果用其他24C系列,这个地å€è¦ä¿®æ”¹ -// 返回1:检测失败 -// 返回0:检测æˆåŠŸ -uint8_t BL24CXX::check() { - uint8_t temp; - temp = readOneByte(255); // é¿å…æ¯æ¬¡å¼€æœºéƒ½å†™BL24CXX - if (temp == 'U') return 0; - else { // 排除第一次åˆå§‹åŒ–的情况 - writeOneByte(255, 'U'); - temp = readOneByte(255); - if (temp == 'U') return 0; - } - return 1; -} - -// 在BL24CXX里é¢çš„指定地å€å¼€å§‹è¯»å‡ºæŒ‡å®šä¸ªæ•°çš„æ•°æ® -// ReadAddr :å¼€å§‹è¯»å‡ºçš„åœ°å€ å¯¹24c02为0~255 -// pBuffer :æ•°æ®æ•°ç»„é¦–åœ°å€ -// NumToRead:è¦è¯»å‡ºæ•°æ®çš„个数 -void BL24CXX::read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead) { - while (NumToRead) { - *pBuffer++ = readOneByte(ReadAddr++); - NumToRead--; - } -} - -// 在BL24CXX里é¢çš„指定地å€å¼€å§‹å†™å…¥æŒ‡å®šä¸ªæ•°çš„æ•°æ® -// WriteAddr :å¼€å§‹å†™å…¥çš„åœ°å€ å¯¹24c02为0~255 -// pBuffer :æ•°æ®æ•°ç»„é¦–åœ°å€ -// NumToWrite:è¦å†™å…¥æ•°æ®çš„个数 -void BL24CXX::write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite) { - while (NumToWrite--) { - writeOneByte(WriteAddr, *pBuffer); - WriteAddr++; - pBuffer++; - } -} - -#endif // IIC_BL24CXX_EEPROM diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp new file mode 100644 index 000000000000..d34ed8340f83 --- /dev/null +++ b/Marlin/src/libs/BL24CXX.cpp @@ -0,0 +1,273 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "BL24CXX.h" +#include + +#ifndef EEPROM_WRITE_DELAY + #define EEPROM_WRITE_DELAY 10 +#endif +#ifndef EEPROM_DEVICE_ADDRESS + #define EEPROM_DEVICE_ADDRESS (0x50 << 1) +#endif + +// IO direction setting +#define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0) +#define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0) + +// IO ops +#define IIC_SCL_0() WRITE(IIC_EEPROM_SCL, LOW) +#define IIC_SCL_1() WRITE(IIC_EEPROM_SCL, HIGH) +#define IIC_SDA_0() WRITE(IIC_EEPROM_SDA, LOW) +#define IIC_SDA_1() WRITE(IIC_EEPROM_SDA, HIGH) +#define READ_SDA() READ(IIC_EEPROM_SDA) + +// +// Simple IIC interface via libmaple +// + +// Initialize IIC +void IIC::init() { + SET_OUTPUT(IIC_EEPROM_SDA); + SET_OUTPUT(IIC_EEPROM_SCL); + IIC_SCL_1(); + IIC_SDA_1(); +} + +// Generate IIC start signal +void IIC::start() { + SDA_OUT(); // SDA line output + IIC_SDA_1(); + IIC_SCL_1(); + delay_us(4); + IIC_SDA_0(); // START:when CLK is high, DATA change from high to low + delay_us(4); + IIC_SCL_0(); // Clamp the I2C bus, ready to send or receive data +} + +// Generate IIC stop signal +void IIC::stop() { + SDA_OUT(); // SDA line output + IIC_SCL_0(); + IIC_SDA_0(); // STOP:when CLK is high DATA change from low to high + delay_us(4); + IIC_SCL_1(); + IIC_SDA_1(); // Send I2C bus end signal + delay_us(4); +} + +// Wait for the response signal to arrive +// 1 = failed to receive response +// 0 = response received +uint8_t IIC::wait_ack() { + uint8_t ucErrTime = 0; + SDA_IN(); // SDA is set as input + IIC_SDA_1(); delay_us(1); + IIC_SCL_1(); delay_us(1); + while (READ_SDA()) { + if (++ucErrTime > 250) { + stop(); + return 1; + } + } + IIC_SCL_0(); // Clock output 0 + return 0; +} + +// Generate ACK response +void IIC::ack() { + IIC_SCL_0(); + SDA_OUT(); + IIC_SDA_0(); + delay_us(2); + IIC_SCL_1(); + delay_us(2); + IIC_SCL_0(); +} + +// No ACK response +void IIC::nAck() { + IIC_SCL_0(); + SDA_OUT(); + IIC_SDA_1(); + delay_us(2); + IIC_SCL_1(); + delay_us(2); + IIC_SCL_0(); +} + +// Send one IIC byte +// Return whether the slave responds +// 1 = there is a response +// 0 = no response +void IIC::send_byte(uint8_t txd) { + SDA_OUT(); + IIC_SCL_0(); // Pull down the clock to start data transmission + LOOP_L_N(t, 8) { + // IIC_SDA = (txd & 0x80) >> 7; + if (txd & 0x80) IIC_SDA_1(); else IIC_SDA_0(); + txd <<= 1; + delay_us(2); // All three delays are necessary for TEA5767 + IIC_SCL_1(); + delay_us(2); + IIC_SCL_0(); + delay_us(2); + } +} + +// Read 1 byte, when ack=1, send ACK, ack=0, send nACK +uint8_t IIC::read_byte(unsigned char ack_chr) { + unsigned char receive = 0; + SDA_IN(); // SDA is set as input + LOOP_L_N(i, 8) { + IIC_SCL_0(); + delay_us(2); + IIC_SCL_1(); + receive <<= 1; + if (READ_SDA()) receive++; + delay_us(1); + } + ack_chr ? ack() : nAck(); // Send ACK / send nACK + return receive; +} + +/******************** EEPROM ********************/ + +// Initialize the IIC interface +void BL24CXX::init() { IIC::init(); } + +// Read a byte at the specified address +// ReadAddr: the address to start reading +// Return: the byte read +uint8_t BL24CXX::readOneByte(uint16_t ReadAddr) { + uint8_t temp = 0; + IIC::start(); + if (EE_TYPE > BL24C16) { + IIC::send_byte(EEPROM_DEVICE_ADDRESS); // Send write command + IIC::wait_ack(); + IIC::send_byte(ReadAddr >> 8); // Send high address + IIC::wait_ack(); + } + else + IIC::send_byte(EEPROM_DEVICE_ADDRESS + ((ReadAddr >> 8) << 1)); // Send device address 0xA0, write data + + IIC::wait_ack(); + IIC::send_byte(ReadAddr & 0xFF); // Send low address + IIC::wait_ack(); + IIC::start(); + IIC::send_byte(EEPROM_DEVICE_ADDRESS | 0x01); // Send byte + IIC::wait_ack(); + temp = IIC::read_byte(0); + IIC::stop(); // Generate a stop condition + return temp; +} + +// Write a data at the address specified by BL24CXX +// WriteAddr: The destination address for writing data +// DataToWrite: the data to be written +void BL24CXX::writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite) { + IIC::start(); + if (EE_TYPE > BL24C16) { + IIC::send_byte(EEPROM_DEVICE_ADDRESS); // Send write command + IIC::wait_ack(); + IIC::send_byte(WriteAddr >> 8); // Send high address + } + else + IIC::send_byte(EEPROM_DEVICE_ADDRESS + ((WriteAddr >> 8) << 1)); // Send device address 0xA0, write data + + IIC::wait_ack(); + IIC::send_byte(WriteAddr & 0xFF); // Send low address + IIC::wait_ack(); + IIC::send_byte(DataToWrite); // Receiving mode + IIC::wait_ack(); + IIC::stop(); // Generate a stop condition + delay(10); +} + +// Start writing data of length Len at the specified address in BL24CXX +// This function is used to write 16bit or 32bit data. +// WriteAddr: the address to start writing +// DataToWrite: the first address of the data array +// Len: The length of the data to be written 2, 4 +void BL24CXX::writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len) { + LOOP_L_N(t, Len) + writeOneByte(WriteAddr + t, (DataToWrite >> (8 * t)) & 0xFF); +} + +// Start reading data of length Len from the specified address in BL24CXX +// This function is used to read 16bit or 32bit data. +// ReadAddr: the address to start reading +// Return value: data +// Len: The length of the data to be read 2,4 +uint32_t BL24CXX::readLenByte(uint16_t ReadAddr, uint8_t Len) { + uint32_t temp = 0; + LOOP_L_N(t, Len) { + temp <<= 8; + temp += readOneByte(ReadAddr + Len - t - 1); + } + return temp; +} + +// Check if BL24CXX is normal +// Return 1: Detection failed +// return 0: detection is successful +#define BL24CXX_TEST_ADDRESS 0x00 +#define BL24CXX_TEST_VALUE 0x55 + +bool BL24CXX::_check() { + return (readOneByte(BL24CXX_TEST_ADDRESS) != BL24CXX_TEST_VALUE); // false = success! +} + +bool BL24CXX::check() { + if (_check()) { // Value was written? Good EEPROM! + writeOneByte(BL24CXX_TEST_ADDRESS, BL24CXX_TEST_VALUE); // Write now and check. + return _check(); + } + return false; // success! +} + +// Start reading the specified number of data at the specified address in BL24CXX +// ReadAddr: The address to start reading is 0~255 for 24c02 +// pBuffer: the first address of the data array +// NumToRead: the number of data to be read +void BL24CXX::read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead) { + for (; NumToRead; NumToRead--) + *pBuffer++ = readOneByte(ReadAddr++); +} + +// Start writing the specified number of data at the specified address in BL24CXX +// WriteAddr: the address to start writing, 0~255 for 24c02 +// pBuffer: the first address of the data array +// NumToWrite: the number of data to be written +void BL24CXX::write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite) { + for (; NumToWrite; NumToWrite--, WriteAddr++) + writeOneByte(WriteAddr, *pBuffer++); +} + +#endif // IIC_BL24CXX_EEPROM diff --git a/Marlin/src/lcd/dwin/eeprom_BL24CXX.h b/Marlin/src/libs/BL24CXX.h similarity index 65% rename from Marlin/src/lcd/dwin/eeprom_BL24CXX.h rename to Marlin/src/libs/BL24CXX.h index e253cc9be269..b069c196c035 100644 --- a/Marlin/src/lcd/dwin/eeprom_BL24CXX.h +++ b/Marlin/src/libs/BL24CXX.h @@ -22,25 +22,12 @@ #pragma once /******************************************************************************** - * @file eeprom_BL24CXX.h + * @file BL24CXX.h * @brief i2c EEPROM for Ender 3 v2 board (4.2.2) ********************************************************************************/ -#include - /******************** IIC ********************/ -//IO direction setting -#define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0) -#define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0) - -//IO operation function -#define IIC_SCL_0() WRITE(IIC_EEPROM_SCL, LOW) -#define IIC_SCL_1() WRITE(IIC_EEPROM_SCL, HIGH) -#define IIC_SDA_0() WRITE(IIC_EEPROM_SDA, LOW) -#define IIC_SDA_1() WRITE(IIC_EEPROM_SDA, HIGH) -#define READ_SDA() READ(IIC_EEPROM_SDA) - class BL24CXX; // All operation functions of IIC @@ -55,9 +42,6 @@ friend class BL24CXX; static uint8_t wait_ack(); // IIC waits for ACK signal static void ack(); // IIC sends ACK signal static void nAck(); // IIC does not send ACK signal - - static void write_one_byte(uint8_t daddr, uint8_t addr, uint8_t data); - static uint8_t read_one_byte(uint8_t daddr, uint8_t addr); }; /******************** EEPROM ********************/ @@ -74,13 +58,15 @@ friend class BL24CXX; #define EE_TYPE BL24C16 class BL24CXX { +private: + static bool _check(); // Check the device public: - static void init(); // Initialize IIC - static uint8_t check(); // Check the device - static uint8_t readOneByte(uint16_t ReadAddr); // Read a byte at the specified address - static void writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite); // Write a byte at the specified address - static void writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len);// The specified address begins to write the data of the specified length - static uint32_t readLenByte(uint16_t ReadAddr, uint8_t Len); // The specified address starts to read the data of the specified length - static void write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite); // Write the specified length of data from the specified address - static void read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead); // Read the data of the specified length from the specified address + static void init(); // Initialize IIC + static bool check(); // Check / recheck the device + static uint8_t readOneByte(uint16_t ReadAddr); // Read a byte at the specified address + static void writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite); // Write a byte at the specified address + static void writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len); // The specified address begins to write the data of the specified length + static uint32_t readLenByte(uint16_t ReadAddr, uint8_t Len); // The specified address starts to read the data of the specified length + static void write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite); // Write the specified length of data from the specified address + static void read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead); // Read the data of the specified length from the specified address }; diff --git a/Marlin/src/libs/hex_print_routines.cpp b/Marlin/src/libs/hex_print_routines.cpp index 3ab81e596a0c..5909ffd7d015 100644 --- a/Marlin/src/libs/hex_print_routines.cpp +++ b/Marlin/src/libs/hex_print_routines.cpp @@ -23,7 +23,7 @@ #include "../inc/MarlinConfig.h" #include "../gcode/parser.h" -#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG) +#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE) #include "hex_print_routines.h" diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index cf7594f78428..8a413945b788 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -47,12 +47,12 @@ #if ENABLED(IIC_BL24CXX_EEPROM) #define IIC_EEPROM_SDA PA11 #define IIC_EEPROM_SCL PA12 - //#define MARLIN_EEPROM_SIZE 0x4000 // 16Kb (24c16) + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) + #else + #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb #endif - #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX - #define MARLIN_EEPROM_SIZE 0x1000 // 4Kb - // SPI //#define SPI_EEPROM // EEPROM on SPI-0 //#define SPI_CHAN_EEPROM1 ? diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests index f9ae634ebc76..ca723c7aa229 100644 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -10,6 +10,7 @@ set -e # Build with configs included in the PR # use_example_configs "Creality/Ender-3 V2" +opt_enable MARLIN_DEV_MODE exec_test $1 $2 "Ender 3 v2" restore_configs From 87ff532a419f3053c1745160a8c370c83f4ab548 Mon Sep 17 00:00:00 2001 From: fleek Date: Fri, 24 Jul 2020 16:58:46 +0800 Subject: [PATCH 216/483] Filament Runout pin for Creality v4.2.2 board (#18763) --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 8a413945b788..ed281eb00c21 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -79,6 +79,13 @@ #define Z_PROBE_PIN PB1 // BLTouch IN +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA4 // "Pulled-high" +#endif + // // Steppers // From 97c655967fc2a2832b000891e204bdc2eeb7b4be Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 25 Jul 2020 00:09:21 +0000 Subject: [PATCH 217/483] [cron] Bump distribution date (2020-07-25) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index cc93a7bd9b03..834f46da64df 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-24" + #define STRING_DISTRIBUTION_DATE "2020-07-25" #endif /** From 0a81eb15e263282eabd1110548d176362c3c7ab3 Mon Sep 17 00:00:00 2001 From: fleek Date: Sat, 25 Jul 2020 11:53:35 +0800 Subject: [PATCH 218/483] Ender 3 V2: Inject 'G28 O' before G29 (#18767) --- Marlin/src/lcd/dwin/dwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index fd2b6810cc6d..f8c1819c5138 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -2375,7 +2375,7 @@ void HMI_Control(void) { void HMI_Leveling(void) { Popup_Window_Leveling(); DWIN_UpdateLCD(); - queue.inject_P(PSTR("G29")); + queue.inject_P(PSTR("G28O\nG29")); } /* Axis Move */ From 60500c0c49259960d11863f9af24df039b7d5fec Mon Sep 17 00:00:00 2001 From: "J.C. Nelson" <32139633+xC0000005@users.noreply.github.com> Date: Fri, 24 Jul 2020 20:56:33 -0700 Subject: [PATCH 219/483] Fix Lerdge variant script (#18771) --- .../scripts/copy_marlin_variant_to_framework.py | 13 ------------- platformio.ini | 2 +- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index c27019990fc5..02957ec47026 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -15,19 +15,6 @@ def copytree(src, dst, symlinks=False, ignore=None): platform = env.PioPlatform() board = env.BoardConfig() variant = board.get("build.variant") -variant_dir = ' +'; -src_filter = env.get("SRC_FILTER") -print("Starting SRC Filter:", env.get("SRC_FILTER")) -src_filter_value = src_filter[0]; - -src_filter_value = src_filter_value + variant_dir -src_filter[0] = src_filter_value; -env["SRC_FILTER"] = src_filter - -print("Modified SRC Filter:", env.get("SRC_FILTER")) - -cxx_flags = env['CXXFLAGS'] -print("CXXFLAGS", cxx_flags) FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32") assert os.path.isdir(FRAMEWORK_DIR) diff --git a/platformio.ini b/platformio.ini index f51f0a3194ee..6ad1916a936a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -846,7 +846,7 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common_stm32.build_flags} -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE - -DTRANSFER_CLOCK_DIV=8 + -DTRANSFER_CLOCK_DIV=8 -DHAL_SRAM_MODULE_ENABLED build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 # From c5ec80d6c7a9acc40e4d0dd20d6282d6ec192461 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 25 Jul 2020 00:31:15 -0400 Subject: [PATCH 220/483] G425/G35 menu items; G425 pre- and post- scripts (#18737) --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/gcode/calibrate/G425.cpp | 9 +++++++++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_motion.cpp | 14 ++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f27e2722cd10..3f097c09e311 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -898,6 +898,9 @@ //#define CALIBRATION_GCODE #if ENABLED(CALIBRATION_GCODE) + //#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..." + //#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved" + #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm #define CALIBRATION_FEEDRATE_SLOW 60 // mm/m diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index c14e5e395c45..0ef23d28f92b 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -576,6 +576,11 @@ inline void calibrate_all() { * no args - Perform entire calibration sequence (backlash + position on all toolheads) */ void GcodeSuite::G425() { + + #ifdef CALIBRATION_SCRIPT_PRE + GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_PRE)); + #endif + TEMPORARY_SOFT_ENDSTOP_STATE(false); TEMPORARY_BED_LEVELING_STATE(false); @@ -606,6 +611,10 @@ void GcodeSuite::G425() { #endif else calibrate_all(); + + #ifdef CALIBRATION_SCRIPT_POST + GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_POST)); + #endif } #endif // CALIBRATION_GCODE diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index de8cfc85ff71..391cb598cffc 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -66,6 +66,7 @@ namespace Language_en { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Homing XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click to Begin"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Next Point"); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 9b16b68e4e21..9c49a3cdb7dd 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -325,6 +325,13 @@ void menu_motion() { GCODES_ITEM(MSG_AUTO_HOME_Z, PSTR("G28Z")); #endif + // + // Auto-calibration + // + #if ENABLED(CALIBRATION_GCODE) + GCODES_ITEM(MSG_AUTO_CALIBRATE, PSTR("G425")); + #endif + // // Auto Z-Align // @@ -332,6 +339,13 @@ void menu_motion() { GCODES_ITEM(MSG_AUTO_Z_ALIGN, PSTR("G34")); #endif + // + // Assisted Bed Tramming + // + #if ENABLED(ASSISTED_TRAMMING) + GCODES_ITEM(MSG_ASSISTED_TRAMMING, PSTR("G35")); + #endif + // // Level Bed // From d20d4591321aa467c062f0050355d2aca84e03ad Mon Sep 17 00:00:00 2001 From: MKS-Sean <56996910+MKS-Sean@users.noreply.github.com> Date: Sat, 25 Jul 2020 13:52:07 +0800 Subject: [PATCH 221/483] Robin nano V2, TFT LVGL UI parameters, and more (#18500) --- Marlin/Configuration.h | 21 +- Marlin/Version.h | 6 +- Marlin/src/MarlinCore.cpp | 11 +- Marlin/src/core/boards.h | 49 +- Marlin/src/inc/Conditionals_LCD.h | 7 +- Marlin/src/inc/SanityCheck.h | 8 +- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 477 ++- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h | 2 + Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h | 27 +- .../src/lcd/extui/lib/mks_ui/draw_about.cpp | 22 +- .../lib/mks_ui/draw_acceleration_settings.cpp | 483 +++ .../lib/mks_ui/draw_acceleration_settings.h | 33 + .../lib/mks_ui/draw_advance_settings.cpp | 140 + .../extui/lib/mks_ui/draw_advance_settings.h | 33 + .../extui/lib/mks_ui/draw_change_speed.cpp | 75 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 195 +- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 6 +- .../extui/lib/mks_ui/draw_eeprom_settings.cpp | 237 ++ .../extui/lib/mks_ui/draw_eeprom_settings.h | 33 + .../extui/lib/mks_ui/draw_error_message.cpp | 18 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 97 +- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp | 67 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp | 83 +- .../extui/lib/mks_ui/draw_jerk_settings.cpp | 263 ++ .../lcd/extui/lib/mks_ui/draw_jerk_settings.h | 33 + .../lcd/extui/lib/mks_ui/draw_language.cpp | 152 +- .../extui/lib/mks_ui/draw_machine_para.cpp | 232 ++ .../lcd/extui/lib/mks_ui/draw_machine_para.h | 33 + .../lib/mks_ui/draw_machine_settings.cpp | 241 ++ .../extui/lib/mks_ui/draw_machine_settings.h | 33 + .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 127 +- .../lib/mks_ui/draw_max_feedrate_settings.cpp | 359 ++ .../lib/mks_ui/draw_max_feedrate_settings.h | 33 + .../extui/lib/mks_ui/draw_motor_settings.cpp | 247 ++ .../extui/lib/mks_ui/draw_motor_settings.h | 33 + .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 135 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 799 ++++ .../lcd/extui/lib/mks_ui/draw_number_key.h | 33 + .../{draw_opration.cpp => draw_operation.cpp} | 140 +- .../{draw_opration.h => draw_operation.h} | 4 +- .../extui/lib/mks_ui/draw_pause_message.cpp | 4 +- .../extui/lib/mks_ui/draw_pause_position.cpp | 222 + .../extui/lib/mks_ui/draw_pause_position.h | 33 + .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 129 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 256 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 224 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 341 +- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp | 126 +- .../extui/lib/mks_ui/draw_step_settings.cpp | 358 ++ .../lcd/extui/lib/mks_ui/draw_step_settings.h | 33 + .../lib/mks_ui/draw_tmc_current_settings.cpp | 385 ++ .../lib/mks_ui/draw_tmc_current_settings.h | 34 + .../mks_ui/draw_tmc_step_mode_settings.cpp | 478 +++ .../lib/mks_ui/draw_tmc_step_mode_settings.h | 33 + Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 117 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 967 +++-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 127 +- .../lcd/extui/lib/mks_ui/gb2312_puhui16.cpp | 16 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 180 +- .../lcd/extui/lib/mks_ui/mks_hardware_test.h | 12 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 277 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 83 +- .../extui/lib/mks_ui/printer_operation.cpp | 217 + ...printer_opration.h => printer_operation.h} | 0 .../lcd/extui/lib/mks_ui/printer_opration.cpp | 209 - .../lcd/extui/lib/mks_ui/tft_Language_en.h | 76 +- .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 60 +- .../lcd/extui/lib/mks_ui/tft_Language_it.h | 438 +- .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 36 +- .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 241 +- .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 48 +- .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 480 +++ Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 4 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 186 +- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 2 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 3567 ++++++++++------- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 284 +- Marlin/src/module/motion.cpp | 6 +- Marlin/src/module/stepper.cpp | 2 +- Marlin/src/module/stepper/indirection.h | 4 +- Marlin/src/pins/pins.h | 4 +- Marlin/src/pins/sam/pins_RADDS.h | 11 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 3 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 3 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 150 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 325 ++ .../PlatformIO/scripts/download_mks_assets.py | 46 + platformio.ini | 23 +- 90 files changed, 11716 insertions(+), 4179 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h rename Marlin/src/lcd/extui/lib/mks_ui/{draw_opration.cpp => draw_operation.cpp} (81%) rename Marlin/src/lcd/extui/lib/mks_ui/{draw_opration.h => draw_operation.h} (93%) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp rename Marlin/src/lcd/extui/lib/mks_ui/{printer_opration.h => printer_operation.h} (100%) delete mode 100644 Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp create mode 100644 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h create mode 100644 buildroot/share/PlatformIO/scripts/download_mks_assets.py diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c11b02bc52e2..f2524cadb1d9 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -135,7 +135,7 @@ //#define CUSTOM_MACHINE_NAME "3D Printer" // Printer's unique ID, used by some programs to differentiate between machines. -// Choose your own or use a service like http://www.uuidgenerator.net/version4 +// Choose your own or use a service like https://www.uuidgenerator.net/version4 //#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" // @section extruder @@ -2148,20 +2148,23 @@ // // TFT LVGL UI // -// Default MKS icons and fonts: https://git.io/JJvzK -// Copy mks_pic and mks_font folders to the root of your SD +// Using default MKS icons and fonts from: https://git.io/JJvzK +// Just copy the `assets` folder from the build directory to the +// root of your SD card, together with the compiled firmware. // -//#define TFT_LVGL_UI +// Robin nano v1.2 uses FSMC +// +//#define TFT_LVGL_UI_FSMC + +// Robin nano v2.0 uses SPI +// +//#define TFT_LVGL_UI_SPI + //============================================================================= //============================ Other Controllers ============================ //============================================================================= -// -// Robin nano v2.0 SPI touch screen -// -//#define SPI_GRAPHICAL_TFT - // // Ender-3 v2 OEM display. A DWIN display with Rotary Encoder. // diff --git a/Marlin/Version.h b/Marlin/Version.h index a698b435cd31..fe0724fbfcb1 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -71,6 +71,6 @@ * Set the vendor info the serial USB interface, if changable * Currently only supported by DUE platform */ -//#define USB_DEVICE_VENDOR_ID 0x0000 -//#define USB_DEVICE_PRODUCT_ID 0x0000 -//#define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL +//#define USB_DEVICE_VENDOR_ID 0x0000 +//#define USB_DEVICE_PRODUCT_ID 0x0000 +//#define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 7ba577504abd..00ea51b058ea 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -59,10 +59,11 @@ #include "gcode/parser.h" #include "gcode/queue.h" -#if ENABLED(TFT_LVGL_UI) - #include "lvgl.h" +#if HAS_TFT_LVGL_UI #include "lcd/extui/lib/mks_ui/tft_lvgl_configuration.h" #include "lcd/extui/lib/mks_ui/draw_ui.h" + #include "lcd/extui/lib/mks_ui/mks_hardware_test.h" + #include #endif #if ENABLED(DWIN_CREALITY_LCD) @@ -755,7 +756,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { // Direct Stepping TERN_(DIRECT_STEPPING, page_manager.write_responses()); - #if ENABLED(TFT_LVGL_UI) + #if HAS_TFT_LVGL_UI LV_TASK_HANDLER(); #endif } @@ -1192,7 +1193,7 @@ void setup() { SETUP_RUN(page_manager.init()); #endif - #if ENABLED(TFT_LVGL_UI) + #if HAS_TFT_LVGL_UI if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts SETUP_RUN(tft_lvgl_init()); #endif @@ -1229,7 +1230,7 @@ void loop() { endstops.event_handler(); - TERN_(TFT_LVGL_UI, printer_state_polling()); + TERN_(HAS_TFT_LVGL_UI, printer_state_polling()); } while (ENABLED(__AVR__)); // Loop forever on slower (AVR) boards } diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 1077d494e480..6e57a43747f0 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -288,30 +288,31 @@ #define BOARD_MKS_ROBIN 4007 // MKS Robin (STM32F103ZET6) #define BOARD_MKS_ROBIN_MINI 4008 // MKS Robin Mini (STM32F103VET6) #define BOARD_MKS_ROBIN_NANO 4009 // MKS Robin Nano (STM32F103VET6) -#define BOARD_MKS_ROBIN_LITE 4010 // MKS Robin Lite/Lite2 (STM32F103RCT6) -#define BOARD_MKS_ROBIN_LITE3 4011 // MKS Robin Lite3 (STM32F103RCT6) -#define BOARD_MKS_ROBIN_PRO 4012 // MKS Robin Pro (STM32F103ZET6) -#define BOARD_BTT_SKR_MINI_V1_1 4013 // BigTreeTech SKR Mini v1.1 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V1_0 4014 // BigTreeTech SKR Mini E3 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V1_2 4015 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V2_0 4016 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) -#define BOARD_BTT_SKR_E3_DIP 4017 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) -#define BOARD_JGAURORA_A5S_A1 4018 // JGAurora A5S A1 (STM32F103ZET6) -#define BOARD_FYSETC_AIO_II 4019 // FYSETC AIO_II -#define BOARD_FYSETC_CHEETAH 4020 // FYSETC Cheetah -#define BOARD_FYSETC_CHEETAH_V12 4021 // FYSETC Cheetah V1.2 -#define BOARD_LONGER3D_LK 4022 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 -#define BOARD_GTM32_MINI 4023 // STM32F103VET6 controller -#define BOARD_GTM32_MINI_A30 4024 // STM32F103VET6 controller -#define BOARD_GTM32_REV_B 4025 // STM32F103VET6 controller -#define BOARD_MKS_ROBIN_E3D 4026 // MKS Robin E3D (STM32F103RCT6) -#define BOARD_MKS_ROBIN_E3 4027 // MKS Robin E3 (STM32F103RCT6) -#define BOARD_MALYAN_M300 4028 // STM32F070-based delta -#define BOARD_CCROBOT_MEEB_3DP 4029 // ccrobot-online.com MEEB_3DP (STM32F103RC) -#define BOARD_CHITU3D_V5 4030 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CHITU3D_V6 4031 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CREALITY_V4 4032 // Creality v4.x (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4033 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_MKS_ROBIN_NANO_V2 4010 // MKS Robin Nano V2 (STM32F103VET6) +#define BOARD_MKS_ROBIN_LITE 4011 // MKS Robin Lite/Lite2 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_LITE3 4012 // MKS Robin Lite3 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_PRO 4013 // MKS Robin Pro (STM32F103ZET6) +#define BOARD_BTT_SKR_MINI_V1_1 4014 // BigTreeTech SKR Mini v1.1 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V1_0 4015 // BigTreeTech SKR Mini E3 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V1_2 4016 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V2_0 4017 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) +#define BOARD_BTT_SKR_E3_DIP 4018 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) +#define BOARD_JGAURORA_A5S_A1 4019 // JGAurora A5S A1 (STM32F103ZET6) +#define BOARD_FYSETC_AIO_II 4020 // FYSETC AIO_II +#define BOARD_FYSETC_CHEETAH 4021 // FYSETC Cheetah +#define BOARD_FYSETC_CHEETAH_V12 4022 // FYSETC Cheetah V1.2 +#define BOARD_LONGER3D_LK 4023 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 +#define BOARD_GTM32_MINI 4024 // STM32F103VET6 controller +#define BOARD_GTM32_MINI_A30 4025 // STM32F103VET6 controller +#define BOARD_GTM32_REV_B 4026 // STM32F103VET6 controller +#define BOARD_MKS_ROBIN_E3D 4027 // MKS Robin E3D (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3 4028 // MKS Robin E3 (STM32F103RCT6) +#define BOARD_MALYAN_M300 4029 // STM32F070-based delta +#define BOARD_CCROBOT_MEEB_3DP 4030 // ccrobot-online.com MEEB_3DP (STM32F103RC) +#define BOARD_CHITU3D_V5 4031 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CHITU3D_V6 4032 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CREALITY_V4 4033 // Creality v4.x (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4034 // Trigorilla Pro (STM32F103ZET6) // // ARM Cortex-M4F diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index a552e5b9ce7d..3472cdc7ba81 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -255,12 +255,17 @@ #define IS_ULTIPANEL #endif +// LVGL UI, SPI or FSMC +#if EITHER(TFT_LVGL_UI_SPI, TFT_LVGL_UI_FSMC) + #define HAS_TFT_LVGL_UI 1 +#endif + // FSMC/SPI TFT Panels #if ENABLED(FSMC_GRAPHICAL_TFT) #define DOGLCD #define IS_ULTIPANEL #define DELAYED_BACKLIGHT_INIT -#elif ENABLED(SPI_GRAPHICAL_TFT) +#elif ENABLED(TFT_LVGL_UI_SPI) #define DELAYED_BACKLIGHT_INIT #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index a90571b17555..b1f9aab370c4 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -449,6 +449,10 @@ #error "POWER_SUPPLY is now obsolete. Please remove it from Configuration.h." #elif defined(MKS_ROBIN_TFT) #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. Please update your configuration." +#elif defined(TFT_LVGL_UI) + #error "TFT_LVGL_UI is now TFT_LVGL_UI_FSMC. Please update your configuration." +#elif defined(SPI_GRAPHICAL_TFT) + #error "SPI_GRAPHICAL_TFT is now TFT_LVGL_UI_SPI. Please update your configuration." #elif defined(SDPOWER) #error "SDPOWER is now SDPOWER_PIN. Please update your configuration and/or pins." #elif defined(STRING_SPLASH_LINE1) || defined(STRING_SPLASH_LINE2) @@ -2217,8 +2221,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(MALYAN_LCD) \ + ENABLED(TOUCH_UI_FTDI_EVE) \ + ENABLED(FSMC_GRAPHICAL_TFT) \ - + ENABLED(TFT_LVGL_UI) \ - + ENABLED(SPI_GRAPHICAL_TFT) + + ENABLED(TFT_LVGL_UI_FSMC) \ + + ENABLED(TFT_LVGL_UI_SPI) #error "Please select no more than one LCD controller option." #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index 3c6cffb20dcd..0febc4edbddd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -22,69 +22,72 @@ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(SPI_GRAPHICAL_TFT) +#if ENABLED(TFT_LVGL_UI_SPI) - #include - #include "../../../../inc/MarlinConfig.h" - #include "SPI_TFT.h" +#include "SPI_TFT.h" +#include "pic_manager.h" - TFT SPI_TFT; +#include "../../../../inc/MarlinConfig.h" - #ifndef SPI_TFT_MISO_PIN - #define SPI_TFT_MISO_PIN PA6 - #endif - #ifndef SPI_TFT_MOSI_PIN - #define SPI_TFT_MOSI_PIN PA7 - #endif - #ifndef SPI_TFT_SCK_PIN - #define SPI_TFT_SCK_PIN PA5 - #endif - #ifndef SPI_TFT_CS_PIN - #define SPI_TFT_CS_PIN PD11 - #endif - #ifndef SPI_TFT_DC_PIN - #define SPI_TFT_DC_PIN PD10 - #endif - #ifndef SPI_TFT_RST_PIN - #define SPI_TFT_RST_PIN PC6 - #endif +#include + +TFT SPI_TFT; + +#ifndef SPI_TFT_MISO_PIN + #define SPI_TFT_MISO_PIN PA6 +#endif +#ifndef SPI_TFT_MOSI_PIN + #define SPI_TFT_MOSI_PIN PA7 +#endif +#ifndef SPI_TFT_SCK_PIN + #define SPI_TFT_SCK_PIN PA5 +#endif +#ifndef SPI_TFT_CS_PIN + #define SPI_TFT_CS_PIN PD11 +#endif +#ifndef SPI_TFT_DC_PIN + #define SPI_TFT_DC_PIN PD10 +#endif +#ifndef SPI_TFT_RST_PIN + #define SPI_TFT_RST_PIN PC6 +#endif // use SPI1 for the spi tft. - void TFT::spi_init(uint8_t spiRate) { - - SPI_TFT_CS_H; - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(1); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - } +void TFT::spi_init(uint8_t spiRate) { - uint8_t TFT::spi_Rec() { - uint8_t returnByte = SPI.transfer(ff); - return returnByte; - } + SPI_TFT_CS_H; - uint8_t TFT::spi_read_write_byte(uint8_t data) { - uint8_t returnByte = SPI.transfer(data); - return returnByte; + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library } + SPI.setModule(1); + SPI.begin(); + SPI.setClockDivider(clock); + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); +} + +uint8_t TFT::spi_Rec() { + uint8_t returnByte = SPI.transfer(ff); + return returnByte; +} + +uint8_t TFT::spi_read_write_byte(uint8_t data) { + uint8_t returnByte = SPI.transfer(data); + return returnByte; +} /** * @brief Receive a number of bytes from the SPI port to a buffer @@ -95,7 +98,7 @@ * * @details Uses DMA */ - void TFT::spi_Read(uint8_t* buf, uint16_t nbyte) {SPI.dmaTransfer(0, const_cast(buf), nbyte);} +void TFT::spi_Read(uint8_t* buf, uint16_t nbyte) {SPI.dmaTransfer(0, const_cast(buf), nbyte);} /** * @brief Send a single byte on SPI port @@ -104,7 +107,7 @@ * * @details */ - void TFT::spi_Send(uint8_t b) {SPI.send(b);} +void TFT::spi_Send(uint8_t b) {SPI.send(b);} /** * @brief Write token and then write from 512 byte buffer to SPI (for SD card) @@ -114,158 +117,222 @@ * * @details Use DMA */ - void TFT::spi_SendBlock(uint8_t token, const uint8_t* buf) { - SPI.send(token); - SPI.dmaSend(const_cast(buf), 512); - } +void TFT::spi_SendBlock(uint8_t token, const uint8_t* buf) { + SPI.send(token); + SPI.dmaSend(const_cast(buf), 512); +} - void TFT::LCD_WR_REG(uint8_t cmd) { - SPI_TFT_CS_L; - SPI_TFT_DC_L; - spi_Send(cmd); - SPI_TFT_CS_H; - } - void TFT::LCD_WR_DATA(uint8_t data) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - spi_Send(data); - SPI_TFT_CS_H; - } - void TFT::LCD_WriteRAM_Prepare() {LCD_WR_REG(0X2C);} - void TFT::SetCursor(uint16_t x, uint16_t y) { - LCD_WR_REG(0x2a); - LCD_WR_DATA(x >> 8); - LCD_WR_DATA(x); - LCD_WR_DATA(x >> 8); - LCD_WR_DATA(x); - - LCD_WR_REG(0x2b); - LCD_WR_DATA(y >> 8); - LCD_WR_DATA(y); - LCD_WR_DATA(y >> 8); - LCD_WR_DATA(y); +void TFT::LCD_WR_REG(uint8_t cmd) { + SPI_TFT_CS_L; + SPI_TFT_DC_L; + spi_Send(cmd); + SPI_TFT_CS_H; +} +void TFT::LCD_WR_DATA(uint8_t data) { + SPI_TFT_CS_L; + SPI_TFT_DC_H; + spi_Send(data); + SPI_TFT_CS_H; +} +void TFT::LCD_WriteRAM_Prepare() {LCD_WR_REG(0X2C);} +void TFT::SetCursor(uint16_t x, uint16_t y) { + LCD_WR_REG(0x2A); + LCD_WR_DATA(x >> 8); + LCD_WR_DATA(x); + LCD_WR_DATA(x >> 8); + LCD_WR_DATA(x); + + LCD_WR_REG(0x2B); + LCD_WR_DATA(y >> 8); + LCD_WR_DATA(y); + LCD_WR_DATA(y >> 8); + LCD_WR_DATA(y); +} + +void TFT::SetPoint(uint16_t x, uint16_t y, uint16_t point) { + if ((x > 480) || (y > 320)) return; + + SetCursor(x, y); + + LCD_WriteRAM_Prepare(); + LCD_WR_DATA((uint8_t)(point >> 8)); + LCD_WR_DATA((uint8_t)point); +} + +void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { + LCD_WR_REG(0x2A); + LCD_WR_DATA(x >> 8); + LCD_WR_DATA(x); + LCD_WR_DATA((x + with - 1) >> 8); + LCD_WR_DATA((x + with - 1)); + + LCD_WR_REG(0x2B); + LCD_WR_DATA(y >> 8); + LCD_WR_DATA(y); + LCD_WR_DATA((y + height - 1) >> 8); + LCD_WR_DATA(y + height - 1); +} + +void TFT::LCD_init() { + SPI_TFT_RST_H; + delay(150); + SPI_TFT_RST_L; + delay(150); + SPI_TFT_RST_H; + + delay(120); + LCD_WR_REG(0x11); + delay(120); + + LCD_WR_REG(0xF0); + LCD_WR_DATA(0xC3); + LCD_WR_REG(0xF0); + LCD_WR_DATA(0x96); + + LCD_WR_REG(0x36); + LCD_WR_DATA(0x28); + + LCD_WR_REG(0x3A); + LCD_WR_DATA(0x55); + + LCD_WR_REG(0xB4); + LCD_WR_DATA(0x01); + LCD_WR_REG(0xB7); + LCD_WR_DATA(0xC6); + LCD_WR_REG(0xE8); + LCD_WR_DATA(0x40); + LCD_WR_DATA(0x8A); + LCD_WR_DATA(0x00); + LCD_WR_DATA(0x00); + LCD_WR_DATA(0x29); + LCD_WR_DATA(0x19); + LCD_WR_DATA(0xA5); + LCD_WR_DATA(0x33); + LCD_WR_REG(0xC1); + LCD_WR_DATA(0x06); + LCD_WR_REG(0xC2); + LCD_WR_DATA(0xA7); + LCD_WR_REG(0xC5); + LCD_WR_DATA(0x18); + LCD_WR_REG(0xE0); // Positive Voltage Gamma Control + LCD_WR_DATA(0xF0); + LCD_WR_DATA(0x09); + LCD_WR_DATA(0x0B); + LCD_WR_DATA(0x06); + LCD_WR_DATA(0x04); + LCD_WR_DATA(0x15); + LCD_WR_DATA(0x2F); + LCD_WR_DATA(0x54); + LCD_WR_DATA(0x42); + LCD_WR_DATA(0x3C); + LCD_WR_DATA(0x17); + LCD_WR_DATA(0x14); + LCD_WR_DATA(0x18); + LCD_WR_DATA(0x1B); + LCD_WR_REG(0xE1); // Negative Voltage Gamma Control + LCD_WR_DATA(0xF0); + LCD_WR_DATA(0x09); + LCD_WR_DATA(0x0B); + LCD_WR_DATA(0x06); + LCD_WR_DATA(0x04); + LCD_WR_DATA(0x03); + LCD_WR_DATA(0x2D); + LCD_WR_DATA(0x43); + LCD_WR_DATA(0x42); + LCD_WR_DATA(0x3B); + LCD_WR_DATA(0x16); + LCD_WR_DATA(0x14); + LCD_WR_DATA(0x17); + LCD_WR_DATA(0x1B); + LCD_WR_REG(0xF0); + LCD_WR_DATA(0x3C); + LCD_WR_REG(0xF0); + LCD_WR_DATA(0x69); + delay(120); // Delay 120ms + LCD_WR_REG(0x29); // Display ON + + LCD_clear(0x0000); // + LCD_Draw_Logo(); + SPI_TFT_BLK_H; + delay(2000); +} + +void TFT::LCD_clear(uint16_t color) { + unsigned int i; + uint8_t tbuf[960]; + + SetCursor(0, 0); + SetWindows(0, 0, 480 - 1, 320 - 1); + LCD_WriteRAM_Prepare(); + SPI_TFT_CS_L; + SPI_TFT_DC_H; + for (i = 0; i < 960;) { + tbuf[i] = color >> 8; + tbuf[i + 1] = color; + i += 2; } - void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { - LCD_WR_REG(0x2a); - LCD_WR_DATA(x >> 8); - LCD_WR_DATA(x); - LCD_WR_DATA((x + with) >> 8); - LCD_WR_DATA((x + with)); - - LCD_WR_REG(0x2b); - LCD_WR_DATA(y >> 8); - LCD_WR_DATA(y); - LCD_WR_DATA((y + height) >> 8); - LCD_WR_DATA(y + height); + for (i = 0; i < 320; i++) { + // for (m=0;m<480;m++) + // { + // LCD_WR_DATA(color>>8); + // LCD_WR_DATA(color); + SPI.dmaSend(tbuf, 960, true); + // SPI_TFT_CS_H; + // } } - void TFT::LCD_init() { - SPI_TFT_RST_H; - delay(150); - SPI_TFT_RST_L; - delay(150); - SPI_TFT_RST_H; - - delay(120); - LCD_WR_REG(0x11); - delay(120); - - LCD_WR_REG(0xf0); - LCD_WR_DATA(0xc3); - LCD_WR_REG(0xf0); - LCD_WR_DATA(0x96); - - LCD_WR_REG(0x36); - LCD_WR_DATA(0x28); - - LCD_WR_REG(0x3A); - LCD_WR_DATA(0x55); - - LCD_WR_REG(0xB4); - LCD_WR_DATA(0x01); - LCD_WR_REG(0xB7); - LCD_WR_DATA(0xC6); - LCD_WR_REG(0xe8); - LCD_WR_DATA(0x40); - LCD_WR_DATA(0x8a); - LCD_WR_DATA(0x00); - LCD_WR_DATA(0x00); - LCD_WR_DATA(0x29); - LCD_WR_DATA(0x19); - LCD_WR_DATA(0xa5); - LCD_WR_DATA(0x33); - LCD_WR_REG(0xc1); - LCD_WR_DATA(0x06); - LCD_WR_REG(0xc2); - LCD_WR_DATA(0xa7); - LCD_WR_REG(0xc5); - LCD_WR_DATA(0x18); - LCD_WR_REG(0xe0); // Positive Voltage Gamma Control - LCD_WR_DATA(0xf0); - LCD_WR_DATA(0x09); - LCD_WR_DATA(0x0b); - LCD_WR_DATA(0x06); - LCD_WR_DATA(0x04); - LCD_WR_DATA(0x15); - LCD_WR_DATA(0x2f); - LCD_WR_DATA(0x54); - LCD_WR_DATA(0x42); - LCD_WR_DATA(0x3c); - LCD_WR_DATA(0x17); - LCD_WR_DATA(0x14); - LCD_WR_DATA(0x18); - LCD_WR_DATA(0x1b); - LCD_WR_REG(0xe1); // Negative Voltage Gamma Control - LCD_WR_DATA(0xf0); - LCD_WR_DATA(0x09); - LCD_WR_DATA(0x0b); - LCD_WR_DATA(0x06); - LCD_WR_DATA(0x04); - LCD_WR_DATA(0x03); - LCD_WR_DATA(0x2d); - LCD_WR_DATA(0x43); - LCD_WR_DATA(0x42); - LCD_WR_DATA(0x3b); - LCD_WR_DATA(0x16); - LCD_WR_DATA(0x14); - LCD_WR_DATA(0x17); - LCD_WR_DATA(0x1b); - LCD_WR_REG(0xf0); - LCD_WR_DATA(0x3c); - LCD_WR_REG(0xf0); - LCD_WR_DATA(0x69); - delay(120); // Delay 120ms - LCD_WR_REG(0x29); // Display ON - - LCD_clear(0x0000); // - SPI_TFT_BLK_H; + SPI_TFT_CS_H; +} - } - void TFT::LCD_clear(uint16_t color) { - unsigned int i, m; - uint32_t count; - uint8_t tbuf[960]; - - SetCursor(0, 0); - SetWindows(0, 0, 480 - 1, 320 - 1); - LCD_WriteRAM_Prepare(); - SPI_TFT_CS_L; - SPI_TFT_DC_H; - for (i = 0; i < 960;) { - tbuf[i] = color >> 8; - tbuf[i + 1] = color; - i += 2; +extern unsigned char bmp_public_buf[17 * 1024]; + +void TFT::LCD_Draw_Logo() { + uint16_t i,y_off = 0; + uint16_t *p_index; + uint16_t Color; + + #if 1 + for (y_off = 0; y_off < 320; y_off ++) { + Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, 960); + + SPI_TFT.spi_init(SPI_FULL_SPEED); + SetWindows(0, y_off, 480, 1); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + for (i = 0; i < 960;) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + Color = (*p_index >> 8); + *p_index = Color | ((*p_index & 0xFF) << 8); + i+=2; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(bmp_public_buf,960,true); + SPI_TFT_CS_H; } - for (i = 0; i < 320; i++) { - // for(m=0;m<480;m++) - // { - // LCD_WR_DATA(color>>8); - // LCD_WR_DATA(color); - - SPI.dmaSend(tbuf, 960, true); - // SPI_TFT_CS_H; - // } + + #else + + for (index = 0; index < 40; index ++) { + Pic_Logo_Read((uint8_t *)"", bmp_public_buf, 480*8*2); + i = 0; + SetCursor(0,0); + SetWindows(0, y_off * 8, 480, 8); + LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ + for (i = 0; i < 480 * 8 * 2;) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + Color = (*p_index >> 8); + *p_index = Color | ((*p_index & 0xFF) << 8); + i += 2; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(bmp_public_buf,480*8*2,true); + SPI_TFT_CS_H; + + y_off++; } - SPI_TFT_CS_H; - } + #endif + + SetWindows(0, 0, 479, 319); +} -#endif // SPI_GRAPHICAL_TFT +#endif // HAS_TFT_LVGL_UI_SPI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h index 4466f4d33bef..9b676843139c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -46,10 +46,12 @@ class TFT { void LCD_WR_REG(uint8_t cmd); void LCD_WR_DATA(uint8_t data); void SetCursor(uint16_t x, uint16_t y); + void SetPoint(uint16_t x, uint16_t y, uint16_t point); void SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height); void LCD_init(); void LCD_clear(uint16_t color); void LCD_WriteRAM_Prepare(); + void LCD_Draw_Logo(); }; extern TFT SPI_TFT; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp index 5c56bdef43f8..60b4d0b7ea98 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp @@ -22,7 +22,7 @@ #include "../../../../inc/MarlinConfigPre.h" #if 1 // ENABLED(SPI_FLASH) -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include #include "../../../../inc/MarlinConfig.h" @@ -131,7 +131,7 @@ void ext_FLASH::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { uint16_t ext_FLASH::W25QXX_ReadID(void) { uint16_t Temp = 0; W25QXX_CS_L; - spi_flash_Send(0x90);//���Ͷ�ȡID���� + spi_flash_Send(0x90); spi_flash_Send(0x00); spi_flash_Send(0x00); spi_flash_Send(0x00); @@ -391,5 +391,5 @@ void ext_FLASH::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16 void ext_FLASH::lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);} -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI #endif // 1 ... SPI_FLASH diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h index c3e3fe74ad33..88d5d6c2f549 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h @@ -56,38 +56,35 @@ #define PIC_NAME_MAX_LEN 50 - #define LOGO_MAX_SIZE (300*1024)//logo���ֵ - #define TITLELOGO_MAX_SIZE (150*1024)//logo���ֵ + #define LOGO_MAX_SIZE (300*1024) + #define TITLELOGO_MAX_SIZE (150*1024) #define DEFAULT_VIEW_MAX_SIZE (200*200*2) #define FLASH_VIEW_MAX_SIZE (200*200*2) - //ͼƬ - //Robin2�洢��ַ - #define PIC_NAME_ADDR 0x003000 //ͼƬ��Ϣ�洢��ַ��ͼƬ���� - #define PIC_SIZE_ADDR 0x007000 //ͼƬ��Ϣ�洢��ַ��ͼƬ��Сֵ - #define PIC_COUNTER_ADDR 0x008000 //ͼƬ������ֵ�洢��ַ - #define PIC_LOGO_ADDR 0x009000 //ͼƬlogo�洢��ַ - //#define PIC_DATA_ADDR 0x02f000 //ͼƬ���ݴ洢��ַ + //Robin 2 + #define PIC_NAME_ADDR 0x003000 + #define PIC_SIZE_ADDR 0x007000 + #define PIC_COUNTER_ADDR 0x008000 + #define PIC_LOGO_ADDR 0x009000 + //#define PIC_DATA_ADDR 0x02f000 #define DEFAULT_VIEW_ADDR 0XC5800 #define BAK_VIEW_ADDR (DEFAULT_VIEW_ADDR+90*1024) #define PIC_ICON_LOGO_ADDR (BAK_VIEW_ADDR+80*1024) - #define PIC_DATA_ADDR (PIC_ICON_LOGO_ADDR+350*1024) //ͼƬ���ݴ洢��ַ//(800*240) + #define PIC_DATA_ADDR (PIC_ICON_LOGO_ADDR+350*1024) - // �ֿ� - #define FONTINFOADDR 0x600000 // 6M�Ժ��ַΪ�ֿ� + #define FONTINFOADDR 0x600000 #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024 - #define PER_PIC_MAX_SPACE (32*1024) // Ϊ�˷�ֹ����Խ������⣬ÿ��СͼƬ�����仮��Ӧ��ȡ�ܹ�����4K��ֵ + #define PER_PIC_MAX_SPACE (32*1024) - // union union32 { uint8_t bytes[4]; uint32_t dwords; }; - // ͼƬ��Ϣ�ṹ�� + struct pic_msg { uint8_t name[PIC_NAME_MAX_LEN]; union union32 size; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp index ec92e1559cc7..94a865d04557 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" @@ -67,7 +67,7 @@ void lv_draw_about(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -79,14 +79,14 @@ void lv_draw_about(void) { buttonBack = lv_imgbtn_create(scr, NULL); #if 1 - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_A_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_A_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); /*Create a label on the Image button*/ @@ -98,16 +98,16 @@ void lv_draw_about(void) { } fw_version = lv_label_create(scr, NULL); - lv_obj_set_style(fw_version, &tft_style_lable_rel); + lv_obj_set_style(fw_version, &tft_style_label_rel); lv_label_set_text(fw_version, SHORT_BUILD_VERSION); lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60); fw_type = lv_label_create(scr, NULL); - lv_obj_set_style(fw_type, &tft_style_lable_rel); + lv_obj_set_style(fw_type, &tft_style_label_rel); lv_label_set_text(fw_type, #if MB(MKS_ROBIN_PRO) "Firmware: Robin_Pro35" - #elif MB(MKS_ROBIN_NANO) + #elif MB(MKS_ROBIN_NANO, MKS_ROBIN_NANO_V2) "Firmware: Robin_Nano35" #else CUSTOM_MACHINE_NAME @@ -116,11 +116,11 @@ void lv_draw_about(void) { lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20); board = lv_label_create(scr, NULL); - lv_obj_set_style(board, &tft_style_lable_rel); + lv_obj_set_style(board, &tft_style_label_rel); lv_label_set_text(board, "Board: " BOARD_INFO_NAME); lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, 20); } void lv_clear_about() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp new file mode 100644 index 000000000000..b6906a6dfec4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -0,0 +1,483 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" + +static lv_obj_t * scr; + +#define ID_ACCE_RETURN 1 +#define ID_ACCE_PRINT 2 +#define ID_ACCE_RETRA 3 +#define ID_ACCE_TRAVEL 4 +#define ID_ACCE_X 5 +#define ID_ACCE_Y 6 +#define ID_ACCE_Z 7 +#define ID_ACCE_E0 8 +#define ID_ACCE_E1 9 +#define ID_ACCE_UP 10 +#define ID_ACCE_DOWN 11 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_ACCE_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_acceleration_settings(); + draw_return_ui(); + } + break; + case ID_ACCE_PRINT: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = PrintAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); + } + break; + case ID_ACCE_RETRA: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = RetractAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); + } + break; + case ID_ACCE_TRAVEL: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = TravelAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); + } + break; + case ID_ACCE_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = XAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); + } + break; + case ID_ACCE_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = YAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); + } + break; + case ID_ACCE_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = ZAcceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); + } + break; + case ID_ACCE_E0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E0Acceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); + } + break; + case ID_ACCE_E1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E1Acceleration; + lv_clear_acceleration_settings(); + lv_draw_number_key(); + } + break; + case ID_ACCE_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_acceleration_settings(); + lv_draw_acceleration_settings(); + } + break; + case ID_ACCE_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_acceleration_settings(); + lv_draw_acceleration_settings(); + } + break; + } +} + +void lv_draw_acceleration_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *buttonPrintText = NULL, *labelPrintText = NULL, *buttonPrintValue = NULL, *labelPrintValue = NULL; + lv_obj_t *buttonRetraText = NULL, *labelRetraText = NULL, *buttonRetraValue = NULL, *labelRetraValue = NULL; + lv_obj_t *buttonTravelText = NULL, *labelTravelText = NULL, *buttonTravelValue = NULL, *labelTravelValue = NULL; + lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ACCELERATION_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = ACCELERATION_UI; + } + disp_state = ACCELERATION_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.AccelerationConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + // LV_IMG_DECLARE(bmp_para_arrow); + LV_IMG_DECLARE(bmp_para_bank); + + if (uiCfg.para_ui_page != 1) { + buttonPrintText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonPrintText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonPrintText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonPrintText, event_handler); + lv_btn_set_style(buttonPrintText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonPrintText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonPrintText, LV_LAYOUT_OFF); + labelPrintText = lv_label_create(buttonPrintText, NULL); /*Add a label to the button*/ + + buttonPrintValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonPrintValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonPrintValue, event_handler, ID_ACCE_PRINT, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonPrintValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonPrintValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonPrintValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonPrintValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonPrintValue, LV_LAYOUT_OFF); + labelPrintValue = lv_label_create(buttonPrintValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonRetraText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonRetraText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonRetraText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonRetraText, event_handler); + lv_btn_set_style(buttonRetraText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonRetraText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonRetraText, LV_LAYOUT_OFF); + labelRetraText = lv_label_create(buttonRetraText, NULL); /*Add a label to the button*/ + + buttonRetraValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonRetraValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonRetraValue, event_handler, ID_ACCE_RETRA, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonRetraValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonRetraValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonRetraValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonRetraValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonRetraValue, LV_LAYOUT_OFF); + labelRetraValue = lv_label_create(buttonRetraValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonTravelText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonTravelText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonTravelText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonTravelText, event_handler); + lv_btn_set_style(buttonTravelText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonTravelText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonTravelText, LV_LAYOUT_OFF); + labelTravelText = lv_label_create(buttonTravelText, NULL); /*Add a label to the button*/ + + buttonTravelValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonTravelValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonTravelValue, event_handler, ID_ACCE_TRAVEL, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonTravelValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonTravelValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonTravelValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonTravelValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonTravelValue, LV_LAYOUT_OFF); + labelTravelValue = lv_label_create(buttonTravelValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ + lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonXText, event_handler); + lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); + labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + + buttonXValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_ACCE_X, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + labelXValue = lv_label_create(buttonXValue, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_DOWN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + } + else { + buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonYText, event_handler); + lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); + labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + + buttonYValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + labelYValue = lv_label_create(buttonYValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonZText, event_handler); + lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); + labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + + buttonZValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_ACCE_Z, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + labelZValue = lv_label_create(buttonZValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE0Text, event_handler); + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); + labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + + buttonE0Value = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_ACCE_E0, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); + labelE0Value = lv_label_create(buttonE0Value, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ + lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE1Text, event_handler); + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); + labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + + buttonE1Value = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_ACCE_E1, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); + labelE1Value = lv_label_create(buttonE1Value, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_UP, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ACCE_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + lv_label_set_text(labelPrintText, machine_menu.PrintAcceleration); + lv_obj_align(labelPrintText, buttonPrintText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelRetraText, machine_menu.RetractAcceleration); + lv_obj_align(labelRetraText, buttonRetraText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelTravelText, machine_menu.TravelAcceleration); + lv_obj_align(labelTravelText, buttonTravelText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelXText, machine_menu.X_Acceleration); + lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.acceleration); + lv_label_set_text(labelPrintValue, public_buf_l); + lv_obj_align(labelPrintValue, buttonPrintValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.retract_acceleration); + lv_label_set_text(labelRetraValue, public_buf_l); + lv_obj_align(labelRetraValue, buttonRetraValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.travel_acceleration); + lv_label_set_text(labelTravelValue, public_buf_l); + lv_obj_align(labelTravelValue, buttonTravelValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + } + else { + lv_label_set_text(labelYText, machine_menu.Y_Acceleration); + lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelZText, machine_menu.Z_Acceleration); + lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelE0Text, machine_menu.E0_Acceleration); + lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelE1Text, machine_menu.E1_Acceleration); + lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + lv_label_set_text(labelE0Value, public_buf_l); + lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); + lv_label_set_text(labelE1Value, public_buf_l); + lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); + } + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_acceleration_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h new file mode 100644 index 000000000000..b5b62fdc4ca1 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_acceleration_settings(void); +extern void lv_clear_acceleration_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp new file mode 100644 index 000000000000..dabecfb9de2e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" + +static lv_obj_t * scr; + +#define ID_ADVANCE_RETURN 1 +#define ID_PAUSE_POS 2 +#define ID_PAUSE_POS_ARROW 3 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_ADVANCE_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + draw_return_ui(); + } + break; + case ID_PAUSE_POS: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_pause_position(); + } + break; + case ID_PAUSE_POS_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_pause_position(); + } + break; + } +} + +void lv_draw_advance_settings(void) { + lv_obj_t *buttonBack, *label_Back; + lv_obj_t *buttonPausePos, *labelPausePos, *buttonPausePosNarrow; + lv_obj_t * line1; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ADVANCED_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = ADVANCED_UI; + } + disp_state = ADVANCED_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.AdvancedConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + LV_IMG_DECLARE(bmp_para_arrow); + + buttonPausePos = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonPausePos, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonPausePos, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonPausePos, event_handler, ID_PAUSE_POS, NULL, 0); + lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonPausePos, LV_LAYOUT_OFF); + labelPausePos = lv_label_create(buttonPausePos, NULL); /*Add a label to the button*/ + + buttonPausePosNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonPausePosNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonPausePosNarrow, event_handler, ID_PAUSE_POS_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonPausePosNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPausePosNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonPausePosNarrow, LV_LAYOUT_OFF); + + line1 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line1, line_points[0]); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ADVANCE_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelPausePos, machine_menu.PausePosition); + lv_obj_align(labelPausePos, buttonPausePos, LV_ALIGN_IN_LEFT_MID, 0, 0); + } + +} + +void lv_clear_advance_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h new file mode 100644 index 000000000000..bfd76125bb8a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_advance_settings(void); +extern void lv_clear_advance_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp index a2b02826c77d..264d528c0311 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" @@ -44,7 +44,7 @@ static lv_obj_t * printSpeedText; #define ID_C_MOVE 3 #define ID_C_EXT 4 #define ID_C_STEP 5 -#define ID_C_RETURN 6 +#define ID_C_RETURN 6 static uint8_t speedType; @@ -169,7 +169,7 @@ void lv_draw_change_speed(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -178,56 +178,55 @@ void lv_draw_change_speed(void) { LV_IMG_DECLARE(bmp_pic); /*Create an Image button*/ - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttonMov = lv_imgbtn_create(scr, NULL); - buttonExt = lv_imgbtn_create(scr, NULL); + buttonAdd = lv_imgbtn_create(scr, NULL); + buttonDec = lv_imgbtn_create(scr, NULL); + buttonMov = lv_imgbtn_create(scr, NULL); + buttonExt = lv_imgbtn_create(scr, NULL); buttonStep = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_C_ADD, "bmp_Add.bin", 0); lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); #if 1 lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_C_DEC, "bmp_Dec.bin", 0); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_lable_rel); - + lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_REL, &tft_style_label_rel); lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_REL, &tft_style_label_rel); lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_C_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_C_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonMov, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonMov, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonExt, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonStep, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonStep, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); @@ -239,8 +238,8 @@ void lv_draw_change_speed(void) { lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL); lv_obj_t * labelDec = lv_label_create(buttonDec, NULL); - labelMov = lv_label_create(buttonMov, NULL); - labelExt = lv_label_create(buttonExt, NULL); + labelMov = lv_label_create(buttonMov, NULL); + labelExt = lv_label_create(buttonExt, NULL); labelStep = lv_label_create(buttonStep, NULL); lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); @@ -258,17 +257,17 @@ void lv_draw_change_speed(void) { disp_speed_step(); printSpeedText = lv_label_create(scr, NULL); - lv_obj_set_style(printSpeedText, &tft_style_lable_rel); + lv_obj_set_style(printSpeedText, &tft_style_label_rel); disp_print_speed(); } void disp_speed_step() { if (uiCfg.stepPrintSpeed == 1) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_Step1_percent.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_step1_percent.bin", 0); else if (uiCfg.stepPrintSpeed == 5) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_Step5_percent.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_step5_percent.bin", 0); else if (uiCfg.stepPrintSpeed == 10) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_Step10_percent.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_step10_percent.bin", 0); if (gCfgItems.multiple_language != 0) { if (uiCfg.stepPrintSpeed == 1) { @@ -291,16 +290,16 @@ void disp_print_speed() { public_buf_l[0] = '\0'; - if (speedType == 0) { //move + if (speedType == 0) { // move strcat(public_buf_l, speed_menu.move_speed); - strcat(public_buf_l, ": "); - sprintf(buf, "%d%%", feedrate_percentage); + strcat_P(public_buf_l, PSTR(": ")); + sprintf_P(buf, PSTR("%d%%"), feedrate_percentage); strcat(public_buf_l, buf); } else if (speedType == 1) { // e1 strcat(public_buf_l, speed_menu.extrude_speed); - strcat(public_buf_l, ": "); - sprintf(buf, "%d%%", planner.flow_percentage[0]); + strcat_P(public_buf_l, PSTR(": ")); + sprintf_P(buf, PSTR("%d%%"), planner.flow_percentage[0]); strcat(public_buf_l, buf); } lv_label_set_text(printSpeedText, public_buf_l); @@ -311,11 +310,11 @@ void disp_speed_type() { switch (speedType) { case 1: lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_extruct_sel.bin", 0); - lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_changespeed.bin", 0); + lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_changeSpeed.bin", 0); break; default: - lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct.bin", 0); + lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_speed_extruct.bin", 0); lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_mov_sel.bin", 0); break; } @@ -333,4 +332,4 @@ void disp_speed_type() { void lv_clear_change_speed() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 19d2452142d9..9ef27afc9ba6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -26,10 +26,11 @@ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" + //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" @@ -48,6 +49,7 @@ #if ENABLED(PARK_HEAD_ON_PAUSE) #include "../../../../feature/pause.h" #endif +#include "../../../../gcode/gcode.h" static lv_obj_t * scr; extern uint8_t sel_id; @@ -72,36 +74,36 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { lv_draw_printing(); #if ENABLED(SDSUPPORT) - if (gcode_preview_over != 1) { - char *cur_name; - cur_name = strrchr(list_file.file_name[sel_id], '/'); - - SdFile file, *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01f; - #if EXTRUDERS == 2 - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01f; - #endif - card.startFileprint(); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.prepare(); - #endif - once_flag = 0; + if (gcode_preview_over != 1) { + char *cur_name; + cur_name = strrchr(list_file.file_name[sel_id], '/'); + + SdFile file, *curDir; + card.endFilePrint(); + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_READ)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + update_spi_flash(); + } + card.openFileRead(cur_name); + if (card.isFileOpen()) { + feedrate_percentage = 100; + //saved_feedrate_percentage = feedrate_percentage; + planner.flow_percentage[0] = 100; + planner.e_factor[0] = planner.flow_percentage[0] * 0.01f; + #if EXTRUDERS == 2 + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01f; + #endif + card.startFileprint(); + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.prepare(); + #endif + once_flag = 0; + } } - } #endif } else if (DialogType == DIALOG_TYPE_STOP) { @@ -112,7 +114,7 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { #if ENABLED(SDSUPPORT) //card.endFilePrint(); //wait_for_heatup = false; - uiCfg.print_state = IDLE; + uiCfg.print_state = IDLE; card.flag.abort_sd_printing = true; //queue.clear(); //quickstop_stepper(); @@ -120,12 +122,9 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { //thermalManager.disable_all_heaters(); //#if ENABLED(POWER_LOSS_RECOVERY) - //recovery.purge(); + // recovery.purge(); //#endif - //queue.enqueue_one_now(PSTR("G91")); - //queue.enqueue_one_now(PSTR("G1 Z10")); - //queue.enqueue_one_now(PSTR("G90")); - //queue.enqueue_one_now(PSTR("G28 X0 Y0")); + //queue.enqueue_now_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0")); //queue.inject_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0\nM84\nM107")); #endif } @@ -148,6 +147,21 @@ static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { draw_return_ui(); } #endif + else if (DialogType == DIALOG_STORE_EEPROM_TIPS) { + gcode.process_subcommands_now_P(PSTR("M500")); + clear_cur_ui(); + draw_return_ui(); + } + else if (DialogType == DIALOG_READ_EEPROM_TIPS) { + gcode.process_subcommands_now_P(PSTR("M501")); + clear_cur_ui(); + draw_return_ui(); + } + else if (DialogType == DIALOG_REVERT_EEPROM_TIPS) { + gcode.process_subcommands_now_P(PSTR("M502")); + clear_cur_ui(); + draw_return_ui(); + } } } @@ -186,7 +200,7 @@ void lv_draw_dialog(uint8_t type) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -194,51 +208,52 @@ void lv_draw_dialog(uint8_t type) { //LV_IMG_DECLARE(bmp_pic); - static lv_style_t style_btn_rel; // A variable to store the released style - lv_style_copy(&style_btn_rel, &lv_style_plain); // Initialize from a built-in style + static lv_style_t style_btn_rel; // A variable to store the released style + lv_style_copy(&style_btn_rel, &lv_style_plain); // Initialize from a built-in style style_btn_rel.body.border.color = lv_color_hex3(0x269); style_btn_rel.body.border.width = 1; - style_btn_rel.body.main_color = lv_color_hex3(0xADF); - style_btn_rel.body.grad_color = lv_color_hex3(0x46B); + style_btn_rel.body.main_color = lv_color_hex3(0xADF); + style_btn_rel.body.grad_color = lv_color_hex3(0x46B); style_btn_rel.body.shadow.width = 4; - style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM; - style_btn_rel.body.radius = LV_RADIUS_CIRCLE; - style_btn_rel.text.color = lv_color_hex3(0xDEF); - style_btn_rel.text.font = &lv_font_roboto_22; + style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM; + style_btn_rel.body.radius = LV_RADIUS_CIRCLE; + style_btn_rel.text.color = lv_color_hex3(0xDEF); + style_btn_rel.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - static lv_style_t style_btn_pr; // A variable to store the pressed style - lv_style_copy(&style_btn_pr, &style_btn_rel); // Initialize from the released style + static lv_style_t style_btn_pr; // A variable to store the pressed style + lv_style_copy(&style_btn_pr, &style_btn_rel); // Initialize from the released style style_btn_pr.body.border.color = lv_color_hex3(0x46B); - style_btn_pr.body.main_color = lv_color_hex3(0x8BD); - style_btn_pr.body.grad_color = lv_color_hex3(0x24A); + style_btn_pr.body.main_color = lv_color_hex3(0x8BD); + style_btn_pr.body.grad_color = lv_color_hex3(0x24A); style_btn_pr.body.shadow.width = 2; - style_btn_pr.text.color = lv_color_hex3(0xBCD); - style_btn_pr.text.font = &lv_font_roboto_22; + style_btn_pr.text.color = lv_color_hex3(0xBCD); + style_btn_pr.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); lv_obj_t * labelDialog = lv_label_create(scr, NULL); - lv_obj_set_style(labelDialog, &tft_style_lable_rel); + lv_obj_set_style(labelDialog, &tft_style_label_rel); if (DialogType == DIALOG_TYPE_FINISH_PRINT || DialogType == DIALOG_PAUSE_MESSAGE_RESUME) { - lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size + lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen + lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position + lv_obj_set_size(btnOk, 100, 50); // Set its size lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text + lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style + lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style + lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text } else if (DialogType == DIALOG_PAUSE_MESSAGE_WAITING - || DialogType == DIALOG_PAUSE_MESSAGE_INSERT - || DialogType == DIALOG_PAUSE_MESSAGE_HEAT) { - lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size + || DialogType == DIALOG_PAUSE_MESSAGE_INSERT + || DialogType == DIALOG_PAUSE_MESSAGE_HEAT + ) { + lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen + lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position + lv_obj_set_size(btnOk, 100, 50); // Set its size lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text + lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style + lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style + lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text } else if (DialogType == DIALOG_PAUSE_MESSAGE_PAUSING || DialogType == DIALOG_PAUSE_MESSAGE_CHANGING @@ -251,28 +266,28 @@ void lv_draw_dialog(uint8_t type) { // nothing to do } else { - lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size + lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen + lv_obj_set_pos(btnOk, BTN_OK_X, BTN_OK_Y); // Set its position + lv_obj_set_size(btnOk, 100, 50); // Set its size lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button + lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style + lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style + lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button - lv_obj_t * btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnCancel, BTN_CANCEL_X, BTN_CANCEL_Y); // Set its position - lv_obj_set_size(btnCancel, 100, 50); // Set its size + lv_obj_t * btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen + lv_obj_set_pos(btnCancel, BTN_CANCEL_X, BTN_CANCEL_Y); // Set its position + lv_obj_set_size(btnCancel, 100, 50); // Set its size lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t * labelCancel = lv_label_create(btnCancel, NULL); // Add a label to the button + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style + lv_obj_t * labelCancel = lv_label_create(btnCancel, NULL); // Add a label to the button if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) { - lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text + lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text lv_label_set_text(labelCancel, pause_msg_menu.continuePrint); } else { - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text + lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); } } @@ -281,7 +296,7 @@ void lv_draw_dialog(uint8_t type) { lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); lv_obj_t * labelFile = lv_label_create(scr, NULL); - lv_obj_set_style(labelFile, &tft_style_lable_rel); + lv_obj_set_style(labelFile, &tft_style_label_rel); lv_label_set_text(labelFile, list_file.long_name[sel_id]); lv_obj_align(labelFile, NULL, LV_ALIGN_CENTER, 0, -60); @@ -338,8 +353,20 @@ void lv_draw_dialog(uint8_t type) { lv_label_set_text(labelDialog, pause_msg_menu.option); lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); } + else if (DialogType == DIALOG_STORE_EEPROM_TIPS) { + lv_label_set_text(labelDialog, eeprom_menu.storeTips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (DialogType == DIALOG_READ_EEPROM_TIPS) { + lv_label_set_text(labelDialog, eeprom_menu.readTips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (DialogType == DIALOG_REVERT_EEPROM_TIPS) { + lv_label_set_text(labelDialog, eeprom_menu.revertTips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } } void lv_clear_dialog() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index f68b0f8443fa..a5b829a2cf94 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -30,7 +30,7 @@ extern "C" { /* C-declarations for C++ */ #define DIALOG_TYPE_REPRINT_NO_FILE 2 #define DIALOG_TYPE_M80_FAIL 3 //** -#define DIALOG_TYPE_MESSEGE_ERR1 4 //** +#define DIALOG_TYPE_MESSAGE_ERR1 4 //** #define DIALOG_TYPE_UPDATE_ESP_FIRMARE 5 #define DIALOG_TYPE_UPDATE_ESP_DATA 6 @@ -65,6 +65,10 @@ extern "C" { /* C-declarations for C++ */ #define DIALOG_PAUSE_MESSAGE_HEATING 30 #define DIALOG_PAUSE_MESSAGE_OPTION 31 +#define DIALOG_STORE_EEPROM_TIPS 32 +#define DIALOG_READ_EEPROM_TIPS 33 +#define DIALOG_REVERT_EEPROM_TIPS 34 + #define BTN_OK_X 100 #define BTN_OK_Y 180 #define BTN_CANCEL_X 280 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp new file mode 100644 index 000000000000..f340ca463223 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp @@ -0,0 +1,237 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" + +static lv_obj_t * scr; + +#define ID_EEPROM_RETURN 1 +#define ID_EEPROM_STORE 2 +#define ID_EEPROM_STORE_ARROW 3 +#define ID_EEPROM_READ 4 +#define ID_EEPROM_READ_ARROW 5 +#define ID_EEPROM_REVERT 6 +#define ID_EEPROM_REVERT_ARROW 7 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_EEPROM_RETURN: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + draw_return_ui(); + } + break; + + #if 0 + case ID_EEPROM_STORE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); + } + break; + case ID_EEPROM_STORE_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); + } + break; + case ID_EEPROM_READ: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_READ_EEPROM_TIPS); + } + break; + case ID_EEPROM_READ_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_READ_EEPROM_TIPS); + } + break; + #endif + + case ID_EEPROM_REVERT: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_REVERT_EEPROM_TIPS); + } + break; + case ID_EEPROM_REVERT_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_eeprom_settings(); + lv_draw_dialog(DIALOG_REVERT_EEPROM_TIPS); + } + break; + } +} + +void lv_draw_eeprom_settings(void) { + lv_obj_t *buttonBack, *label_Back; + //lv_obj_t *buttonStore,*labelStore,*buttonStoreNarrow; + //lv_obj_t *buttonRead,*labelRead,*buttonReadNarrow; + lv_obj_t *buttonRevert, *labelRevert, *buttonRevertNarrow; + lv_obj_t * line1; // * line2,* line3; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EEPROM_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = EEPROM_SETTINGS_UI; + } + disp_state = EEPROM_SETTINGS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, creat_title_text()); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + LV_IMG_DECLARE(bmp_para_arrow); + #if 0 + buttonStore = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonStore, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonStore, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + //lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonStore, event_handler, ID_EEPROM_STORE, NULL, 0); + lv_btn_set_style(buttonStore, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonStore, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonStore, LV_LAYOUT_OFF); + labelStore = lv_label_create(buttonStore, NULL); /*Add a label to the button*/ + + buttonStoreNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonStoreNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonStoreNarrow, event_handler, ID_EEPROM_STORE_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonStoreNarrow, LV_LAYOUT_OFF); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonRead = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonRead, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonRead, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + //lv_obj_set_event_cb(buttonMotor, event_handler); + lv_obj_set_event_cb_mks(buttonRead, event_handler, ID_EEPROM_READ, NULL, 0); + lv_btn_set_style(buttonRead, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonRead, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonRead, LV_LAYOUT_OFF); + labelRead = lv_label_create(buttonRead, NULL); /*Add a label to the button*/ + + buttonReadNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonReadNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonReadNarrow, event_handler, ID_EEPROM_READ_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonReadNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonReadNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonReadNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonReadNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonReadNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + #endif // if 0 + buttonRevert = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonRevert, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonRevert, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + //lv_obj_set_event_cb(buttonMotor, event_handler); + lv_obj_set_event_cb_mks(buttonRevert, event_handler, ID_EEPROM_REVERT, NULL, 0); + lv_btn_set_style(buttonRevert, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonRevert, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonRevert, LV_LAYOUT_OFF); + labelRevert = lv_label_create(buttonRevert, NULL); /*Add a label to the button*/ + + buttonRevertNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonRevertNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonRevertNarrow, event_handler, ID_EEPROM_REVERT_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonRevertNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonRevertNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonRevertNarrow, LV_LAYOUT_OFF); + + //line3 = lv_line_create(scr, NULL); + //lv_ex_line(line3,line_points[2]); + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_EEPROM_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + //lv_label_set_text(labelStore, eeprom_menu.store); + //lv_obj_align(labelStore, buttonStore, LV_ALIGN_IN_LEFT_MID,0, 0); + + //lv_label_set_text(labelRead, eeprom_menu.read); + //lv_obj_align(labelRead, buttonRead, LV_ALIGN_IN_LEFT_MID,0, 0); + + lv_label_set_text(labelRevert, eeprom_menu.revert); + lv_obj_align(labelRevert, buttonRevert, LV_ALIGN_IN_LEFT_MID, 0, 0); + } + +} + +void lv_clear_eeprom_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h new file mode 100644 index 000000000000..da699353babd --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_eeprom_settings(void); +extern void lv_clear_eeprom_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp index f72cb2ab32fb..1bcdccda414a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -21,7 +21,11 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI + +#if ENABLED(TFT_LVGL_UI_SPI) + #include "SPI_TFT.h" +#endif #include "lv_conf.h" #include "draw_ui.h" @@ -55,30 +59,30 @@ void lv_draw_error_message(PGM_P const msg) { if (msg) { message = lv_label_create(scr, NULL); - lv_obj_set_style(message, &tft_style_lable_rel); + lv_obj_set_style(message, &tft_style_label_rel); lv_label_set_text(message, msg); lv_obj_align(message, NULL, LV_ALIGN_CENTER, 0, -50); } kill_message = lv_label_create(scr, NULL); - lv_obj_set_style(kill_message, &tft_style_lable_rel); + lv_obj_set_style(kill_message, &tft_style_label_rel); lv_label_set_text(kill_message, "PRINTER HALTED"); lv_obj_align(kill_message, NULL, LV_ALIGN_CENTER, 0, -10); reset_tips = lv_label_create(scr, NULL); - lv_obj_set_style(reset_tips, &tft_style_lable_rel); + lv_obj_set_style(reset_tips, &tft_style_label_rel); lv_label_set_text(reset_tips, "Please Reset"); lv_obj_align(reset_tips, NULL, LV_ALIGN_CENTER, 0, 30); lv_task_handler(); #endif - LCD_Clear(0x0000); + + TERN(TFT_LVGL_UI_SPI, SPI_TFT.LCD_clear, LCD_Clear)(0x0000); if (msg) disp_string((TFT_WIDTH - strlen(msg) * 16) / 2, 100, msg, 0xFFFF, 0x0000); disp_string((TFT_WIDTH - strlen("PRINTER HALTED") * 16) / 2, 140, "PRINTER HALTED", 0xFFFF, 0x0000); disp_string((TFT_WIDTH - strlen("Please Reset") * 16) / 2, 180, "Please Reset", 0xFFFF, 0x0000); - } void lv_clear_error_message() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 90a7ce64f6eb..ca84b4b5ecdd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" @@ -59,11 +59,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { - queue.enqueue_one_now(PSTR("G91")); - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf((char *)public_buf_l, "G1 E%d F%d", uiCfg.extruStep, 60 * uiCfg.extruSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); - queue.enqueue_one_now(PSTR("G90")); + queue.enqueue_now_P(PSTR("G91")); + ZERO(public_buf_l); + sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), uiCfg.extruStep, 60 * uiCfg.extruSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); extructAmount += uiCfg.extruStep; disp_extru_amount(); } @@ -75,11 +75,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { - queue.enqueue_one_now(PSTR("G91")); - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf((char *)public_buf_l, "G1 E%d F%d", 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); - queue.enqueue_one_now(PSTR("G90")); + queue.enqueue_now_P(PSTR("G91")); + ZERO(public_buf_l); + sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); extructAmount -= uiCfg.extruStep; disp_extru_amount(); } @@ -166,7 +166,7 @@ void lv_draw_extrusion(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -175,55 +175,54 @@ void lv_draw_extrusion(void) { LV_IMG_DECLARE(bmp_pic); /*Create an Image button*/ - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttoType = lv_imgbtn_create(scr, NULL); - buttonStep = lv_imgbtn_create(scr, NULL); + buttonAdd = lv_imgbtn_create(scr, NULL); + buttonDec = lv_imgbtn_create(scr, NULL); + buttoType = lv_imgbtn_create(scr, NULL); + buttonStep = lv_imgbtn_create(scr, NULL); buttonSpeed = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_E_ADD, "bmp_In.bin", 0); + lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_E_ADD, "bmp_in.bin", 0); lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_E_DEC, "bmp_Out.bin", 0); + lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_E_DEC, "bmp_out.bin", 0); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_E_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_E_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); @@ -235,8 +234,8 @@ void lv_draw_extrusion(void) { lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL); lv_obj_t * labelDec = lv_label_create(buttonDec, NULL); - labelType = lv_label_create(buttoType, NULL); - labelStep = lv_label_create(buttonStep, NULL); + labelType = lv_label_create(buttoType, NULL); + labelStep = lv_label_create(buttonStep, NULL); labelSpeed = lv_label_create(buttonSpeed, NULL); lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); @@ -256,24 +255,24 @@ void lv_draw_extrusion(void) { disp_ext_speed(); tempText = lv_label_create(scr, NULL); - lv_obj_set_style(tempText, &tft_style_lable_rel); + lv_obj_set_style(tempText, &tft_style_label_rel); disp_hotend_temp(); ExtruText = lv_label_create(scr, NULL); - lv_obj_set_style(ExtruText, &tft_style_lable_rel); + lv_obj_set_style(ExtruText, &tft_style_label_rel); disp_extru_amount(); } void disp_ext_type() { if (uiCfg.curSprayerChoose == 1) { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, "bmp_Extru2.bin", 0); + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, "bmp_extru2.bin", 0); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, extrude_menu.ext2); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } else { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, "bmp_Extru1.bin", 0); + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, "bmp_extru1.bin", 0); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, extrude_menu.ext1); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -283,11 +282,11 @@ void disp_ext_type() { void disp_ext_speed() { if (uiCfg.extruSpeed == 20) - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_Speed_high.bin", 0); + lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_speed_high.bin", 0); else if (uiCfg.extruSpeed == 1) - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_Speed_slow.bin", 0); + lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_speed_slow.bin", 0); else - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_Speed_normal.bin", 0); + lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_speed_normal.bin", 0); if (gCfgItems.multiple_language != 0) { if (uiCfg.extruSpeed == 20) { @@ -351,11 +350,11 @@ void disp_extru_amount() { void disp_ext_step() { if (uiCfg.extruStep == 1) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_Step1_mm.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_step1_mm.bin", 0); else if (uiCfg.extruStep == 5) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_Step5_mm.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_step5_mm.bin", 0); else if (uiCfg.extruStep == 10) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_Step10_mm.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_step10_mm.bin", 0); if (gCfgItems.multiple_language != 0) { if (uiCfg.extruStep == 1) { @@ -375,4 +374,4 @@ void disp_ext_step() { void lv_clear_extrusion() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp index 76c0e251e866..4dcac62aeefd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "../../../../MarlinCore.h" #include "lv_conf.h" @@ -33,6 +33,7 @@ #include "draw_ui.h" #include "../../../../module/temperature.h" #include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" static lv_obj_t * scr; static lv_obj_t * fanText; @@ -55,9 +56,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (fanSpeed + 1 <= 255) { fanSpeed++; - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "M106 S%d", fanSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); + gcode.process_subcommands_now(public_buf_l); } } break; @@ -68,9 +69,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (fanSpeed > 0) { fanSpeed--; - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "M106 S%d", fanSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); + gcode.process_subcommands_now(public_buf_l); } } @@ -80,7 +81,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - queue.enqueue_one_now(PSTR("M106 S255")); + gcode.process_subcommands_now_P(PSTR("M106 S255")); } break; case ID_F_MID: @@ -88,7 +89,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - queue.enqueue_one_now(PSTR("M106 S127")); + gcode.process_subcommands_now_P(PSTR("M106 S127")); } break; case ID_F_OFF: @@ -96,7 +97,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - queue.enqueue_one_now(PSTR("M107")); + gcode.process_subcommands_now_P(PSTR("M107")); } break; case ID_F_RETURN: @@ -111,11 +112,13 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } - void lv_draw_fan(void) { lv_obj_t *buttonAdd, *buttonDec, *buttonHigh, *buttonMid; lv_obj_t *buttonOff, *buttonBack; + #if HAS_FAN + fanSpeed = thermalManager.fan_speed[0]; + #endif if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FAN_UI) { disp_state_stack._disp_index++; disp_state_stack._disp_state[disp_state_stack._disp_index] = FAN_UI; @@ -129,7 +132,7 @@ void lv_draw_fan(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -148,39 +151,39 @@ void lv_draw_fan(void) { lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_F_ADD, "bmp_Add.bin", 0); lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); #if 1 lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_F_DEC, "bmp_Dec.bin", 0); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonHigh, event_handler, ID_F_HIGH, "bmp_Speed255.bin", 0); + lv_obj_set_event_cb_mks(buttonHigh, event_handler,ID_F_HIGH,"bmp_speed255.bin",0); lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonMid, event_handler, ID_F_MID, "bmp_Speed127.bin", 0); + lv_obj_set_event_cb_mks(buttonMid, event_handler,ID_F_MID,"bmp_speed127.bin",0); lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_F_OFF, "bmp_Speed0.bin", 0); + lv_obj_set_event_cb_mks(buttonOff, event_handler,ID_F_OFF,"bmp_speed0.bin",0); lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_F_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_F_RETURN,"bmp_return.bin",0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); @@ -227,7 +230,7 @@ void lv_draw_fan(void) { } fanText = lv_label_create(scr, NULL); - lv_obj_set_style(fanText, &tft_style_lable_rel); + lv_obj_set_style(fanText, &tft_style_label_rel); disp_fan_value(); } @@ -235,8 +238,8 @@ void disp_fan_value() { char buf1[10] = {0}; public_buf_l[0] = '\0'; strcat(public_buf_l, fan_menu.state); - strcat(public_buf_l, ": "); - sprintf(buf1, "%3d", thermalManager.fan_speed[0]); + strcat_P(public_buf_l, PSTR(": ")); + sprintf_P(buf1, PSTR("%3d"), thermalManager.fan_speed[0]); strcat(public_buf_l, buf1); lv_label_set_text(fanText, public_buf_l); lv_obj_align(fanText, NULL, LV_ALIGN_CENTER, 0, -65); @@ -244,4 +247,4 @@ void disp_fan_value() { void lv_clear_fan() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp index f6ad744b4180..35d442ebae76 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "../../../../MarlinCore.h" #include "draw_ready_print.h" @@ -48,8 +48,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_H_ALL: if (event == LV_EVENT_CLICKED) { - - } else if (event == LV_EVENT_RELEASED) { queue.inject_P(PSTR("G28")); @@ -57,8 +55,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { break; case ID_H_X: if (event == LV_EVENT_CLICKED) { - - } else if (event == LV_EVENT_RELEASED) { queue.inject_P(PSTR("G28 X0")); @@ -66,8 +62,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { break; case ID_H_Y: if (event == LV_EVENT_CLICKED) { - - } else if (event == LV_EVENT_RELEASED) { queue.inject_P(PSTR("G28 Y0")); @@ -75,8 +69,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { break; case ID_H_Z: if (event == LV_EVENT_CLICKED) { - - } else if (event == LV_EVENT_RELEASED) { queue.inject_P(PSTR("G28 Z0")); @@ -84,8 +76,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { break; case ID_H_OFF_ALL: if (event == LV_EVENT_CLICKED) { - - } else if (event == LV_EVENT_RELEASED) { queue.inject_P(PSTR("M84")); @@ -93,8 +83,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { break; case ID_H_OFF_XY: if (event == LV_EVENT_CLICKED) { - - } else if (event == LV_EVENT_RELEASED) { queue.inject_P(PSTR("M84 X Y")); @@ -102,7 +90,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { break; case ID_H_RETURN: if (event == LV_EVENT_CLICKED) { - } else if (event == LV_EVENT_RELEASED) { lv_obj_del(scr); @@ -113,7 +100,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } - void lv_draw_home(void) { lv_obj_t *buttonHomeAll, *buttonHomeX, *buttonHomeY, *buttonHomeZ; lv_obj_t *buttonBack; @@ -134,7 +120,7 @@ void lv_draw_home(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -156,67 +142,68 @@ void lv_draw_home(void) { //lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,"bmp_Wifi.bin",0); //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, &bmp_pic); //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_lable_pre); - //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_lable_rel); + //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_label_rel); //lv_obj_clear_protect(buttonWifi, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonHomeAll, event_handler, ID_H_ALL, "bmp_Zero.bin", 0); + lv_obj_set_event_cb_mks(buttonHomeAll, event_handler,ID_H_ALL,"bmp_zero.bin",0); lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_event_cb_mks(buttonHomeX, event_handler, ID_H_X, "bmp_zeroX.bin", 0); lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_REL, &tft_style_label_rel); //lv_obj_set_event_cb_mks(buttonContinue, event_handler,ID_S_CONTINUE,"bmp_Breakpoint.bin",0); //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_REL, &bmp_pic); //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_lable_pre); - //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_lable_rel); + //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_event_cb_mks(buttonHomeY, event_handler, ID_H_Y, "bmp_zeroY.bin", 0); lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_event_cb_mks(buttonHomeZ, event_handler, ID_H_Z, "bmp_zeroZ.bin", 0); lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOffAll, event_handler, ID_H_OFF_ALL, "bmp_manual_off.bin", 0); + lv_obj_set_event_cb_mks(buttonOffAll, event_handler,ID_H_OFF_ALL,"bmp_function1.bin",0); lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOffXY, event_handler, ID_H_OFF_XY, "bmp_manual_off.bin", 0); + lv_obj_set_event_cb_mks(buttonOffXY, event_handler,ID_H_OFF_XY,"bmp_function1.bin",0); lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_H_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_H_RETURN,"bmp_return.bin",0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif - /*lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); - lv_obj_set_pos(buttonFan,BTN_X_PIXEL+INTERVAL_V*2,titleHeight); - lv_obj_set_pos(buttonAbout,BTN_X_PIXEL*2+INTERVAL_V*3,titleHeight); - lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); - lv_obj_set_pos(buMotorOff,INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonLanguage,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ - - //lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); + + /*lv_obj_set_pos(buttonWifi, INTERVAL_V, titleHeight); + lv_obj_set_pos(buttonFan, BTN_X_PIXEL+INTERVAL_V*2, titleHeight); + lv_obj_set_pos(buttonAbout, BTN_X_PIXEL*2+INTERVAL_V*3, titleHeight); + lv_obj_set_pos(buttonContinue, BTN_X_PIXEL*3+INTERVAL_V*4, titleHeight); + lv_obj_set_pos(buMotorOff, INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_obj_set_pos(buttonLanguage, BTN_X_PIXEL+INTERVAL_V*2, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ + + //lv_obj_set_pos(buttonWifi, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonHomeX, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonHomeY, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); @@ -280,4 +267,4 @@ void lv_draw_home(void) { void lv_clear_home() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp new file mode 100644 index 000000000000..a552762cf3eb --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp @@ -0,0 +1,263 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_TFT_LVGL_UI, HAS_CLASSIC_JERK) + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" + +static lv_obj_t * scr; + +#define ID_JERK_RETURN 1 +#define ID_JERK_X 2 +#define ID_JERK_Y 3 +#define ID_JERK_Z 4 +#define ID_JERK_E 5 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_JERK_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_jerk_settings(); + draw_return_ui(); + } + break; + case ID_JERK_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = XJerk; + lv_clear_jerk_settings(); + lv_draw_number_key(); + } + break; + case ID_JERK_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = YJerk; + lv_clear_jerk_settings(); + lv_draw_number_key(); + } + break; + case ID_JERK_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = ZJerk; + lv_clear_jerk_settings(); + lv_draw_number_key(); + } + break; + case ID_JERK_E: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = EJerk; + lv_clear_jerk_settings(); + lv_draw_number_key(); + } + break; + } +} + +void lv_draw_jerk_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonEText = NULL, *labelEText = NULL, *buttonEValue = NULL, *labelEValue = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != JERK_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = JERK_UI; + } + disp_state = JERK_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.JerkConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + // LV_IMG_DECLARE(bmp_para_arrow); + LV_IMG_DECLARE(bmp_para_bank); + + buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonXText, event_handler); + lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); + labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + + buttonXValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_JERK_X, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonYText, event_handler); + lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); + labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + + buttonYValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_JERK_Y, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonZText, event_handler); + lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); + labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + + buttonZValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_JERK_Z, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonEText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonEText, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ + lv_obj_set_size(buttonEText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonEText, event_handler); + lv_btn_set_style(buttonEText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonEText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonEText, LV_LAYOUT_OFF); + labelEText = lv_label_create(buttonEText, NULL); /*Add a label to the button*/ + + buttonEValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonEValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonEValue, event_handler, ID_JERK_E, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonEValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonEValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonEValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonEValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonEValue, LV_LAYOUT_OFF); + labelEValue = lv_label_create(buttonEValue, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_JERK_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[E_AXIS]); + lv_label_set_text(labelEValue, public_buf_l); + lv_obj_align(labelEValue, buttonEValue, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelXText, machine_menu.X_Jerk); + lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelYText, machine_menu.Y_Jerk); + lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelZText, machine_menu.Z_Jerk); + lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelEText, machine_menu.E_Jerk); + lv_obj_align(labelEText, buttonEText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_jerk_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI && HAS_CLASSIC_JERK diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h new file mode 100644 index 000000000000..5badcde52932 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_jerk_settings(void); +extern void lv_clear_jerk_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp index 75fbb4d91f9f..65d0961248ed 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" @@ -35,17 +35,17 @@ //static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; -#define ID_CN 1 -#define ID_T_CN 2 -#define ID_EN 3 -#define ID_RU 4 -#define ID_ES 5 -#define ID_FR 6 -#define ID_IT 7 -#define ID_L_RETURN 8 +#define ID_CN 1 +#define ID_T_CN 2 +#define ID_EN 3 +#define ID_RU 4 +#define ID_ES 5 +#define ID_FR 6 +#define ID_IT 7 +#define ID_L_RETURN 8 -#define SELECTED 1 -#define UNSELECTED 0 +#define SELECTED 1 +#define UNSELECTED 0 static void disp_language(uint8_t language, uint8_t state); @@ -85,7 +85,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, "bmp_English_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, "bmp_english_sel.bin", 0); gCfgItems.language = LANG_ENGLISH; gCfg_to_spiFlah(); disp_language_init(); @@ -97,7 +97,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, "bmp_Russian_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, "bmp_russian_sel.bin", 0); gCfgItems.language = LANG_RUSSIAN; gCfg_to_spiFlah(); disp_language_init(); @@ -109,7 +109,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, "bmp_Spanish_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, "bmp_spanish_sel.bin", 0); gCfgItems.language = LANG_SPANISH; gCfg_to_spiFlah(); disp_language_init(); @@ -121,7 +121,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, "bmp_French_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, "bmp_french_sel.bin", 0); gCfgItems.language = LANG_FRENCH; gCfg_to_spiFlah(); disp_language_init(); @@ -133,7 +133,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { disp_language(gCfgItems.language, UNSELECTED); - lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_FR, "bmp_Italy_sel.bin", 0); + lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_FR, "bmp_italy_sel.bin", 0); gCfgItems.language = LANG_ITALY; gCfg_to_spiFlah(); disp_language_init(); @@ -145,14 +145,14 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { - buttonCN = NULL; + buttonCN = NULL; buttonT_CN = NULL; - buttonEN = NULL; - buttonRU = NULL; - buttonES = NULL; - buttonFR = NULL; - buttonFR = NULL; - buttonIT = NULL; + buttonEN = NULL; + buttonRU = NULL; + buttonES = NULL; + buttonFR = NULL; + buttonFR = NULL; + buttonIT = NULL; buttonBack = NULL; lv_obj_del(scr); @@ -170,52 +170,51 @@ static void disp_language(uint8_t language, uint8_t state) { public_buf_l[0] = '\0'; switch (language) { - case LANG_SIMPLE_CHINESE: id = ID_CN; - strcat(public_buf_l, "bmp_Simple_cn"); + strcpy_P(public_buf_l, PSTR("bmp_simplified_cn")); obj = buttonCN; - break; case LANG_COMPLEX_CHINESE: id = ID_T_CN; - strcat(public_buf_l, "bmp_Tradition_cn"); + strcpy_P(public_buf_l, PSTR("bmp_traditional_cn")); obj = buttonT_CN; break; case LANG_ENGLISH: id = ID_EN; - strcat(public_buf_l, "bmp_English"); + strcpy_P(public_buf_l, PSTR("bmp_english")); obj = buttonEN; break; case LANG_RUSSIAN: id = ID_RU; - strcat(public_buf_l, "bmp_Russian"); + strcpy_P(public_buf_l, PSTR("bmp_russian")); obj = buttonRU; break; case LANG_SPANISH: id = ID_ES; - strcat(public_buf_l, "bmp_Spanish"); + strcpy_P(public_buf_l, PSTR("bmp_spanish")); obj = buttonES; break; case LANG_FRENCH: id = ID_FR; - strcat(public_buf_l, "bmp_French"); + strcpy_P(public_buf_l, PSTR("bmp_french")); obj = buttonFR; break; case LANG_ITALY: id = ID_IT; - strcat(public_buf_l, "bmp_Italy"); + strcpy_P(public_buf_l, PSTR("bmp_italy")); obj = buttonIT; break; default: id = ID_CN; - strcat(public_buf_l, "bmp_Simple_cn"); + strcpy_P(public_buf_l, PSTR("bmp_simplified_cn")); obj = buttonCN; break; } - if (state == SELECTED) strcat(public_buf_l, "_sel.bin"); - else strcat(public_buf_l, ".bin"); + if (state == SELECTED) strcat_P(public_buf_l, PSTR("_sel")); + + strcat_P(public_buf_l, PSTR(".bin")); lv_obj_set_event_cb_mks(obj, event_handler, id, public_buf_l, 0); @@ -232,14 +231,14 @@ void lv_draw_language(void) { scr = lv_obj_create(NULL, NULL); - //static lv_style_t tool_style; + // static lv_style_t tool_style; lv_obj_set_style(scr, &tft_style_scr); lv_scr_load(scr); lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -248,74 +247,73 @@ void lv_draw_language(void) { LV_IMG_DECLARE(bmp_pic); /*Create an Image button*/ - buttonCN = lv_imgbtn_create(scr, NULL); + buttonCN = lv_imgbtn_create(scr, NULL); buttonT_CN = lv_imgbtn_create(scr, NULL); - buttonEN = lv_imgbtn_create(scr, NULL); - buttonRU = lv_imgbtn_create(scr, NULL); - buttonES = lv_imgbtn_create(scr, NULL); - buttonFR = lv_imgbtn_create(scr, NULL); - buttonIT = lv_imgbtn_create(scr, NULL); + buttonEN = lv_imgbtn_create(scr, NULL); + buttonRU = lv_imgbtn_create(scr, NULL); + buttonES = lv_imgbtn_create(scr, NULL); + buttonFR = lv_imgbtn_create(scr, NULL); + buttonIT = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_simplified_cn.bin", 0); lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW); #if 1 lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_traditional_cn.bin", 0); lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, "bmp_English.bin", 0); + lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, "bmp_english.bin", 0); lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, "bmp_Russian.bin", 0); + lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, "bmp_russian.bin", 0); lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, "bmp_Spanish.bin", 0); + lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, "bmp_spanish.bin", 0); lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonES, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonES, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonES, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonES, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, "bmp_French.bin", 0); + lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, "bmp_french.bin", 0); lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_IT, "bmp_Italy.bin", 0); + lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_IT, "bmp_italy.bin", 0); lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_L_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_L_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); - #endif + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 lv_obj_set_pos(buttonCN, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonT_CN, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonEN, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); lv_obj_set_pos(buttonRU, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonES, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonES, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonFR, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonIT, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonIT, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ lv_btn_set_layout(buttonCN, LV_LAYOUT_OFF); @@ -327,13 +325,13 @@ void lv_draw_language(void) { lv_btn_set_layout(buttonIT, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * label_CN = lv_label_create(buttonCN, NULL); + lv_obj_t * label_CN = lv_label_create(buttonCN, NULL); lv_obj_t * label_T_CN = lv_label_create(buttonT_CN, NULL); - lv_obj_t * label_EN = lv_label_create(buttonEN, NULL); - lv_obj_t * label_RU = lv_label_create(buttonRU, NULL); - lv_obj_t * label_ES = lv_label_create(buttonES, NULL); - lv_obj_t * label_FR = lv_label_create(buttonFR, NULL); - lv_obj_t * label_IT = lv_label_create(buttonIT, NULL); + lv_obj_t * label_EN = lv_label_create(buttonEN, NULL); + lv_obj_t * label_RU = lv_label_create(buttonRU, NULL); + lv_obj_t * label_ES = lv_label_create(buttonES, NULL); + lv_obj_t * label_FR = lv_label_create(buttonFR, NULL); + lv_obj_t * label_IT = lv_label_create(buttonIT, NULL); lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); disp_language(gCfgItems.language, SELECTED); @@ -367,4 +365,4 @@ void lv_draw_language(void) { void lv_clear_language() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp new file mode 100644 index 000000000000..af16367b651d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -0,0 +1,232 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" + +static lv_obj_t * scr; + +#define ID_PARA_RETURN 1 +#define ID_PARA_MACHINE 2 +#define ID_PARA_MACHINE_ARROW 3 +#define ID_PARA_MOTOR 4 +#define ID_PARA_MOTOR_ARROW 5 +#define ID_PARA_ADVANCE 6 +#define ID_PARA_ADVANCE_ARROW 7 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_PARA_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + draw_return_ui(); + } + break; + case ID_PARA_MACHINE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_machine_settings(); + } + break; + case ID_PARA_MACHINE_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_machine_settings(); + } + break; + case ID_PARA_MOTOR: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_motor_settings(); + } + break; + case ID_PARA_MOTOR_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_motor_settings(); + } + break; + case ID_PARA_ADVANCE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_advance_settings(); + } + break; + case ID_PARA_ADVANCE_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_advance_settings(); + } + break; + } +} + +void lv_draw_machine_para(void) { + lv_obj_t *buttonBack, *label_Back; + lv_obj_t *buttonMachine, *labelMachine, *buttonMachineNarrow; + lv_obj_t *buttonMotor, *labelMotor, *buttonMotorNarrow; + lv_obj_t *buttonAdvance, *labelAdvance, *buttonAdvanceNarrow; + lv_obj_t * line1, * line2, * line3; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_PARA_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_PARA_UI; + } + disp_state = MACHINE_PARA_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, creat_title_text()); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + LV_IMG_DECLARE(bmp_para_arrow); + + buttonMachine = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonMachine, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonMachine, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonMachine, event_handler, ID_PARA_MACHINE, NULL, 0); + lv_btn_set_style(buttonMachine, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonMachine, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonMachine, LV_LAYOUT_OFF); + labelMachine = lv_label_create(buttonMachine, NULL); /*Add a label to the button*/ + + buttonMachineNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonMachineNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonMachineNarrow, event_handler, ID_PARA_MACHINE_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonMachineNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMachineNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonMachineNarrow, LV_LAYOUT_OFF); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonMotor = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonMotor, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonMotor, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMotor, event_handler); + lv_obj_set_event_cb_mks(buttonMotor, event_handler, ID_PARA_MOTOR, NULL, 0); + lv_btn_set_style(buttonMotor, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonMotor, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonMotor, LV_LAYOUT_OFF); + labelMotor = lv_label_create(buttonMotor, NULL); /*Add a label to the button*/ + + buttonMotorNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonMotorNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonMotorNarrow, event_handler, ID_PARA_MOTOR_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonMotorNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMotorNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonMotorNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonAdvance = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonAdvance, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonAdvance, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMotor, event_handler); + lv_obj_set_event_cb_mks(buttonAdvance, event_handler, ID_PARA_ADVANCE, NULL, 0); + lv_btn_set_style(buttonAdvance, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonAdvance, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonAdvance, LV_LAYOUT_OFF); + labelAdvance = lv_label_create(buttonAdvance, NULL); /*Add a label to the button*/ + + buttonAdvanceNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonAdvanceNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonAdvanceNarrow, event_handler, ID_PARA_ADVANCE_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonAdvanceNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonAdvanceNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonAdvanceNarrow, LV_LAYOUT_OFF); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PARA_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelMachine, MachinePara_menu.MachineSetting); + lv_obj_align(labelMachine, buttonMachine, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelMotor, MachinePara_menu.MotorSetting); + lv_obj_align(labelMotor, buttonMotor, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelAdvance, MachinePara_menu.AdvanceSetting); + lv_obj_align(labelAdvance, buttonAdvance, LV_ALIGN_IN_LEFT_MID, 0, 0); + } + +} + +void lv_clear_machine_para() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h new file mode 100644 index 000000000000..d75df293b11c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_machine_para(void); +extern void lv_clear_machine_para(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp new file mode 100644 index 000000000000..982dd4408b9e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -0,0 +1,241 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" + +static lv_obj_t * scr; + +#define ID_MACHINE_RETURN 1 +#define ID_MACHINE_ACCELERATION 2 +#define ID_MACHINE_ACCELERATION_ARROW 3 +#define ID_MACHINE_FEEDRATE 4 +#define ID_MACHINE_FEEDRATE_ARROW 5 +#define ID_MACHINE_JERK 6 +#define ID_MACHINE_JERK_ARROW 7 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_MACHINE_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_settings(); + draw_return_ui(); + } + break; + case ID_MACHINE_ACCELERATION: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_settings(); + lv_draw_acceleration_settings(); + } + break; + case ID_MACHINE_ACCELERATION_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_settings(); + lv_draw_acceleration_settings(); + } + break; + case ID_MACHINE_FEEDRATE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_settings(); + lv_draw_max_feedrate_settings(); + } + break; + case ID_MACHINE_FEEDRATE_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_settings(); + lv_draw_max_feedrate_settings(); + } + break; + #if HAS_CLASSIC_JERK + case ID_MACHINE_JERK: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_settings(); + lv_draw_jerk_settings(); + } + break; + case ID_MACHINE_JERK_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_settings(); + lv_draw_jerk_settings(); + } + break; + #endif + } +} + +void lv_draw_machine_settings(void) { + lv_obj_t *buttonBack, *label_Back; + lv_obj_t *buttonAcceleration, *labelAcceleration, *buttonAccelerationNarrow; + lv_obj_t *buttonMaxFeedrate, *labelMaxFeedrate, *buttonMaxFeedrateNarrow; + #if HAS_CLASSIC_JERK + lv_obj_t *buttonJerk, *labelJerk, *buttonJerkNarrow; + #endif + lv_obj_t * line1, * line2; + #if HAS_CLASSIC_JERK + lv_obj_t * line3; + #endif + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_SETTINGS_UI; + } + disp_state = MACHINE_SETTINGS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.MachineConfigTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + LV_IMG_DECLARE(bmp_para_arrow); + + buttonAcceleration = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonAcceleration, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonAcceleration, event_handler, ID_MACHINE_ACCELERATION, NULL, 0); + lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonAcceleration, LV_LAYOUT_OFF); + labelAcceleration = lv_label_create(buttonAcceleration, NULL); /*Add a label to the button*/ + + buttonAccelerationNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonAccelerationNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonAccelerationNarrow, event_handler, ID_MACHINE_ACCELERATION_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonAccelerationNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonAccelerationNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonAccelerationNarrow, LV_LAYOUT_OFF); + + line1 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line1, line_points[0]); + + buttonMaxFeedrate = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonMaxFeedrate, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonMaxFeedrate, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonMaxFeedrate, event_handler, ID_MACHINE_FEEDRATE, NULL, 0); + lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonMaxFeedrate, LV_LAYOUT_OFF); + labelMaxFeedrate = lv_label_create(buttonMaxFeedrate, NULL); /*Add a label to the button*/ + + buttonMaxFeedrateNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonMaxFeedrateNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonMaxFeedrateNarrow, event_handler, ID_MACHINE_FEEDRATE_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonMaxFeedrateNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line2, line_points[1]); + + #if HAS_CLASSIC_JERK + buttonJerk = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonJerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonJerk, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMotor, event_handler); + lv_obj_set_event_cb_mks(buttonJerk, event_handler, ID_MACHINE_JERK, NULL, 0); + lv_btn_set_style(buttonJerk, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonJerk, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonJerk, LV_LAYOUT_OFF); + labelJerk = lv_label_create(buttonJerk, NULL); /*Add a label to the button*/ + + buttonJerkNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonJerkNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonJerkNarrow, event_handler, ID_MACHINE_JERK_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonJerkNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonJerkNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonJerkNarrow, LV_LAYOUT_OFF); + + line3 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line3, line_points[2]); + #endif + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MACHINE_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelAcceleration, machine_menu.AccelerationConf); + lv_obj_align(labelAcceleration, buttonAcceleration, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelMaxFeedrate, machine_menu.MaxFeedRateConf); + lv_obj_align(labelMaxFeedrate, buttonMaxFeedrate, LV_ALIGN_IN_LEFT_MID, 0, 0); + #if HAS_CLASSIC_JERK + lv_label_set_text(labelJerk, machine_menu.JerkConf); + lv_obj_align(labelJerk, buttonJerk, LV_ALIGN_IN_LEFT_MID, 0, 0); + #endif + } +} + +void lv_clear_machine_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h new file mode 100644 index 000000000000..37029c85c43c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_machine_settings(void); +extern void lv_clear_machine_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 3a28ebde62d4..ab4d9eb881ee 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "../../../../MarlinCore.h" #include "lv_conf.h" @@ -35,13 +35,12 @@ //static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; static lv_obj_t * scr; -#define ID_M_POINT1 1 -#define ID_M_POINT2 2 -#define ID_M_POINT3 3 -#define ID_M_POINT4 4 -#define ID_M_POINT5 5 - -#define ID_MANUAL_RETURN 6 +#define ID_M_POINT1 1 +#define ID_M_POINT2 2 +#define ID_M_POINT3 3 +#define ID_M_POINT4 4 +#define ID_M_POINT5 5 +#define ID_MANUAL_RETURN 6 static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { @@ -53,16 +52,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { if (queue.length == 0) { if (uiCfg.leveling_first_time) { - queue.enqueue_one_P(PSTR("G28")); + queue.enqueue_now_P(PSTR("G28")); uiCfg.leveling_first_time = 0; } - queue.enqueue_one_P(PSTR("G1 Z10")); + queue.enqueue_now_P(PSTR("G1 Z10")); - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "G1 X%d Y%d", X_MIN_POS + 30, Y_MIN_POS + 30); - queue.enqueue_one_P(PSTR(public_buf_l)); - queue.enqueue_one_P(PSTR("G1 Z0")); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_MIN_POS + 30, Y_MIN_POS + 30); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } } break; @@ -73,16 +72,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (queue.length == 0) { if (uiCfg.leveling_first_time) { - queue.enqueue_one_P(PSTR("G28")); + queue.enqueue_now_P(PSTR("G28")); uiCfg.leveling_first_time = 0; } - queue.enqueue_one_P(PSTR("G1 Z10")); + queue.enqueue_now_P(PSTR("G1 Z10")); - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "G1 X%d Y%d", X_MAX_POS - 30, Y_MIN_POS + 30); - queue.enqueue_one_P(PSTR(public_buf_l)); - queue.enqueue_one_P(PSTR("G1 Z0")); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_MAX_POS - 30, Y_MIN_POS + 30); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } } break; @@ -93,16 +92,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (queue.length == 0) { if (uiCfg.leveling_first_time) { - queue.enqueue_one_P(PSTR("G28")); + queue.enqueue_now_P(PSTR("G28")); uiCfg.leveling_first_time = 0; } - queue.enqueue_one_P(PSTR("G1 Z10")); + queue.enqueue_now_P(PSTR("G1 Z10")); - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "G1 X%d Y%d", X_MAX_POS - 30, Y_MAX_POS - 30); - queue.enqueue_one_P(PSTR(public_buf_l)); - queue.enqueue_one_P(PSTR("G1 Z0")); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_MAX_POS - 30, Y_MAX_POS - 30); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } } @@ -114,16 +113,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (queue.length == 0) { if (uiCfg.leveling_first_time) { - queue.enqueue_one_P(PSTR("G28")); + queue.enqueue_now_P(PSTR("G28")); uiCfg.leveling_first_time = 0; } - queue.enqueue_one_P(PSTR("G1 Z10")); + queue.enqueue_now_P(PSTR("G1 Z10")); - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "G1 X%d Y%d", X_MIN_POS + 30, Y_MAX_POS - 30); - queue.enqueue_one_P(PSTR(public_buf_l)); - queue.enqueue_one_P(PSTR("G1 Z0")); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_MIN_POS + 30, Y_MAX_POS - 30); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } } break; @@ -134,16 +133,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (queue.length == 0) { if (uiCfg.leveling_first_time) { - queue.enqueue_one_P(PSTR("G28")); + queue.enqueue_now_P(PSTR("G28")); uiCfg.leveling_first_time = 0; } - queue.enqueue_one_P(PSTR("G1 Z10")); + queue.enqueue_now_P(PSTR("G1 Z10")); - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "G1 X%d Y%d", X_BED_SIZE / 2, Y_BED_SIZE / 2); - queue.enqueue_one_P(PSTR(public_buf_l)); - queue.enqueue_one_P(PSTR("G1 Z0")); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), X_BED_SIZE / 2, Y_BED_SIZE / 2); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); } } @@ -157,7 +156,6 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_draw_tool(); } break; - } } @@ -174,14 +172,14 @@ void lv_draw_manualLevel(void) { scr = lv_obj_create(NULL, NULL); - //static lv_style_t tool_style; + // static lv_style_t tool_style; lv_obj_set_style(scr, &tft_style_scr); lv_scr_load(scr); lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -195,52 +193,52 @@ void lv_draw_manualLevel(void) { buttonPoint3 = lv_imgbtn_create(scr, NULL); buttonPoint4 = lv_imgbtn_create(scr, NULL); buttonPoint5 = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonPoint1, event_handler, ID_M_POINT1, "bmp_Leveling1.bin", 0); + lv_obj_set_event_cb_mks(buttonPoint1, event_handler, ID_M_POINT1, "bmp_leveling1.bin", 0); lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonPoint1, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonPoint2, event_handler, ID_M_POINT2, "bmp_Leveling2.bin", 0); + lv_obj_set_event_cb_mks(buttonPoint2, event_handler, ID_M_POINT2, "bmp_leveling2.bin", 0); lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonPoint3, event_handler, ID_M_POINT3, "bmp_Leveling3.bin", 0); + lv_obj_set_event_cb_mks(buttonPoint3, event_handler, ID_M_POINT3, "bmp_leveling3.bin", 0); lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonPoint4, event_handler, ID_M_POINT4, "bmp_Leveling4.bin", 0); + lv_obj_set_event_cb_mks(buttonPoint4, event_handler, ID_M_POINT4, "bmp_leveling4.bin", 0); lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonPoint5, event_handler, ID_M_POINT5, "bmp_Leveling5.bin", 0); + lv_obj_set_event_cb_mks(buttonPoint5, event_handler, ID_M_POINT5, "bmp_leveling5.bin", 0); lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif lv_obj_set_pos(buttonPoint1, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonPoint2, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonPoint3, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); lv_obj_set_pos(buttonPoint4, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonPoint5, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonPoint5, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ lv_btn_set_layout(buttonPoint1, LV_LAYOUT_OFF); @@ -255,8 +253,7 @@ void lv_draw_manualLevel(void) { lv_obj_t * label_Point3 = lv_label_create(buttonPoint3, NULL); lv_obj_t * label_Point4 = lv_label_create(buttonPoint4, NULL); lv_obj_t * label_Point5 = lv_label_create(buttonPoint5, NULL); - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); - + lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { lv_label_set_text(label_Point1, leveling_menu.position1); @@ -281,4 +278,4 @@ void lv_draw_manualLevel(void) { void lv_clear_manualLevel() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp new file mode 100644 index 000000000000..c78c6f5bb8d4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -0,0 +1,359 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" + +static lv_obj_t * scr; + +#define ID_FEED_RETURN 1 +#define ID_FEED_X 2 +#define ID_FEED_Y 3 +#define ID_FEED_Z 4 +#define ID_FEED_E0 5 +#define ID_FEED_E1 6 +#define ID_FEED_DOWN 7 +#define ID_FEED_UP 8 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_FEED_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_max_feedrate_settings(); + draw_return_ui(); + } + break; + case ID_FEED_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = XMaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); + } + break; + case ID_FEED_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = YMaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); + } + break; + case ID_FEED_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = ZMaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); + } + break; + case ID_FEED_E0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E0MaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); + } + break; + case ID_FEED_E1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E1MaxFeedRate; + lv_clear_max_feedrate_settings(); + lv_draw_number_key(); + } + break; + case ID_FEED_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_max_feedrate_settings(); + lv_draw_max_feedrate_settings(); + } + break; + case ID_FEED_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_max_feedrate_settings(); + lv_draw_max_feedrate_settings(); + } + break; + } +} + +void lv_draw_max_feedrate_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MAXFEEDRATE_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = MAXFEEDRATE_UI; + } + disp_state = MAXFEEDRATE_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.MaxFeedRateConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + // LV_IMG_DECLARE(bmp_para_arrow); + LV_IMG_DECLARE(bmp_para_bank); + + if (uiCfg.para_ui_page != 1) { + buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonXText, event_handler); + lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); + labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + + buttonXValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_FEED_X, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonYText, event_handler); + lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); + labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + + buttonYValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_FEED_Y, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonZText, event_handler); + lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); + labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + + buttonZValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_FEED_Z, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ + lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE0Text, event_handler); + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); + labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + + buttonE0Value = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_FEED_E0, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); + labelE0Value = lv_label_create(buttonE0Value, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_DOWN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + } + else { + buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE1Text, event_handler); + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); + labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + + buttonE1Value = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_FEED_E1, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); + labelE1Value = lv_label_create(buttonE1Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_UP, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FEED_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + lv_label_set_text(labelXText, machine_menu.XMaxFeedRate); + lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelYText, machine_menu.YMaxFeedRate); + lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelZText, machine_menu.ZMaxFeedRate); + lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelE0Text, machine_menu.E0MaxFeedRate); + lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); + lv_label_set_text(labelE0Value, public_buf_l); + lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); + } + else { + lv_label_set_text(labelE1Text, machine_menu.E1MaxFeedRate); + lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); + lv_label_set_text(labelE1Value, public_buf_l); + lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); + } + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_max_feedrate_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h new file mode 100644 index 000000000000..24edae27e415 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_max_feedrate_settings(void); +extern void lv_clear_max_feedrate_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp new file mode 100644 index 000000000000..1d8f80b9b4c6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -0,0 +1,247 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" + +static lv_obj_t * scr; + +#define ID_MOTOR_RETURN 1 +#define ID_MOTOR_STEPS 2 +#define ID_MOTOR_STEPS_ARROW 3 +#define ID_MOTOR_TMC_CURRENT 4 +#define ID_MOTOR_TMC_CURRENT_ARROW 5 +#define ID_MOTOR_STEP_MODE 6 +#define ID_MOTOR_STEP_MODE_ARROW 7 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_MOTOR_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + draw_return_ui(); + } + break; + case ID_MOTOR_STEPS: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_step_settings(); + } + break; + case ID_MOTOR_STEPS_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_step_settings(); + } + break; + #if HAS_TRINAMIC_CONFIG + case ID_MOTOR_TMC_CURRENT: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_tmc_current_settings(); + } + break; + case ID_MOTOR_TMC_CURRENT_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_tmc_current_settings(); + } + break; + #if HAS_STEALTHCHOP + case ID_MOTOR_STEP_MODE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_tmc_step_mode_settings(); + } + break; + case ID_MOTOR_STEP_MODE_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_tmc_step_mode_settings(); + } + break; + #endif + #endif + } +} + +void lv_draw_motor_settings(void) { + lv_obj_t *buttonBack, *label_Back; + lv_obj_t *buttonSteps, *labelSteps, *buttonStepsNarrow; + #if HAS_TRINAMIC_CONFIG + lv_obj_t *buttonTMCcurrent, *labelTMCcurrent, *buttonTMCcurrentNarrow; + lv_obj_t * line2; + #if HAS_STEALTHCHOP + lv_obj_t *buttonStepMode, *labelStepMode, *buttonStepModeNarrow; + lv_obj_t * line3; + #endif + #endif + lv_obj_t * line1; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOTOR_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = MOTOR_SETTINGS_UI; + } + disp_state = MOTOR_SETTINGS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.MotorConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + LV_IMG_DECLARE(bmp_para_arrow); + + buttonSteps = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonSteps, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonSteps, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonSteps, event_handler, ID_MOTOR_STEPS, NULL, 0); + lv_btn_set_style(buttonSteps, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonSteps, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonSteps, LV_LAYOUT_OFF); + labelSteps = lv_label_create(buttonSteps, NULL); /*Add a label to the button*/ + + buttonStepsNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonStepsNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonStepsNarrow, event_handler, ID_MOTOR_STEPS_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonStepsNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonStepsNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonStepsNarrow, LV_LAYOUT_OFF); + + line1 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line1, line_points[0]); + #if HAS_TRINAMIC_CONFIG + buttonTMCcurrent = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonTMCcurrent, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonTMCcurrent, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonTMCcurrent, event_handler, ID_MOTOR_TMC_CURRENT, NULL, 0); + lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonTMCcurrent, LV_LAYOUT_OFF); + labelTMCcurrent = lv_label_create(buttonTMCcurrent, NULL); /*Add a label to the button*/ + + buttonTMCcurrentNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonTMCcurrentNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonTMCcurrentNarrow, event_handler, ID_MOTOR_TMC_CURRENT_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonTMCcurrentNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line2, line_points[1]); + + #if HAS_STEALTHCHOP + buttonStepMode = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonStepMode, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonStepMode, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + // lv_obj_set_event_cb(buttonMachine, event_handler); + lv_obj_set_event_cb_mks(buttonStepMode, event_handler, ID_MOTOR_STEP_MODE, NULL, 0); + lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonStepMode, LV_LAYOUT_OFF); + labelStepMode = lv_label_create(buttonStepMode, NULL); /*Add a label to the button*/ + + buttonStepModeNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonStepModeNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonStepModeNarrow, event_handler, ID_MOTOR_STEP_MODE_ARROW, "bmp_arrow.bin", 0); + lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_REL, &bmp_para_arrow); + lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_PR, &bmp_para_arrow); + lv_imgbtn_set_style(buttonStepModeNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonStepModeNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonStepModeNarrow, LV_LAYOUT_OFF); + + line3 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line3, line_points[2]); + #endif + #endif // HAS_TRINAMIC_CONFIG + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MOTOR_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelSteps, machine_menu.StepsConf); + lv_obj_align(labelSteps, buttonSteps, LV_ALIGN_IN_LEFT_MID, 0, 0); + #if HAS_TRINAMIC_CONFIG + lv_label_set_text(labelTMCcurrent, machine_menu.TMCcurrentConf); + lv_obj_align(labelTMCcurrent, buttonTMCcurrent, LV_ALIGN_IN_LEFT_MID, 0, 0); + #if HAS_STEALTHCHOP + lv_label_set_text(labelStepMode, machine_menu.TMCStepModeConf); + lv_obj_align(labelStepMode, buttonStepMode, LV_ALIGN_IN_LEFT_MID, 0, 0); + #endif + #endif + } + +} + +void lv_clear_motor_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h new file mode 100644 index 000000000000..bae1918ad581 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_motor_settings(void); +extern void lv_clear_motor_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 223ecf170338..555c228f0027 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "../../../../MarlinCore.h" #include "lv_conf.h" @@ -53,10 +53,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (queue.length <= (BUFSIZE - 3)) { - memset(public_buf_l, 0, sizeof(public_buf_l)); + ZERO(public_buf_l); queue.enqueue_one_P(PSTR("G91")); - sprintf(public_buf_l, "G1 X%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_P(PSTR(public_buf_l)); + sprintf_P(public_buf_l, PSTR("G1 X%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); queue.enqueue_one_P(PSTR("G90")); } } @@ -67,11 +67,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (queue.length <= (BUFSIZE - 3)) { - memset(public_buf_l, 0, sizeof(public_buf_l)); - queue.enqueue_one_now(PSTR("G91")); - sprintf(public_buf_l, "G1 X-%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); - queue.enqueue_one_now(PSTR("G90")); + ZERO(public_buf_l); + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 X-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } } break; @@ -81,11 +81,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (queue.length <= (BUFSIZE - 3)) { - memset(public_buf_l, 0, sizeof(public_buf_l)); - queue.enqueue_one_now(PSTR("G91")); - sprintf(public_buf_l, "G1 Y%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); - queue.enqueue_one_now(PSTR("G90")); + ZERO(public_buf_l); + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 Y%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } } break; @@ -95,11 +95,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (queue.length <= (BUFSIZE - 3)) { - memset(public_buf_l, 0, sizeof(public_buf_l)); - queue.enqueue_one_now(PSTR("G91")); - sprintf(public_buf_l, "G1 Y-%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); - queue.enqueue_one_now(PSTR("G90")); + ZERO(public_buf_l); + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 Y-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } } break; @@ -109,11 +109,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (queue.length <= (BUFSIZE - 3)) { - memset(public_buf_l, 0, sizeof(public_buf_l)); - queue.enqueue_one_now(PSTR("G91")); - sprintf(public_buf_l, "G1 Z%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); - queue.enqueue_one_now(PSTR("G90")); + ZERO(public_buf_l); + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 Z%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } } break; @@ -123,11 +123,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (queue.length <= (BUFSIZE - 3)) { - memset(public_buf_l, 0, sizeof(public_buf_l)); - queue.enqueue_one_now(PSTR("G91")); - sprintf(public_buf_l, "G1 Z-%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(PSTR(public_buf_l)); - queue.enqueue_one_now(PSTR("G90")); + ZERO(public_buf_l); + queue.enqueue_now_P(PSTR("G91")); + sprintf_P(public_buf_l, PSTR("G1 Z-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G90")); } } break; @@ -154,14 +154,11 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { draw_return_ui(); } break; - } } - void lv_draw_move_motor(void) { - lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD; - lv_obj_t *buttonZI, *buttonZD, *buttonBack; + lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD, *buttonZI, *buttonZD, *buttonBack; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOVE_MOTOR_UI) { disp_state_stack._disp_index++; @@ -176,7 +173,7 @@ void lv_draw_move_motor(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -184,74 +181,73 @@ void lv_draw_move_motor(void) { LV_IMG_DECLARE(bmp_pic); - /*Create an Image button*/ - buttonXI = lv_imgbtn_create(scr, NULL); - buttonXD = lv_imgbtn_create(scr, NULL); - buttonYI = lv_imgbtn_create(scr, NULL); - buttonYD = lv_imgbtn_create(scr, NULL); - buttonZI = lv_imgbtn_create(scr, NULL); - buttonZD = lv_imgbtn_create(scr, NULL); - buttonV = lv_imgbtn_create(scr, NULL); + buttonXI = lv_imgbtn_create(scr, NULL); + buttonXD = lv_imgbtn_create(scr, NULL); + buttonYI = lv_imgbtn_create(scr, NULL); + buttonYD = lv_imgbtn_create(scr, NULL); + buttonZI = lv_imgbtn_create(scr, NULL); + buttonZD = lv_imgbtn_create(scr, NULL); + buttonV = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_M_X_P, "bmp_xAdd.bin", 0); lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW); #if 1 lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_M_X_N, "bmp_xDec.bin", 0); lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_M_Y_P, "bmp_yAdd.bin", 0); lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_M_Y_N, "bmp_yDec.bin", 0); lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_M_Z_P, "bmp_zAdd.bin", 0); lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_M_Z_N, "bmp_zDec.bin", 0); lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); + // lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_M_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_M_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); - #endif + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); lv_obj_set_pos(buttonV, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonYD, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); @@ -272,7 +268,6 @@ void lv_draw_move_motor(void) { labelV = lv_label_create(buttonV, NULL); lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); - if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelXI, move_menu.x_add); lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -300,14 +295,14 @@ void lv_draw_move_motor(void) { } void disp_move_dist() { - //char buf[30] = {0}; + // char buf[30] = {0}; if ((int)(10 * uiCfg.move_dist) == 1) - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_Step_move0_1.bin", 0); + lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_step_move0_1.bin", 0); else if ((int)(10 * uiCfg.move_dist) == 10) - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_Step_move1.bin", 0); + lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_step_move1.bin", 0); else if ((int)(10 * uiCfg.move_dist) == 100) - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_Step_move10.bin", 0); + lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_step_move10.bin", 0); if (gCfgItems.multiple_language != 0) { if ((int)(10 * uiCfg.move_dist) == 1) { lv_label_set_text(labelV, move_menu.step_01mm); @@ -326,4 +321,4 @@ void disp_move_dist() { void lv_clear_move_motor() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp new file mode 100644 index 000000000000..7a4e7257e203 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -0,0 +1,799 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +//#include "../../lvgl/src/lv_objx/lv_imgbtn.h" +//#include "../../lvgl/src/lv_objx/lv_img.h" +//#include "../../lvgl/src/lv_core/lv_disp.h" +//#include "../../lvgl/src/lv_core/lv_refr.h" +//#include "../../MarlinCore.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" +#include "../../../../gcode/queue.h" +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../../feature/powerloss.h" +#endif + +#include "../../../../gcode/gcode.h" +#include "../../../../module/planner.h" + +#if HAS_TRINAMIC_CONFIG + #include "../../../../module/stepper/indirection.h" + #include "../../../../feature/tmc_util.h" +#endif + +static lv_obj_t * scr; +static lv_obj_t *buttonValue = NULL; +static lv_obj_t *labelValue = NULL; + +static char key_value[11] = {0}; +static uint8_t cnt = 0; +static char point_flg = 1; + +#define ID_NUM_KEY1 1 +#define ID_NUM_KEY2 2 +#define ID_NUM_KEY3 3 +#define ID_NUM_KEY4 4 +#define ID_NUM_KEY5 5 +#define ID_NUM_KEY6 6 +#define ID_NUM_KEY7 7 +#define ID_NUM_KEY8 8 +#define ID_NUM_KEY9 9 +#define ID_NUM_KEY0 10 +#define ID_NUM_BACK 11 +#define ID_NUM_RESET 12 +#define ID_NUM_CONFIRM 13 +#define ID_NUM_POINT 14 +#define ID_NUM_NAGETIVE 15 + +static void disp_key_value() { + char *temp; + #if HAS_TRINAMIC_CONFIG + float milliamps; + #endif + + switch (value) { + case PrintAcceleration: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.acceleration); + break; + case RetractAcceleration: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.retract_acceleration); + break; + case TravelAcceleration: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.travel_acceleration); + break; + case XAcceleration: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + break; + case YAcceleration: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + break; + case ZAcceleration: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + break; + case E0Acceleration: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + break; + case E1Acceleration: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); + break; + case XMaxFeedRate: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); + break; + case YMaxFeedRate: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); + break; + case ZMaxFeedRate: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); + break; + case E0MaxFeedRate: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); + break; + case E1MaxFeedRate: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); + break; + + case XJerk: + #if HAS_CLASSIC_JERK + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[X_AXIS]); + #endif + break; + case YJerk: + #if HAS_CLASSIC_JERK + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); + #endif + break; + case ZJerk: + #if HAS_CLASSIC_JERK + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); + #endif + break; + case EJerk: + #if HAS_CLASSIC_JERK + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[E_AXIS]); + #endif + break; + + case Xstep: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); + + break; + case Ystep: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); + + break; + case Zstep: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); + + break; + case E0step: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); + + break; + case E1step: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); + break; + + case Xcurrent: + #if AXIS_IS_TMC(X) + ZERO(public_buf_m); + milliamps = stepperX.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case Ycurrent: + #if AXIS_IS_TMC(Y) + ZERO(public_buf_m); + milliamps = stepperY.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case Zcurrent: + #if AXIS_IS_TMC(Z) + ZERO(public_buf_m); + milliamps = stepperZ.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case E0current: + #if AXIS_IS_TMC(E0) + ZERO(public_buf_m); + milliamps = stepperE0.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case E1current: + #if AXIS_IS_TMC(E1) + ZERO(public_buf_m); + milliamps = stepperE1.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case pause_pos_x: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosX); + break; + case pause_pos_y: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosY); + break; + case pause_pos_z: + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosZ); + break; + } + ZERO(key_value); + strcpy(key_value, public_buf_m); + cnt = strlen(key_value); + temp = strchr(key_value, '.'); + if (temp) + point_flg = 0; + else + point_flg = 1; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + +} + +static void set_value_confirm() { + #if HAS_TRINAMIC_CONFIG + uint16_t current_mA; + #endif + switch (value) { + case PrintAcceleration: + planner.settings.acceleration = atof(key_value); + + break; + case RetractAcceleration: + planner.settings.retract_acceleration = atof(key_value); + + break; + case TravelAcceleration: + planner.settings.travel_acceleration = atof(key_value); + + break; + case XAcceleration: + planner.settings.max_acceleration_mm_per_s2[X_AXIS] = atof(key_value); + break; + case YAcceleration: + planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = atof(key_value); + break; + case ZAcceleration: + planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = atof(key_value); + break; + case E0Acceleration: + planner.settings.max_acceleration_mm_per_s2[E_AXIS] = atof(key_value); + break; + case E1Acceleration: + planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)] = atof(key_value); + break; + case XMaxFeedRate: + planner.settings.max_feedrate_mm_s[X_AXIS] = atof(key_value); + break; + case YMaxFeedRate: + planner.settings.max_feedrate_mm_s[Y_AXIS] = atof(key_value); + break; + case ZMaxFeedRate: + planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value); + break; + case E0MaxFeedRate: + planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value); + break; + case E1MaxFeedRate: + planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); + break; + + case XJerk: + #if HAS_CLASSIC_JERK + planner.max_jerk[X_AXIS] = atof(key_value); + #endif + break; + case YJerk: + #if HAS_CLASSIC_JERK + planner.max_jerk[Y_AXIS] = atof(key_value); + #endif + break; + case ZJerk: + #if HAS_CLASSIC_JERK + planner.max_jerk[Z_AXIS] = atof(key_value); + #endif + break; + case EJerk: + #if HAS_CLASSIC_JERK + planner.max_jerk[E_AXIS] = atof(key_value); + #endif + break; + + case Xstep: + planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value); + break; + case Ystep: + planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value); + break; + case Zstep: + planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value); + break; + case E0step: + planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value); + break; + case E1step: + planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); + break; + + case Xcurrent: + #if AXIS_IS_TMC(X) + current_mA = atoi(key_value); + stepperX.rms_current(current_mA); + #endif + break; + + case Ycurrent: + #if AXIS_IS_TMC(Y) + current_mA = atoi(key_value); + stepperY.rms_current(current_mA); + #endif + break; + + case Zcurrent: + #if AXIS_IS_TMC(Z) + current_mA = atoi(key_value); + stepperZ.rms_current(current_mA); + #endif + break; + + case E0current: + #if AXIS_IS_TMC(E0) + current_mA = atoi(key_value); + stepperE0.rms_current(current_mA); + #endif + break; + + case E1current: + #if AXIS_IS_TMC(E1) + current_mA = atoi(key_value); + stepperE1.rms_current(current_mA); + #endif + break; + + break; + case pause_pos_x: + gCfgItems.pausePosX = atof(key_value); + update_spi_flash(); + break; + case pause_pos_y: + gCfgItems.pausePosY = atof(key_value); + update_spi_flash(); + break; + case pause_pos_z: + gCfgItems.pausePosZ = atof(key_value); + update_spi_flash(); + break; + } + gcode.process_subcommands_now_P(PSTR("M500")); +} + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_NUM_KEY1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'1'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY2: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'2'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY3: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'3'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY4: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'4'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY5: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'5'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY6: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'6'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY7: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'7'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY8: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'8'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY9: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'9'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_KEY0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt <= 10) { + key_value[cnt] = (char)'0'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_BACK: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt > 0) + cnt--; + if (key_value[cnt] == (char)'.') point_flg = 1; + key_value[cnt] = (char)'\0'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + } + break; + case ID_NUM_RESET: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + ZERO(key_value); + cnt = 0; + key_value[cnt] = (char)'0'; + point_flg = 1; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + } + break; + case ID_NUM_POINT: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if ((cnt != 0) && (point_flg == 1)) { + point_flg = 0; + key_value[cnt] = (char)'.'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_NAGETIVE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (cnt == 0) { + key_value[cnt] = (char)'-'; + lv_label_set_text(labelValue, key_value); + lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); + cnt++; + } + } + break; + case ID_NUM_CONFIRM: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + last_disp_state = NUMBER_KEY_UI; + if (strlen(key_value) != 0) + set_value_confirm(); + lv_clear_number_key(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_number_key(void) { + lv_obj_t *NumberKey_1 = NULL, *NumberKey_2 = NULL, *NumberKey_3 = NULL, *NumberKey_4 = NULL, *NumberKey_5 = NULL; + lv_obj_t *NumberKey_6 = NULL, *NumberKey_7 = NULL, *NumberKey_8 = NULL, *NumberKey_9 = NULL, *NumberKey_0 = NULL; + lv_obj_t *KeyPoint = NULL, *KeyConfirm = NULL, *KeyReset = NULL, *KeyBack = NULL; + lv_obj_t *Minus = NULL; + lv_obj_t *labelKey_1 = NULL, *labelKey_2 = NULL, *labelKey_3 = NULL, *labelKey_4 = NULL, *labelKey_5 = NULL; + lv_obj_t *labelKey_6 = NULL, *labelKey_7 = NULL, *labelKey_8 = NULL, *labelKey_9 = NULL, *labelKey_0 = NULL; + lv_obj_t *labelKeyPoint = NULL, *labelKeyConfirm = NULL, *labelKeyReset = NULL, *labelKeyBack = NULL; + lv_obj_t *labelMinus = NULL; + + buttonValue = NULL; + labelValue = NULL; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NUMBER_KEY_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = NUMBER_KEY_UI; + } + disp_state = NUMBER_KEY_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + //lv_obj_t * title = lv_label_create(scr, NULL); + //lv_obj_set_style(title, &tft_style_label_rel); + //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); + //lv_label_set_text(title, creat_title_text()); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + //LV_IMG_DECLARE(bmp_pic); + + buttonValue = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonValue, 92, 40); /*Set its position*/ + lv_obj_set_size(buttonValue, 296, 40); + lv_obj_set_event_cb_mks(buttonValue, event_handler, ID_NUM_KEY1, NULL, 0); + lv_btn_set_style(buttonValue, LV_BTN_STYLE_REL, &style_num_text); /*Set the button's released style*/ + lv_btn_set_style(buttonValue, LV_BTN_STYLE_PR, &style_num_text); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonValue, LV_LAYOUT_OFF); + labelValue = lv_label_create(buttonValue, NULL); /*Add a label to the button*/ + + NumberKey_1 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_1, 92, 90); /*Set its position*/ + lv_obj_set_size(NumberKey_1, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_1, event_handler, ID_NUM_KEY1, NULL, 0); + lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_1, LV_LAYOUT_OFF); + labelKey_1 = lv_label_create(NumberKey_1, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_1, machine_menu.key_1); + lv_obj_align(labelKey_1, NumberKey_1, LV_ALIGN_CENTER, 0, 0); + + NumberKey_2 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_2, 168, 90); /*Set its position*/ + lv_obj_set_size(NumberKey_2, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_2, event_handler, ID_NUM_KEY2, NULL, 0); + lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_2, LV_LAYOUT_OFF); + labelKey_2 = lv_label_create(NumberKey_2, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_2, machine_menu.key_2); + lv_obj_align(labelKey_2, NumberKey_2, LV_ALIGN_CENTER, 0, 0); + + NumberKey_3 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_3, 244, 90); /*Set its position*/ + lv_obj_set_size(NumberKey_3, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_3, event_handler, ID_NUM_KEY3, NULL, 0); + lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_3, LV_LAYOUT_OFF); + labelKey_3 = lv_label_create(NumberKey_3, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_3, machine_menu.key_3); + lv_obj_align(labelKey_3, NumberKey_3, LV_ALIGN_CENTER, 0, 0); + + NumberKey_4 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_4, 92, 140); /*Set its position*/ + lv_obj_set_size(NumberKey_4, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_4, event_handler, ID_NUM_KEY4, NULL, 0); + lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_4, LV_LAYOUT_OFF); + labelKey_4 = lv_label_create(NumberKey_4, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_4, machine_menu.key_4); + lv_obj_align(labelKey_4, NumberKey_4, LV_ALIGN_CENTER, 0, 0); + + NumberKey_5 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_5, 168, 140); /*Set its position*/ + lv_obj_set_size(NumberKey_5, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_5, event_handler, ID_NUM_KEY5, NULL, 0); + lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_5, LV_LAYOUT_OFF); + labelKey_5 = lv_label_create(NumberKey_5, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_5, machine_menu.key_5); + lv_obj_align(labelKey_5, NumberKey_5, LV_ALIGN_CENTER, 0, 0); + + NumberKey_6 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_6, 244, 140); /*Set its position*/ + lv_obj_set_size(NumberKey_6, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_6, event_handler, ID_NUM_KEY6, NULL, 0); + lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_6, LV_LAYOUT_OFF); + labelKey_6 = lv_label_create(NumberKey_6, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_6, machine_menu.key_6); + lv_obj_align(labelKey_6, NumberKey_6, LV_ALIGN_CENTER, 0, 0); + + NumberKey_7 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_7, 92, 190); /*Set its position*/ + lv_obj_set_size(NumberKey_7, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_7, event_handler, ID_NUM_KEY7, NULL, 0); + lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_7, LV_LAYOUT_OFF); + labelKey_7 = lv_label_create(NumberKey_7, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_7, machine_menu.key_7); + lv_obj_align(labelKey_7, NumberKey_7, LV_ALIGN_CENTER, 0, 0); + + NumberKey_8 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_8, 168, 190); /*Set its position*/ + lv_obj_set_size(NumberKey_8, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_8, event_handler, ID_NUM_KEY8, NULL, 0); + lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_8, LV_LAYOUT_OFF); + labelKey_8 = lv_label_create(NumberKey_8, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_8, machine_menu.key_8); + lv_obj_align(labelKey_8, NumberKey_8, LV_ALIGN_CENTER, 0, 0); + + NumberKey_9 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_9, 244, 190); /*Set its position*/ + lv_obj_set_size(NumberKey_9, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_9, event_handler, ID_NUM_KEY9, NULL, 0); + lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_9, LV_LAYOUT_OFF); + labelKey_9 = lv_label_create(NumberKey_9, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_9, machine_menu.key_9); + lv_obj_align(labelKey_9, NumberKey_9, LV_ALIGN_CENTER, 0, 0); + + NumberKey_0 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(NumberKey_0, 92, 240); /*Set its position*/ + lv_obj_set_size(NumberKey_0, 68, 40); + lv_obj_set_event_cb_mks(NumberKey_0, event_handler, ID_NUM_KEY0, NULL, 0); + lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(NumberKey_0, LV_LAYOUT_OFF); + labelKey_0 = lv_label_create(NumberKey_0, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKey_0, machine_menu.key_0); + lv_obj_align(labelKey_0, NumberKey_0, LV_ALIGN_CENTER, 0, 0); + + KeyBack = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(KeyBack, 320, 90); /*Set its position*/ + lv_obj_set_size(KeyBack, 68, 40); + lv_obj_set_event_cb_mks(KeyBack, event_handler, ID_NUM_BACK, NULL, 0); + lv_btn_set_style(KeyBack, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(KeyBack, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(KeyBack, LV_LAYOUT_OFF); + labelKeyBack = lv_label_create(KeyBack, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKeyBack, machine_menu.key_back); + lv_obj_align(labelKeyBack, KeyBack, LV_ALIGN_CENTER, 0, 0); + + KeyReset = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(KeyReset, 320, 140); /*Set its position*/ + lv_obj_set_size(KeyReset, 68, 40); + lv_obj_set_event_cb_mks(KeyReset, event_handler, ID_NUM_RESET, NULL, 0); + lv_btn_set_style(KeyReset, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(KeyReset, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(KeyReset, LV_LAYOUT_OFF); + labelKeyReset = lv_label_create(KeyReset, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKeyReset, machine_menu.key_reset); + lv_obj_align(labelKeyReset, KeyReset, LV_ALIGN_CENTER, 0, 0); + + KeyConfirm = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(KeyConfirm, 320, 190); /*Set its position*/ + lv_obj_set_size(KeyConfirm, 68, 90); + lv_obj_set_event_cb_mks(KeyConfirm, event_handler, ID_NUM_CONFIRM, NULL, 0); + lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(KeyConfirm, LV_LAYOUT_OFF); + labelKeyConfirm = lv_label_create(KeyConfirm, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKeyConfirm, machine_menu.key_confirm); + lv_obj_align(labelKeyConfirm, KeyConfirm, LV_ALIGN_CENTER, 0, 0); + + KeyPoint = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(KeyPoint, 244, 240); /*Set its position*/ + lv_obj_set_size(KeyPoint, 68, 40); + lv_obj_set_event_cb_mks(KeyPoint, event_handler, ID_NUM_POINT, NULL, 0); + lv_btn_set_style(KeyPoint, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(KeyPoint, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(KeyPoint, LV_LAYOUT_OFF); + labelKeyPoint = lv_label_create(KeyPoint, NULL); /*Add a label to the button*/ + lv_label_set_text(labelKeyPoint, machine_menu.key_point); + lv_obj_align(labelKeyPoint, KeyPoint, LV_ALIGN_CENTER, 0, 0); + + Minus = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(Minus, 168, 240); /*Set its position*/ + lv_obj_set_size(Minus, 68, 40); + lv_obj_set_event_cb_mks(Minus, event_handler, ID_NUM_NAGETIVE, NULL, 0); + lv_btn_set_style(Minus, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ + lv_btn_set_style(Minus, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ + lv_btn_set_layout(Minus, LV_LAYOUT_OFF); + labelMinus = lv_label_create(Minus, NULL); /*Add a label to the button*/ + lv_label_set_text(labelMinus, machine_menu.negative); + lv_obj_align(labelMinus, Minus, LV_ALIGN_CENTER, 0, 0); + + disp_key_value(); +} + +void lv_clear_number_key() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h new file mode 100644 index 000000000000..d35cee63439c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_number_key(void); +extern void lv_clear_number_key(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp similarity index 81% rename from Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp rename to Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index 1a423efdaa81..ad8cad03e0c3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" @@ -53,7 +53,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_clear_opration(); + lv_clear_operation(); lv_draw_preHeat(); } break; @@ -62,7 +62,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_clear_opration(); + lv_clear_operation(); lv_draw_extrusion(); } break; @@ -71,7 +71,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_clear_opration(); + lv_clear_operation(); lv_draw_move_motor(); } break; @@ -87,7 +87,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_clear_opration(); + lv_clear_operation(); lv_draw_fan(); } break; @@ -96,7 +96,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - lv_clear_opration(); + lv_clear_operation(); lv_draw_change_speed(); } break; @@ -116,7 +116,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (gCfgItems.finish_power_off == 1) { gCfgItems.finish_power_off = 0; - lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0); //dindt find bmp_Mamual... + lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0); // didn't find bmp_Mamual... lv_label_set_text(label_PowerOff, printing_more_menu.manual); lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_obj_refresh_ext_draw_pad(label_PowerOff); @@ -136,7 +136,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } -void lv_draw_opration(void) { +void lv_draw_operation(void) { lv_obj_t *buttonPreHeat, *buttonExtrusion, *buttonSpeed; lv_obj_t *buttonBack, *buttonFan; lv_obj_t *labelPreHeat, *labelExtrusion; @@ -156,7 +156,7 @@ void lv_draw_opration(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -165,57 +165,59 @@ void lv_draw_opration(void) { LV_IMG_DECLARE(bmp_pic); /*Create an Image button*/ - buttonPreHeat = lv_imgbtn_create(scr, NULL); + buttonPreHeat = lv_imgbtn_create(scr, NULL); buttonExtrusion = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, NULL); - buttonSpeed = lv_imgbtn_create(scr, NULL); + buttonFan = lv_imgbtn_create(scr, NULL); + buttonSpeed = lv_imgbtn_create(scr, NULL); - if (uiCfg.print_state != WORKING) + if (uiCfg.print_state != WORKING) { //buttonFilament = lv_imgbtn_create(scr, NULL); - //else + //} else { buttonMove = lv_imgbtn_create(scr, NULL); + } + buttonPowerOff = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_O_PRE_HEAT, "bmp_PreHeat.bin", 0); + lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_O_PRE_HEAT, "bmp_temp.bin", 0); lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonPreHeat, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_O_EXTRUCT, "bmp_Extruct.bin", 0); + lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_O_EXTRUCT, "bmp_extrude_opr.bin", 0); lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_O_FAN, "bmp_Fan.bin", 0); + lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_O_FAN, "bmp_fan.bin", 0); lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_O_SPEED, "bmp_Speed.bin", 0); + lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_O_SPEED, "bmp_speed.bin", 0); lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); if (uiCfg.print_state != WORKING) { - /*{ - lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_O_FILAMENT,"bmp_Filamentchange.bin",0); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_lable_rel); - } - else*/ - lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_O_MOV, "bmp_Mov.bin", 0); + /* + lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_O_FILAMENT,"bmp_Filamentchange.bin",0); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic); + lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); + } else { + */ + lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_O_MOV, "bmp_move_opr.bin", 0); lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); } if (gCfgItems.finish_power_off == 1) lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_auto_off.bin", 0); @@ -223,15 +225,15 @@ void lv_draw_opration(void) { lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_manual_off.bin", 0); lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_O_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_O_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); - #endif + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonExtrusion, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); @@ -240,17 +242,17 @@ void lv_draw_opration(void) { lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); if (uiCfg.print_state != WORKING) { - /*{ - lv_obj_set_pos(buttonFilament,INTERVAL_V,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - } - else*/ + /* + lv_obj_set_pos(buttonFilament,INTERVAL_V,BTN_Y_PIXEL+INTERVAL_H+titleHeight); + } else { + */ lv_obj_set_pos(buttonMove, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonPowerOff, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); } else { lv_obj_set_pos(buttonPowerOff, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); } - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); @@ -258,27 +260,29 @@ void lv_draw_opration(void) { lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); - if (uiCfg.print_state != WORKING) - /*{ - lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); - } - else*/ + if (uiCfg.print_state != WORKING) { + /* + lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); + } else { + */ lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); + } lv_btn_set_layout(buttonPowerOff, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - labelPreHeat = lv_label_create(buttonPreHeat, NULL); + labelPreHeat = lv_label_create(buttonPreHeat, NULL); labelExtrusion = lv_label_create(buttonExtrusion, NULL); - label_Fan = lv_label_create(buttonFan, NULL); + label_Fan = lv_label_create(buttonFan, NULL); label_Speed = lv_label_create(buttonSpeed, NULL); - if (uiCfg.print_state != WORKING) - /*{ - label_Filament = lv_label_create(buttonFilament, NULL); + if (uiCfg.print_state != WORKING) { + /* + label_Filament = lv_label_create(buttonFilament, NULL); + } else { + */ + label_Move = lv_label_create(buttonMove, NULL); } - else*/ - label_Move = lv_label_create(buttonMove, NULL); label_PowerOff = lv_label_create(buttonPowerOff, NULL); label_Back = lv_label_create(buttonBack, NULL); @@ -297,11 +301,11 @@ void lv_draw_opration(void) { lv_obj_align(label_Speed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); if (uiCfg.print_state != WORKING) { - /*{ - lv_label_set_text(label_Filament, operation_menu.filament); - lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - } - else*/ + /* + lv_label_set_text(label_Filament, operation_menu.filament); + lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + } else { + */ lv_label_set_text(label_Move, operation_menu.move); lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } @@ -317,6 +321,6 @@ void lv_draw_opration(void) { } } -void lv_clear_opration() { lv_obj_del(scr); } +void lv_clear_operation() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h similarity index 93% rename from Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h rename to Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h index 8ca562f0cfe0..e2eaaf06a499 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_opration(void); -extern void lv_clear_opration(); +extern void lv_draw_operation(void); +extern void lv_clear_operation(); //extern void disp_temp_ready_print(); #ifdef __cplusplus diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp index f66898b7925b..f7dd2060b8f6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if BOTH(TFT_LVGL_UI, ADVANCED_PAUSE_FEATURE) +#if BOTH(HAS_TFT_LVGL_UI, ADVANCED_PAUSE_FEATURE) #include "draw_ui.h" #include "lv_conf.h" @@ -52,4 +52,4 @@ void lv_draw_pause_message(const PauseMessage msg) { } } -#endif // TFT_LVGL_UI && ADVANCED_PAUSE_FEATURE +#endif // HAS_TFT_LVGL_UI && ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp new file mode 100644 index 000000000000..56caf812b1f9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -0,0 +1,222 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" + +static lv_obj_t * scr; + +#define ID_PAUSE_RETURN 1 +#define ID_PAUSE_X 2 +#define ID_PAUSE_Y 3 +#define ID_PAUSE_Z 4 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_PAUSE_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_pause_position(); + draw_return_ui(); + } + break; + case ID_PAUSE_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = pause_pos_x; + lv_clear_pause_position(); + lv_draw_number_key(); + } + break; + case ID_PAUSE_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = pause_pos_y; + lv_clear_pause_position(); + lv_draw_number_key(); + } + break; + case ID_PAUSE_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = pause_pos_z; + lv_clear_pause_position(); + lv_draw_number_key(); + } + break; + } +} + +void lv_draw_pause_position(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PAUSE_POS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = PAUSE_POS_UI; + } + disp_state = PAUSE_POS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.PausePosText); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + // LV_IMG_DECLARE(bmp_para_arrow); + LV_IMG_DECLARE(bmp_para_bank); + + buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonXText, event_handler); + lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); + labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + + buttonXValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_PAUSE_X, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonYText, event_handler); + lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); + labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + + buttonYValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_PAUSE_Y, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonZText, event_handler); + lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); + labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + + buttonZValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_PAUSE_Z, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PAUSE_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosY); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosZ); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelXText, machine_menu.xPos); + lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelYText, machine_menu.yPos); + lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelZText, machine_menu.zPos); + lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_pause_position() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h new file mode 100644 index 000000000000..5f1b4dc96091 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_pause_position(void); +extern void lv_clear_pause_position(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 82defbebde82..801114e6b2ea 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" @@ -58,29 +58,24 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { if (uiCfg.curSprayerChoose == 0) { if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } } #if !defined(SINGLENOZZLE) && EXTRUDERS >= 2 - else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } + else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } #endif } #if HAS_HEATED_BED - else { - - thermalManager.temp_bed.target += uiCfg.stepHeat; - - if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { - thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); - thermalManager.start_watching_bed(); + else { + thermalManager.temp_bed.target += uiCfg.stepHeat; + if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { + thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); + thermalManager.start_watching_bed(); + } } - - } #endif disp_desire_temp(); } @@ -101,16 +96,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } #if HAS_HEATED_BED - else { - if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) { - thermalManager.temp_bed.target -= uiCfg.stepHeat; - thermalManager.start_watching_bed(); - } else { - thermalManager.temp_bed.target = (float)0; - thermalManager.start_watching_bed(); + if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) { + thermalManager.temp_bed.target -= uiCfg.stepHeat; + thermalManager.start_watching_bed(); + } + else { + thermalManager.temp_bed.target = (float)0; + thermalManager.start_watching_bed(); + } } - } #endif disp_desire_temp(); } @@ -131,12 +126,12 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { uiCfg.curTempType = 1; } else { - uiCfg.curTempType = 0; + uiCfg.curTempType = 0; uiCfg.curSprayerChoose = 0; } } } - else if (uiCfg.curSprayerChoose == 0) { + else if (uiCfg.curSprayerChoose == 0) { if (TEMP_SENSOR_BED != 0) uiCfg.curTempType = 1; else @@ -145,7 +140,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (uiCfg.curTempType == 1) { uiCfg.curSprayerChoose = 0; - uiCfg.curTempType = 0; + uiCfg.curTempType = 0; } disp_temp_type(); } @@ -174,10 +169,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); } #if HAS_HEATED_BED - else { - thermalManager.temp_bed.target = (float)0; - thermalManager.start_watching_bed(); - } + else { + thermalManager.temp_bed.target = (float)0; + thermalManager.start_watching_bed(); + } #endif disp_desire_temp(); } @@ -211,7 +206,7 @@ void lv_draw_preHeat(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -220,57 +215,57 @@ void lv_draw_preHeat(void) { LV_IMG_DECLARE(bmp_pic); /*Create an Image button*/ - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttoType = lv_imgbtn_create(scr, NULL); + buttonAdd = lv_imgbtn_create(scr, NULL); + buttonDec = lv_imgbtn_create(scr, NULL); + buttoType = lv_imgbtn_create(scr, NULL); buttonStep = lv_imgbtn_create(scr, NULL); - buttonOff = lv_imgbtn_create(scr, NULL); + buttonOff = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_P_ADD, "bmp_Add.bin", 0); lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); #if 1 lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_P_DEC, "bmp_Dec.bin", 0); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_P_OFF, "bmp_Speed0.bin", 0); + lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_P_OFF, "bmp_speed0.bin", 0); lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); lv_obj_set_pos(buttonStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); @@ -284,7 +279,7 @@ void lv_draw_preHeat(void) { lv_obj_t * labelDec = lv_label_create(buttonDec, NULL); labelType = lv_label_create(buttoType, NULL); labelStep = lv_label_create(buttonStep, NULL); - lv_obj_t * labelOff = lv_label_create(buttonOff, NULL); + lv_obj_t * labelOff = lv_label_create(buttonOff, NULL); lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); @@ -306,7 +301,7 @@ void lv_draw_preHeat(void) { disp_step_heat(); tempText1 = lv_label_create(scr, NULL); - lv_obj_set_style(tempText1, &tft_style_lable_rel); + lv_obj_set_style(tempText1, &tft_style_label_rel); disp_desire_temp(); } @@ -314,14 +309,14 @@ void disp_temp_type() { if (uiCfg.curTempType == 0) { if (uiCfg.curSprayerChoose == 1) { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_Extru2.bin", 0); + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_extru2.bin", 0); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, preheat_menu.ext2); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } } else { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_Extru1.bin", 0); + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_extru1.bin", 0); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, preheat_menu.ext1); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -330,7 +325,7 @@ void disp_temp_type() { } else { - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_Bed.bin", 0); + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_bed.bin", 0); if (gCfgItems.multiple_language != 0) { lv_label_set_text(labelType, preheat_menu.hotbed); lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -352,12 +347,12 @@ void disp_desire_temp() { sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); } #if HAS_HEATED_BED - else { - strcat(public_buf_l, preheat_menu.hotbed); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); - } + else { + strcat(public_buf_l, preheat_menu.hotbed); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); + } #endif - strcat(public_buf_l, ": "); + strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); lv_label_set_text(tempText1, public_buf_l); lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); @@ -365,11 +360,11 @@ void disp_desire_temp() { void disp_step_heat() { if (uiCfg.stepHeat == 1) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_Step1_degree.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_step1_degree.bin", 0); else if (uiCfg.stepHeat == 5) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_Step5_degree.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_step5_degree.bin", 0); else if (uiCfg.stepHeat == 10) - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_Step10_degree.bin", 0); + lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_step10_degree.bin", 0); if (gCfgItems.multiple_language != 0) { if (uiCfg.stepHeat == 1) { @@ -389,4 +384,4 @@ void disp_step_heat() { void lv_clear_preHeat() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 345b15882ba0..84853cff9d09 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "../../../../MarlinCore.h" #include "lv_conf.h" @@ -34,9 +34,8 @@ static lv_obj_t * scr; -static lv_obj_t *buttonPageUp, *buttonPageDown, *buttonBack, *buttonGcode[FILE_BTN_CNT]; -static lv_obj_t * labelPageUp[FILE_BTN_CNT]; -static lv_obj_t *buttonText[FILE_BTN_CNT]; +static lv_obj_t *buttonPageUp, *buttonPageDown, *buttonBack, + *buttonGcode[FILE_BTN_CNT], *labelPageUp[FILE_BTN_CNT], *buttonText[FILE_BTN_CNT]; #define ID_P_UP 7 #define ID_P_DOWN 8 @@ -53,64 +52,62 @@ uint8_t sel_id = 0; #if ENABLED(SDSUPPORT) -static uint8_t search_file() { - int valid_name_cnt = 0; - //char tmp[SHORT_NEME_LEN*MAX_DIR_LEVEL+1]; + static uint8_t search_file() { + int valid_name_cnt = 0; + //char tmp[SHORT_NEME_LEN*MAX_DIR_LEVEL+1]; - list_file.Sd_file_cnt = 0; - //list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; + list_file.Sd_file_cnt = 0; + //list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - //root2.rewind(); - //SERIAL_ECHOLN(list_file.curDirPath); + //root2.rewind(); + //SERIAL_ECHOLN(list_file.curDirPath); - if (curDirLever != 0) card.cd(list_file.curDirPath); - else card.cdroot(); //while(card.cdup()); + if (curDirLever != 0) card.cd(list_file.curDirPath); + else card.cdroot(); // while(card.cdup()); - const uint16_t fileCnt = card.get_num_Files(); + const uint16_t fileCnt = card.get_num_Files(); - for (uint16_t i = 0; i < fileCnt; i++) { - if (list_file.Sd_file_cnt == list_file.Sd_file_offset) { - const uint16_t nr = SD_ORDER(i, fileCnt); - card.getfilename_sorted(nr); + for (uint16_t i = 0; i < fileCnt; i++) { + if (list_file.Sd_file_cnt == list_file.Sd_file_offset) { + const uint16_t nr = SD_ORDER(i, fileCnt); + card.getfilename_sorted(nr); - if (card.flag.filenameIsDir) - /* - SERIAL_ECHOLN(card.longest_filename); - */ - list_file.IsFolder[valid_name_cnt] = 1; - else - //SERIAL_ECHOLN(card.longFilename); - list_file.IsFolder[valid_name_cnt] = 0; - - #if 1 - // - memset(list_file.file_name[valid_name_cnt], 0, strlen(list_file.file_name[valid_name_cnt])); - strcpy(list_file.file_name[valid_name_cnt], list_file.curDirPath); - strcat(list_file.file_name[valid_name_cnt], "/"); - strcat(list_file.file_name[valid_name_cnt], card.filename); - // - memset(list_file.long_name[valid_name_cnt], 0, strlen(list_file.long_name[valid_name_cnt])); - if (card.longFilename[0] == 0) - strncpy(list_file.long_name[valid_name_cnt], card.filename, strlen(card.filename)); + if (card.flag.filenameIsDir) + //SERIAL_ECHOLN(card.longest_filename); + list_file.IsFolder[valid_name_cnt] = 1; else - strncpy(list_file.long_name[valid_name_cnt], card.longFilename, strlen(card.longFilename)); - - valid_name_cnt++; - if (valid_name_cnt == 1) - dir_offset[curDirLever].cur_page_first_offset = list_file.Sd_file_offset; - if (valid_name_cnt >= FILE_NUM) { - dir_offset[curDirLever].cur_page_last_offset = list_file.Sd_file_offset; + //SERIAL_ECHOLN(card.longFilename); + list_file.IsFolder[valid_name_cnt] = 0; + + #if 1 + // + memset(list_file.file_name[valid_name_cnt], 0, strlen(list_file.file_name[valid_name_cnt])); + strcpy(list_file.file_name[valid_name_cnt], list_file.curDirPath); + strcat_P(list_file.file_name[valid_name_cnt], PSTR("/")); + strcat(list_file.file_name[valid_name_cnt], card.filename); + // + memset(list_file.long_name[valid_name_cnt], 0, strlen(list_file.long_name[valid_name_cnt])); + if (card.longFilename[0] == 0) + strncpy(list_file.long_name[valid_name_cnt], card.filename, strlen(card.filename)); + else + strncpy(list_file.long_name[valid_name_cnt], card.longFilename, strlen(card.longFilename)); + + valid_name_cnt++; + if (valid_name_cnt == 1) + dir_offset[curDirLever].cur_page_first_offset = list_file.Sd_file_offset; + if (valid_name_cnt >= FILE_NUM) { + dir_offset[curDirLever].cur_page_last_offset = list_file.Sd_file_offset; + list_file.Sd_file_offset++; + break; + } list_file.Sd_file_offset++; - break; - } - list_file.Sd_file_offset++; - #endif + #endif + } + list_file.Sd_file_cnt++; } - list_file.Sd_file_cnt++; + //card.closefile(false); + return valid_name_cnt; } - //card.closefile(false); - return valid_name_cnt; -} #endif // SDSUPPORT @@ -147,7 +144,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (dir_offset[curDirLever].curPage > 0) { - //2015.05.19 + // 2015.05.19 list_file.Sd_file_cnt = 0; if (dir_offset[curDirLever].cur_page_first_offset >= FILE_NUM) @@ -169,7 +166,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } else if (event == LV_EVENT_RELEASED) { if (dir_offset[curDirLever].cur_page_last_offset > 0) { - list_file.Sd_file_cnt = 0; + list_file.Sd_file_cnt = 0; list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_last_offset + 1; #if ENABLED(SDSUPPORT) file_count = search_file(); @@ -195,9 +192,9 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { #if ENABLED(SDSUPPORT) card.cdup(); #endif - dir_offset[curDirLever].curPage = 0; + dir_offset[curDirLever].curPage = 0; dir_offset[curDirLever].cur_page_first_offset = 0; - dir_offset[curDirLever].cur_page_last_offset = 0; + dir_offset[curDirLever].cur_page_last_offset = 0; curDirLever--; list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; #if ENABLED(SDSUPPORT) @@ -221,7 +218,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (list_file.file_name[i][0] != 0) { if (list_file.IsFolder[i] == 1) { - memset(list_file.curDirPath, 0, sizeof(list_file.curDirPath)); + ZERO(list_file.curDirPath); strcpy(list_file.curDirPath, list_file.file_name[i]); curDirLever++; list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; @@ -253,11 +250,11 @@ void lv_draw_print_file(void) { } disp_state = PRINT_FILE_UI; - curDirLever = 0; + curDirLever = 0; dir_offset[curDirLever].curPage = 0; list_file.Sd_file_offset = 0; - list_file.Sd_file_cnt = 0; + list_file.Sd_file_cnt = 0; ZERO(dir_offset); ZERO(list_file.IsFolder); @@ -300,35 +297,35 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); lv_refr_now(lv_refr_get_disp_refreshing()); - buttonPageUp = lv_imgbtn_create(scr, NULL); + buttonPageUp = lv_imgbtn_create(scr, NULL); buttonPageDown = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonPageUp, event_handler, ID_P_UP, "bmp_pageUp.bin", 0); lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_REL, &bmp_pic_117x92); lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_PR, &bmp_pic_117x92); - lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonPageUp, LV_PROTECT_FOLLOW); #if 1 lv_obj_set_event_cb_mks(buttonPageDown, event_handler, ID_P_DOWN, "bmp_pageDown.bin", 0); lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_REL, &bmp_pic_117x92); lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_PR, &bmp_pic_117x92); - lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_back.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic_117x92); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic_117x92); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); #endif lv_obj_set_pos(buttonPageUp, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight); @@ -343,7 +340,7 @@ void disp_gcode_icon(uint8_t file_num) { for (i = 0; i < FILE_BTN_CNT; i++) { /* - if(seq) { + if (seq) { j = (FILE_BTN_CNT-1) - i; back_flg = 1; } @@ -357,8 +354,8 @@ void disp_gcode_icon(uint8_t file_num) { #ifdef TFT35 buttonGcode[i] = lv_imgbtn_create(scr, NULL); - lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonGcode[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonGcode[i], LV_LAYOUT_OFF); @@ -366,7 +363,7 @@ void disp_gcode_icon(uint8_t file_num) { cutFileName((char *)list_file.long_name[i], 16, 8, (char *)public_buf_m); if (list_file.IsFolder[i] == 1) { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "bmp_Dir.bin", 0); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "bmp_dir.bin", 0); lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, &bmp_pic); if (i < 3) @@ -375,7 +372,7 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight); labelPageUp[i] = lv_label_create(buttonGcode[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_lable_rel); + lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); lv_label_set_text(labelPageUp[i], public_buf_m); lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5); } @@ -389,10 +386,10 @@ void disp_gcode_icon(uint8_t file_num) { buttonText[i] = lv_btn_create(scr, NULL); //lv_obj_set_event_cb(buttonText[i], event_handler); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_lable_rel); - //lv_obj_set_style(buttonText[i], &tft_style_lable_pre); - //lv_obj_set_style(buttonText[i], &tft_style_lable_rel); + lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_label_pre); + lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); + //lv_obj_set_style(buttonText[i], &tft_style_label_pre); + //lv_obj_set_style(buttonText[i], &tft_style_label_rel); lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0); @@ -406,10 +403,10 @@ void disp_gcode_icon(uint8_t file_num) { buttonText[i] = lv_btn_create(scr, NULL); //lv_obj_set_event_cb(buttonText[i], event_handler); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_label_pre); + lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_imgbtn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_lable_rel); + //lv_imgbtn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0); @@ -419,12 +416,12 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_set_size(buttonText[i], 100, 40); } labelPageUp[i] = lv_label_create(buttonText[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_lable_rel); + lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); lv_label_set_text(labelPageUp[i], public_buf_m); lv_obj_align(labelPageUp[i], buttonText[i], LV_ALIGN_IN_BOTTOM_MID, 0, 0); } else { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "bmp_File.bin", 0); + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "bmp_file.bin", 0); lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, &bmp_pic); if (i < 3) @@ -433,27 +430,38 @@ void disp_gcode_icon(uint8_t file_num) { lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight); labelPageUp[i] = lv_label_create(buttonGcode[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_lable_rel); + lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); lv_label_set_text(labelPageUp[i], public_buf_m); lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5); } } - #else // ifdef TFT35 - #endif // ifdef TFT35 + #else // !TFT35 + #endif // !TFT35 } } void lv_open_gcode_file(char *path) { #if ENABLED(SDSUPPORT) + uint32_t *ps4; + int pre_sread_cnt; char *cur_name; + cur_name = strrchr(path, '/'); + card.openFileRead(cur_name); - #endif + card.read(public_buf, 512); + ps4 = (uint32_t *)strstr((char *)public_buf, ";simage:"); + // Ignore the beginning message of gcode file + if (ps4) { + pre_sread_cnt = (uint32_t)ps4 - (uint32_t)((uint32_t *)(&public_buf[0])); + card.setIndex(pre_sread_cnt); + } + #endif // SDSUPPORT } + int ascii2dec_test(char *ascii) { int result = 0; - if (ascii == 0) return 0; if (*(ascii) >= '0' && *(ascii) <= '9') @@ -468,64 +476,58 @@ int ascii2dec_test(char *ascii) { return result; } -void lv_gcode_file_read(uint8_t *data_buf) -{ - #if ENABLED (SDSUPPORT) - uint16_t i=0,j=0,k=0; - uint16_t row_1=0; +void lv_gcode_file_read(uint8_t *data_buf) { + #if ENABLED(SDSUPPORT) + uint16_t i = 0, j = 0, k = 0; + uint16_t row_1 = 0; bool ignore_start = true; char temp_test[200]; volatile uint16_t *p_index; memset(public_buf, 0, 200); - while(card.isFileOpen()) - { - if (ignore_start) card.read(temp_test, 8); //line start -> ignore - card.read(temp_test, 200); //data - //\r;;gimage: we got the bit img, so stop here + while (card.isFileOpen()) { + if (ignore_start) card.read(temp_test, 8); // line start -> ignore + card.read(temp_test, 200); // data + // \r;;gimage: we got the bit img, so stop here if (temp_test[1] == ';') { card.closefile(); break; } - for(i=0;i<200;) { - public_buf[row_1*200+100*k+j] = (char)(ascii2dec_test(&temp_test[i])<<4|ascii2dec_test(&temp_test[i+1])); + for (i = 0; i < 200;) { + public_buf[row_1 * 200 + 100 * k + j] = (char)(ascii2dec_test(&temp_test[i]) << 4 | ascii2dec_test(&temp_test[i + 1])); j++; - i+=2; + i += 2; } uint16_t c = card.get(); - //check if we have more data or finished the line (CR) - if (c == '\r') { - break; - } + // check if we have more data or finished the line (CR) + if (c == '\r') break; card.setIndex(card.getIndex()); k++; - j=0; + j = 0; ignore_start = false; } - #if ENABLED(SPI_GRAPHICAL_TFT) - for(i=0;i<200;) - { + #if ENABLED(TFT_LVGL_UI_SPI) + for (i = 0; i < 200;) { p_index = (uint16_t *)(&public_buf[i]); - //Color = (*p_index >> 8); + //Color = (*p_index >> 8); //*p_index = Color | ((*p_index & 0xff) << 8); - i+=2; - if(*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; + i += 2; + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; } #else - for(i=0;i<200;) - { + for (i = 0; i < 200;) { p_index = (uint16_t *)(&public_buf[i]); //Color = (*p_index >> 8); //*p_index = Color | ((*p_index & 0xff) << 8); - i+=2; - if(*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; // 0x18C3; // + i += 2; + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // 0x18C3; // } - #endif - memcpy(data_buf,public_buf,200); - #endif + #endif // TFT_LVGL_UI_SPI + memcpy(data_buf, public_buf, 200); + #endif // SDSUPPORT } void lv_close_gcode_file() {TERN_(SDSUPPORT, card.closefile());} @@ -534,7 +536,7 @@ void cutFileName(char *path, int len, int bytePerLine, char *outStr) { #if _LFN_UNICODE TCHAR *tmpFile; TCHAR *strIndex1 = 0, *strIndex2 = 0, *beginIndex; - TCHAR secSeg[10] = {0}; + TCHAR secSeg[10] = {0}; TCHAR gFileTail[4] = {'~', '.', 'g', '\0'}; #else char *tmpFile; @@ -570,7 +572,7 @@ void cutFileName(char *path, int len, int bytePerLine, char *outStr) { strcpy(outStr, beginIndex); #endif } - else { //gcode file + else { // gcode file if (strIndex2 - beginIndex > (len - 2)) { #if _LFN_UNICODE wcsncpy(outStr, (const WCHAR *)beginIndex, len - 3); @@ -578,7 +580,7 @@ void cutFileName(char *path, int len, int bytePerLine, char *outStr) { #else //strncpy(outStr, beginIndex, len - 3); strncpy(outStr, beginIndex, len - 4); - strcat(outStr, "~.g"); + strcat_P(outStr, PSTR("~.g")); #endif } else { @@ -587,7 +589,7 @@ void cutFileName(char *path, int len, int bytePerLine, char *outStr) { wcscat(outStr, (const WCHAR *)&gFileTail[3]); #else strncpy(outStr, beginIndex, strIndex2 - beginIndex + 1); - strcat(outStr, "g"); + strcat_P(outStr, PSTR("g")); #endif } } @@ -595,23 +597,23 @@ void cutFileName(char *path, int len, int bytePerLine, char *outStr) { #if _LFN_UNICODE if (wcslen(outStr) > bytePerLine) { wcscpy(secSeg, (const WCHAR *)&outStr[bytePerLine]); - outStr[bytePerLine] = '\n'; + outStr[bytePerLine] = '\n'; outStr[bytePerLine + 1] = '\0'; wcscat(outStr, (const WCHAR *)secSeg); } #else if ((int)strlen(outStr) > bytePerLine) { strcpy(secSeg, &outStr[bytePerLine]); - outStr[bytePerLine] = '\n'; + outStr[bytePerLine] = '\n'; outStr[bytePerLine + 1] = '\0'; strcat(outStr, secSeg); } else { - strcat(outStr, "\n"); + strcat_P(outStr, PSTR("\n")); } #endif } void lv_clear_print_file() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index daf950703104..2079ed824560 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" @@ -53,7 +53,7 @@ static lv_obj_t * buttonPause, *buttonOperat, *buttonStop; static lv_obj_t* labelBed; #endif -#define ID_PAUSE 1 +#define ID_PAUSE 1 #define ID_STOP 2 #define ID_OPTION 3 @@ -74,36 +74,36 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (gcode_preview_over != 1) { if (uiCfg.print_state == WORKING) { - //#if ENABLED(PARK_HEAD_ON_PAUSE) - //queue.inject_P(PSTR("M25 P\nM24")); + // #if ENABLED(PARK_HEAD_ON_PAUSE) + // queue.inject_P(PSTR("M25 P\nM24")); #if ENABLED(SDSUPPORT) - //queue.inject_P(PSTR("M25\nG91\nG1 Z10\nG90")); + // queue.inject_P(PSTR("M25\nG91\nG1 Z10\nG90")); card.pauseSDPrint(); stop_print_time(); uiCfg.print_state = PAUSING; #endif - lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_Pause.bin", 0); + lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_resume.bin", 0); lv_label_set_text(labelPause, printing_menu.resume); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); } else if (uiCfg.print_state == PAUSED) { uiCfg.print_state = RESUMING; - //if (IS_SD_PAUSED())queue.inject_P(PSTR("M24"));// queue.inject_P(M24_STR); - lv_obj_set_event_cb_mks(obj, event_handler, ID_PAUSE, "bmp_Resume.bin", 0); + // if (IS_SD_PAUSED())queue.inject_P(PSTR("M24"));// queue.inject_P(M24_STR); + lv_obj_set_event_cb_mks(obj, event_handler, ID_PAUSE, "bmp_pause.bin", 0); lv_label_set_text(labelPause, printing_menu.pause); lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); } #if ENABLED(POWER_LOSS_RECOVERY) - else if (uiCfg.print_state == REPRINTING) { - uiCfg.print_state = REPRINTED; - lv_obj_set_event_cb_mks(obj, event_handler, ID_PAUSE, "bmp_Resume.bin", 0); - lv_label_set_text(labelPause, printing_menu.pause); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); - //recovery.resume(); - print_time.minutes = recovery.info.print_job_elapsed / 60; - print_time.seconds = recovery.info.print_job_elapsed % 60; - print_time.hours = print_time.minutes / 60; - } + else if (uiCfg.print_state == REPRINTING) { + uiCfg.print_state = REPRINTED; + lv_obj_set_event_cb_mks(obj, event_handler, ID_PAUSE, "bmp_pause.bin", 0); + lv_label_set_text(labelPause, printing_menu.pause); + lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); + // recovery.resume(); + print_time.minutes = recovery.info.print_job_elapsed / 60; + print_time.seconds = recovery.info.print_job_elapsed % 60; + print_time.hours = print_time.minutes / 60; + } #endif } } @@ -127,7 +127,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { else if (event == LV_EVENT_RELEASED) { if (gcode_preview_over != 1) { lv_obj_del(scr); - lv_draw_opration(); + lv_draw_operation(); } } break; @@ -146,14 +146,14 @@ void lv_draw_printing(void) { scr = lv_obj_create(NULL, NULL); - //static lv_style_t tool_style; + // static lv_style_t tool_style; lv_obj_set_style(scr, &tft_style_scr); lv_scr_load(scr); lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -172,74 +172,74 @@ void lv_draw_printing(void) { #endif buttonFanstate = lv_imgbtn_create(scr, NULL); - buttonZpos = lv_imgbtn_create(scr, NULL); - buttonPause = lv_imgbtn_create(scr, NULL); - buttonStop = lv_imgbtn_create(scr, NULL); - buttonOperat = lv_imgbtn_create(scr, NULL); - buttonTime = lv_imgbtn_create(scr, NULL); + buttonZpos = lv_imgbtn_create(scr, NULL); + buttonPause = lv_imgbtn_create(scr, NULL); + buttonStop = lv_imgbtn_create(scr, NULL); + buttonOperat = lv_imgbtn_create(scr, NULL); + buttonTime = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonExt1, event_handler, 0, "bmp_Ext1_state.bin", 0); + lv_obj_set_event_cb_mks(buttonExt1, event_handler, 0, "bmp_ext1_state.bin", 0); lv_imgbtn_set_src(buttonExt1, LV_BTN_STATE_REL, &bmp_pic_45x45); lv_imgbtn_set_src(buttonExt1, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonExt1, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonExt1, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonExt1, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonExt1, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonExt1, LV_PROTECT_FOLLOW); #if 1 - if (EXTRUDERS == 2) { - lv_obj_set_event_cb_mks(buttonExt2, event_handler, 0, "bmp_Ext2_state.bin", 0); - lv_imgbtn_set_src(buttonExt2, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonExt2, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonExt2, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonExt2, LV_BTN_STATE_REL, &tft_style_lable_rel); - } - #if HAS_HEATED_BED - lv_obj_set_event_cb_mks(buttonBedstate, event_handler, 0, "bmp_Bed_state.bin", 0); - lv_imgbtn_set_src(buttonBedstate, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonBedstate, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonBedstate, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBedstate, LV_BTN_STATE_REL, &tft_style_lable_rel); - #endif + if (EXTRUDERS == 2) { + lv_obj_set_event_cb_mks(buttonExt2, event_handler, 0, "bmp_ext2_state.bin", 0); + lv_imgbtn_set_src(buttonExt2, LV_BTN_STATE_REL, &bmp_pic_45x45); + lv_imgbtn_set_src(buttonExt2, LV_BTN_STATE_PR, &bmp_pic_45x45); + lv_imgbtn_set_style(buttonExt2, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonExt2, LV_BTN_STATE_REL, &tft_style_label_rel); + } + #if HAS_HEATED_BED + lv_obj_set_event_cb_mks(buttonBedstate, event_handler, 0, "bmp_bed_state.bin", 0); + lv_imgbtn_set_src(buttonBedstate, LV_BTN_STATE_REL, &bmp_pic_45x45); + lv_imgbtn_set_src(buttonBedstate, LV_BTN_STATE_PR, &bmp_pic_45x45); + lv_imgbtn_set_style(buttonBedstate, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBedstate, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif - lv_obj_set_event_cb_mks(buttonFanstate, event_handler, 0, "bmp_Fan_state.bin", 0); - lv_imgbtn_set_src(buttonFanstate, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonFanstate, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonFanstate, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonFanstate, LV_BTN_STATE_REL, &tft_style_lable_rel); - - lv_obj_set_event_cb_mks(buttonTime, event_handler, 0, "bmp_Time_state.bin", 0); - lv_imgbtn_set_src(buttonTime, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonTime, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonTime, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonTime, LV_BTN_STATE_REL, &tft_style_lable_rel); - - lv_obj_set_event_cb_mks(buttonZpos, event_handler, 0, "bmp_Zpos_state.bin", 0); - lv_imgbtn_set_src(buttonZpos, LV_BTN_STATE_REL, &bmp_pic_45x45); - lv_imgbtn_set_src(buttonZpos, LV_BTN_STATE_PR, &bmp_pic_45x45); - lv_imgbtn_set_style(buttonZpos, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonZpos, LV_BTN_STATE_REL, &tft_style_lable_rel); - - if (uiCfg.print_state == WORKING) - lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_Resume.bin", 0); - else - lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_Pause.bin", 0); - - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, &bmp_pic_150x80); - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, &bmp_pic_150x80); - lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_REL, &tft_style_lable_rel); - - lv_obj_set_event_cb_mks(buttonStop, event_handler, ID_STOP, "bmp_Stop.bin", 0); - lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_REL, &bmp_pic_150x80); - lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_PR, &bmp_pic_150x80); - lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_REL, &tft_style_lable_rel); - - lv_obj_set_event_cb_mks(buttonOperat, event_handler, ID_OPTION, "bmp_Operate.bin", 0); - lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_REL, &bmp_pic_150x80); - lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_PR, &bmp_pic_150x80); - lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_REL, &tft_style_lable_rel); - #endif + lv_obj_set_event_cb_mks(buttonFanstate, event_handler, 0, "bmp_fan_state.bin", 0); + lv_imgbtn_set_src(buttonFanstate, LV_BTN_STATE_REL, &bmp_pic_45x45); + lv_imgbtn_set_src(buttonFanstate, LV_BTN_STATE_PR, &bmp_pic_45x45); + lv_imgbtn_set_style(buttonFanstate, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFanstate, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonTime, event_handler, 0, "bmp_time_state.bin", 0); + lv_imgbtn_set_src(buttonTime, LV_BTN_STATE_REL, &bmp_pic_45x45); + lv_imgbtn_set_src(buttonTime, LV_BTN_STATE_PR, &bmp_pic_45x45); + lv_imgbtn_set_style(buttonTime, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTime, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonZpos, event_handler, 0, "bmp_zpos_state.bin", 0); + lv_imgbtn_set_src(buttonZpos, LV_BTN_STATE_REL, &bmp_pic_45x45); + lv_imgbtn_set_src(buttonZpos, LV_BTN_STATE_PR, &bmp_pic_45x45); + lv_imgbtn_set_style(buttonZpos, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonZpos, LV_BTN_STATE_REL, &tft_style_label_rel); + + if (uiCfg.print_state == WORKING) + lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_pause.bin", 0); + else + lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_resume.bin", 0); + + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, &bmp_pic_150x80); + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, &bmp_pic_150x80); + lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonStop, event_handler, ID_STOP, "bmp_stop.bin", 0); + lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_REL, &bmp_pic_150x80); + lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_PR, &bmp_pic_150x80); + lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonOperat, event_handler, ID_OPTION, "bmp_operate.bin", 0); + lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_REL, &bmp_pic_150x80); + lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_PR, &bmp_pic_150x80); + lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 lv_obj_set_pos(buttonExt1, 205, 136); if (EXTRUDERS == 2) @@ -272,35 +272,35 @@ void lv_draw_printing(void) { lv_btn_set_layout(buttonOperat, LV_LAYOUT_OFF); labelExt1 = lv_label_create(scr, NULL); - lv_obj_set_style(labelExt1, &tft_style_lable_rel); + lv_obj_set_style(labelExt1, &tft_style_label_rel); lv_obj_set_pos(labelExt1, 250, 146); if (EXTRUDERS == 2) { labelExt2 = lv_label_create(scr, NULL); - lv_obj_set_style(labelExt2, &tft_style_lable_rel); + lv_obj_set_style(labelExt2, &tft_style_label_rel); lv_obj_set_pos(labelExt2, 395, 146); } #if HAS_HEATED_BED labelBed = lv_label_create(scr, NULL); - lv_obj_set_style(labelBed, &tft_style_lable_rel); + lv_obj_set_style(labelBed, &tft_style_label_rel); lv_obj_set_pos(labelBed, 250, 196); #endif labelFan = lv_label_create(scr, NULL); - lv_obj_set_style(labelFan, &tft_style_lable_rel); + lv_obj_set_style(labelFan, &tft_style_label_rel); lv_obj_set_pos(labelFan, 395, 196); labelZpos = lv_label_create(scr, NULL); - lv_obj_set_style(labelZpos, &tft_style_lable_rel); + lv_obj_set_style(labelZpos, &tft_style_label_rel); lv_obj_set_pos(labelZpos, 395, 96); labelTime = lv_label_create(scr, NULL); - lv_obj_set_style(labelTime, &tft_style_lable_rel); + lv_obj_set_style(labelTime, &tft_style_label_rel); lv_obj_set_pos(labelTime, 250, 96); - labelPause = lv_label_create(buttonPause, NULL); - labelStop = lv_label_create(buttonStop, NULL); + labelPause = lv_label_create(buttonPause, NULL); + labelStop = lv_label_create(buttonStop, NULL); labelOperat = lv_label_create(buttonOperat, NULL); if (gCfgItems.multiple_language != 0) { @@ -318,11 +318,11 @@ void lv_draw_printing(void) { } lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color); - lv_bar_style_indic.text.color = lv_color_hex3(0xADF); - lv_bar_style_indic.image.color = lv_color_hex3(0xADF); - lv_bar_style_indic.line.color = lv_color_hex3(0xADF); - lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF); - lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF); + lv_bar_style_indic.text.color = lv_color_hex3(0xADF); + lv_bar_style_indic.image.color = lv_color_hex3(0xADF); + lv_bar_style_indic.line.color = lv_color_hex3(0xADF); + lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF); + lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF); lv_bar_style_indic.body.border.color = lv_color_hex3(0xADF); bar1 = lv_bar_create(scr, NULL); @@ -340,12 +340,12 @@ void lv_draw_printing(void) { } void disp_ext_temp() { - memset(public_buf_l, 0, sizeof(public_buf_l)); + ZERO(public_buf_l); sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target); lv_label_set_text(labelExt1, public_buf_l); if (EXTRUDERS == 2) { - memset(public_buf_l, 0, sizeof(public_buf_l)); + ZERO(public_buf_l); sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target); lv_label_set_text(labelExt2, public_buf_l); } @@ -353,42 +353,42 @@ void disp_ext_temp() { void disp_bed_temp() { #if HAS_HEATED_BED - memset(public_buf_l, 0, sizeof(public_buf_l)); + ZERO(public_buf_l); sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); lv_label_set_text(labelBed, public_buf_l); #endif } void disp_fan_speed() { - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "%3d", thermalManager.fan_speed[0]); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%3d"), thermalManager.fan_speed[0]); lv_label_set_text(labelFan, public_buf_l); } void disp_print_time() { - memset(public_buf_l, 0, sizeof(public_buf_l)); + ZERO(public_buf_l); #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) const uint32_t r = ui.get_remaining_time(); - sprintf(public_buf_l, "%02d:%02d R", r / 3600, (r % 3600) / 60); + sprintf_P(public_buf_l, PSTR("%02d:%02d R"), r / 3600, (r % 3600) / 60); #else - sprintf(public_buf_l, "%d%d:%d%d:%d%d", print_time.hours / 10, print_time.hours % 10, print_time.minutes / 10, print_time.minutes % 10, print_time.seconds / 10, print_time.seconds % 10); + sprintf_P(public_buf_l, PSTR("%d%d:%d%d:%d%d"), print_time.hours / 10, print_time.hours % 10, print_time.minutes / 10, print_time.minutes % 10, print_time.seconds / 10, print_time.seconds % 10); #endif lv_label_set_text(labelTime, public_buf_l); } void disp_fan_Zpos() { - memset(public_buf_l, 0, sizeof(public_buf_l)); - sprintf(public_buf_l, "%.3f", current_position[Z_AXIS]); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.3f"), current_position[Z_AXIS]); lv_label_set_text(labelZpos, public_buf_l); } void reset_print_time() { - //print_time.days = 0; - print_time.hours = 0; + // print_time.days = 0; + print_time.hours = 0; print_time.minutes = 0; print_time.seconds = 0; - print_time.ms_10 = 0; - //print_time.start = 1; + print_time.ms_10 = 0; + // print_time.start = 1; } void start_print_time() { print_time.start = 1; } @@ -411,7 +411,7 @@ void setProBarRate() { #endif rate = (rate_tmp_r - (PREVIEW_SIZE + To_pre_view)) * 100 / (gCfgItems.curFilesize - (PREVIEW_SIZE + To_pre_view)); } - //gCurFileState.totalSend = rate; + // gCurFileState.totalSend = rate; if (rate <= 0) return; @@ -440,4 +440,4 @@ void setProBarRate() { void lv_clear_printing() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 31ea1f6d82b7..c987ddb0846b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -21,12 +21,11 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "draw_ready_print.h" #include "draw_tool.h" #include "lv_conf.h" -#include "lvgl.h" //#include "../lvgl/src/lv_objx/lv_imgbtn.h" //#include "../lvgl/src/lv_objx/lv_img.h" //#include "../lvgl/src/lv_core/lv_disp.h" @@ -35,11 +34,13 @@ #include "mks_hardware_test.h" #include "draw_ui.h" -#include +#include #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" +#include + //static lv_obj_t *buttonPrint,*buttonTool,*buttonSet; static lv_obj_t * scr; #if ENABLED(MKS_TEST) @@ -57,9 +58,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { // nothing to do } else if (event == LV_EVENT_RELEASED) { - #if ENABLED(MKS_TEST) - curent_disp_ui = 2; - #endif + lv_obj_del(scr); lv_draw_tool(); } @@ -85,203 +84,222 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { } } +lv_obj_t *limit_info, *det_info; +lv_style_t limit_style, det_style; +void disp_Limit_ok() { + limit_style.text.color.full = 0xFFFF; + lv_obj_set_style(limit_info, &limit_style); + lv_label_set_text(limit_info, "Limit:ok"); +} +void disp_Limit_error() { + limit_style.text.color.full = 0xF800; + lv_obj_set_style(limit_info, &limit_style); + lv_label_set_text(limit_info, "Limit:error"); +} -#if ENABLED(MKS_TEST) - - lv_obj_t *limit_info, *det_info; - lv_style_t limit_style, det_style; - void disp_Limit_ok() { - limit_style.text.color.full = 0xFFFF; - lv_obj_set_style(limit_info, &limit_style); - lv_label_set_text(limit_info, "Limit:ok"); - } - void disp_Limit_error() { - limit_style.text.color.full = 0xF800; - lv_obj_set_style(limit_info, &limit_style); - lv_label_set_text(limit_info, "Limit:error"); - } - - void disp_det_ok() { - det_style.text.color.full = 0xFFFF; - lv_obj_set_style(det_info, &det_style); - lv_label_set_text(det_info, "det:ok"); - } - void disp_det_error() { - det_style.text.color.full = 0xF800; - lv_obj_set_style(det_info, &det_style); - lv_label_set_text(det_info, "det:error"); - } +void disp_det_ok() { + det_style.text.color.full = 0xFFFF; + lv_obj_set_style(det_info, &det_style); + lv_label_set_text(det_info, "det:ok"); +} +void disp_det_error() { + det_style.text.color.full = 0xF800; + lv_obj_set_style(det_info, &det_style); + lv_label_set_text(det_info, "det:error"); +} - lv_obj_t *e1, *e2, *e3, *bed; - void disp_test() { - char buf[30] = {0}; - //lv_obj_t * label_tool2 = lv_label_create(scr, NULL); - //lv_obj_set_pos(label_tool,20,50); - memset(buf, 0, sizeof(buf)); - sprintf(buf, "e1:%d", (int)thermalManager.temp_hotend[0].celsius); - lv_label_set_text(e1, buf); - - memset(buf, 0, sizeof(buf)); - sprintf(buf, "e2:%d", (int)thermalManager.temp_hotend[1].celsius); +lv_obj_t *e1, *e2, *e3, *bed; +void mks_disp_test() { + char buf[30] = {0}; + //lv_obj_t * label_tool2 = lv_label_create(scr, NULL); + //lv_obj_set_pos(label_tool,20,50); + ZERO(buf); + sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.temp_hotend[0].celsius); + lv_label_set_text(e1, buf); + #if HAS_MULTI_HOTEND + ZERO(buf); + sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.temp_hotend[1].celsius); lv_label_set_text(e2, buf); - - memset(buf, 0, sizeof(buf)); - sprintf(buf, "e3:%d", (int)thermalManager.temp_hotend[2].celsius); - lv_label_set_text(e3, buf); - - memset(buf, 0, sizeof(buf)); - sprintf(buf, "bed:%d", (int)thermalManager.temp_bed.celsius); + #endif + + //ZERO(buf); + //sprintf_P(buf, PSTR("e3:%d"), (int)thermalManager.temp_hotend[2].celsius); + //lv_label_set_text(e3, buf); + #if HAS_HEATED_BED + ZERO(buf); + sprintf_P(buf, PSTR("bed:%d"), (int)thermalManager.temp_bed.celsius); lv_label_set_text(bed, buf); - } - -#endif // MKS_TEST + #endif +} +extern unsigned char bmp_public_buf[17 * 1024]; void lv_draw_ready_print(void) { - #if ENABLED(MKS_TEST) - char buf[30] = {0}; - lv_obj_t *buttonTool; + char buf[30] = {0}; + lv_obj_t *buttonPrint, *buttonTool, *buttonSet; - static lv_style_t style_pr, style_rel; + disp_state_stack._disp_index = 0; + ZERO(disp_state_stack._disp_state); + disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_READY_UI; - curent_disp_ui = 1; + disp_state = PRINT_READY_UI; - scr = lv_obj_create(NULL, NULL); + scr = lv_obj_create(NULL, NULL); - static lv_style_t ready_style; + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + //lv_obj_set_hidden(scr,true); + lv_refr_now(lv_refr_get_disp_refreshing()); - lv_style_copy(&ready_style, &lv_style_scr); - //ready_style.body.main_color.full = 0X18C3; - //ready_style.body.grad_color.full = 0X18C3; - ready_style.body.main_color.full = 0X0000; - ready_style.body.grad_color.full = 0X0000; - ready_style.text.color.full = 0Xffff; - lv_obj_set_style(scr, &ready_style); - lv_scr_load(scr); - lv_obj_clean(scr); - //lv_obj_set_hidden(scr,true); - lv_refr_now(lv_refr_get_disp_refreshing()); + LV_IMG_DECLARE(bmp_pic); - LV_IMG_DECLARE(bmp_pic); - //LV_IMG_DECLARE(bmp_pic2); - //LV_IMG_DECLARE(bmp_pic3); - - //scr = lv_obj_create(NULL, NULL); - //lv_scr_load(scr); + if (mks_test_flag == 0x1e) { + //lv_obj_t * title = lv_label_create(scr, NULL); + //lv_obj_set_style(title, &tft_style_label_rel); + //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); + //lv_label_set_text(title, creat_title_text()); /*Create an Image button*/ + //buttonPrint = lv_imgbtn_create(scr, NULL); buttonTool = lv_imgbtn_create(scr, NULL); + //buttonSet = lv_imgbtn_create(scr, NULL); - //lv_btn_setting(&style_pr,0x5d8f16,0x5d8f16); - //lv_btn_setting(&style_rel,0x5d8f16,0x5d8f16); + //lv_obj_set_event_cb_mks(buttonPrint, event_handler,ID_PRINT,"bmp_printing.bin",0); + //lv_imgbtn_set_src_mks(buttonPrint, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_printing.bin"); + //lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, &bmp_pic); + //lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, &bmp_pic); + //lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_label_rel); + //lv_obj_clear_protect(buttonPrint, LV_PROTECT_FOLLOW); + + #if 1 + //lv_obj_set_event_cb_mks(buttonSet, event_handler,ID_SET,"bmp_set.bin",0); + //lv_imgbtn_set_src_mks(buttonSet, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_set.bin"); + //lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, &bmp_pic); + //lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, &bmp_pic); + //lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonTool, event_handler, 3, "bmp_Tool.bin", 0); - //lv_imgbtn_set_src_mks(buttonTool, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_tool.bin"); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, &bmp_pic); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &style_pr); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &style_rel); + lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, "bmp_tool.bin", 0); + //lv_imgbtn_set_src_mks(buttonTool, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_tool.bin"); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, &bmp_pic); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, &bmp_pic); + lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif lv_obj_set_pos(buttonTool, 360, 180); + //lv_obj_set_pos(buttonSet,180,90); + //lv_obj_set_pos(buttonPrint,340,90); + //lv_obj_set_pos(buttonTool,SIMPLE_FIRST_PAGE_GRAP+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); + //lv_obj_set_pos(buttonSet,BTN_X_PIXEL+SIMPLE_FIRST_PAGE_GRAP*2+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); + //lv_obj_set_pos(buttonPrint,BTN_X_PIXEL*2+SIMPLE_FIRST_PAGE_GRAP*3+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); + + /*Create a label on the Image button*/ + //lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); + //lv_obj_t * label_print = lv_label_create(buttonPrint, NULL); + //lv_obj_t * label_set = lv_label_create(buttonSet, NULL); lv_obj_t * label_tool = lv_label_create(buttonTool, NULL); + if (gCfgItems.multiple_language != 0) { + //lv_label_set_text(label_print, main_menu.print); + //lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - lv_obj_set_pos(label_tool, 30, 100); - lv_label_set_text(label_tool, "Back"); - - e1 = lv_label_create(scr, NULL); - lv_obj_set_pos(e1, 20, 20); - sprintf(buf, "e1: %d", (int)thermalManager.temp_hotend[0].celsius); - lv_label_set_text(e1, buf); - - e2 = lv_label_create(scr, NULL); - lv_obj_set_pos(e2, 20, 45); - sprintf(buf, "e1: %d", (int)thermalManager.temp_hotend[1].celsius); - lv_label_set_text(e2, buf); - - e3 = lv_label_create(scr, NULL); - lv_obj_set_pos(e3, 20, 70); - sprintf(buf, "e1: %d", (int)thermalManager.temp_hotend[2].celsius); - lv_label_set_text(e3, buf); - - bed = lv_label_create(scr, NULL); - lv_obj_set_pos(bed, 20, 95); - sprintf(buf, "bed: %d", (int)thermalManager.temp_bed.celsius); - lv_label_set_text(bed, buf); - - limit_info = lv_label_create(scr, NULL); - - lv_style_copy(&limit_style, &lv_style_scr); - limit_style.body.main_color.full = 0X0000; - limit_style.body.grad_color.full = 0X0000; - limit_style.text.color.full = 0Xffff; - lv_obj_set_style(limit_info, &limit_style); - - lv_obj_set_pos(limit_info, 20, 120); - lv_label_set_text(limit_info, " "); - - det_info = lv_label_create(scr, NULL); - - lv_style_copy(&det_style, &lv_style_scr); - det_style.body.main_color.full = 0X0000; - det_style.body.grad_color.full = 0X0000; - det_style.text.color.full = 0Xffff; - lv_obj_set_style(det_info, &det_style); - - lv_obj_set_pos(det_info, 20, 145); - lv_label_set_text(det_info, " "); - #else // !MKS_TEST - lv_obj_t *buttonPrint, *buttonTool, *buttonSet; - - disp_state_stack._disp_index = 0; - memset(disp_state_stack._disp_state, 0, sizeof(disp_state_stack._disp_state)); - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_READY_UI; - - disp_state = PRINT_READY_UI; - - scr = lv_obj_create(NULL, NULL); + //lv_label_set_text(label_set, main_menu.set); + //lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - //lv_obj_set_hidden(scr,true); - lv_refr_now(lv_refr_get_disp_refreshing()); + //lv_label_set_style(label_tool,LV_BTN_STATE_PR,&tft_style_label_pre); + //lv_label_set_style(label_tool,LV_BTN_STATE_REL,&tft_style_label_rel); + lv_label_set_text(label_tool, main_menu.tool); + lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } - LV_IMG_DECLARE(bmp_pic); + #if 1 + e1 = lv_label_create(scr, NULL); + lv_obj_set_pos(e1, 20, 20); + sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[0].celsius); + lv_label_set_text(e1, buf); + #if HAS_MULTI_HOTEND + e2 = lv_label_create(scr, NULL); + lv_obj_set_pos(e2, 20, 45); + sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[1].celsius); + lv_label_set_text(e2, buf); + #endif + + //e3 = lv_label_create(scr, NULL); + //lv_obj_set_pos(e3,20,70); + //sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[2].celsius); + //lv_label_set_text(e3, buf); + + #if HAS_HEATED_BED + bed = lv_label_create(scr, NULL); + lv_obj_set_pos(bed, 20, 95); + sprintf_P(buf, PSTR("bed: %d"), (int)thermalManager.temp_bed.celsius); + lv_label_set_text(bed, buf); + #endif + + limit_info = lv_label_create(scr, NULL); + + lv_style_copy(&limit_style, &lv_style_scr); + limit_style.body.main_color.full = 0X0000; + limit_style.body.grad_color.full = 0X0000; + limit_style.text.color.full = 0Xffff; + lv_obj_set_style(limit_info, &limit_style); + + lv_obj_set_pos(limit_info, 20, 120); + lv_label_set_text(limit_info, " "); + + det_info = lv_label_create(scr, NULL); + + lv_style_copy(&det_style, &lv_style_scr); + det_style.body.main_color.full = 0X0000; + det_style.body.grad_color.full = 0X0000; + det_style.text.color.full = 0Xffff; + lv_obj_set_style(det_info, &det_style); + + lv_obj_set_pos(det_info, 20, 145); + lv_label_set_text(det_info, " "); + #endif // if 1 + } + else { //lv_obj_t * title = lv_label_create(scr, NULL); - //lv_obj_set_style(title, &tft_style_lable_rel); + //lv_obj_set_style(title, &tft_style_label_rel); //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); //lv_label_set_text(title, creat_title_text()); /*Create an Image button*/ buttonPrint = lv_imgbtn_create(scr, NULL); - buttonTool = lv_imgbtn_create(scr, NULL); - buttonSet = lv_imgbtn_create(scr, NULL); + buttonTool = lv_imgbtn_create(scr, NULL); + buttonSet = lv_imgbtn_create(scr, NULL); lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, "bmp_printing.bin", 0); //lv_imgbtn_set_src_mks(buttonPrint, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_printing.bin"); lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonPrint, LV_PROTECT_FOLLOW); + #if 1 - lv_obj_set_event_cb_mks(buttonSet, event_handler, ID_SET, "bmp_Set.bin", 0); + lv_obj_set_event_cb_mks(buttonSet, event_handler, ID_SET, "bmp_set.bin", 0); //lv_imgbtn_set_src_mks(buttonSet, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_set.bin"); lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, "bmp_Tool.bin", 0); + lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, "bmp_tool.bin", 0); //lv_imgbtn_set_src_mks(buttonTool, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_tool.bin"); lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); #endif + lv_obj_set_pos(buttonTool, 20, 90); lv_obj_set_pos(buttonSet, 180, 90); lv_obj_set_pos(buttonPrint, 340, 90); @@ -296,24 +314,23 @@ void lv_draw_ready_print(void) { lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); lv_obj_t * label_print = lv_label_create(buttonPrint, NULL); - lv_obj_t * label_set = lv_label_create(buttonSet, NULL); - lv_obj_t * label_tool = lv_label_create(buttonTool, NULL); + lv_obj_t * label_set = lv_label_create(buttonSet, NULL); + lv_obj_t * label_tool = lv_label_create(buttonTool, NULL); if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_print, main_menu.print); lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(label_set, main_menu.set); lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - //lv_label_set_style(label_tool,LV_BTN_STATE_PR,&tft_style_lable_pre); - //lv_label_set_style(label_tool,LV_BTN_STATE_REL,&tft_style_lable_rel); + //lv_label_set_style(label_tool,LV_BTN_STATE_PR,&tft_style_label_pre); + //lv_label_set_style(label_tool,LV_BTN_STATE_REL,&tft_style_label_rel); lv_label_set_text(label_tool, main_menu.tool); lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } - #endif // !MKS_TEST + } } void lv_clear_ready_print() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index 742fffe331c5..9951beaa4172 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -26,7 +26,7 @@ extern "C" { /* C-declarations for C++ */ #endif extern void lv_draw_ready_print(void); -extern void disp_test(); +extern void mks_disp_test(); extern void disp_Limit_ok(); extern void disp_Limit_error(); extern void disp_det_error(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp index 6c7f83405b59..eebb9fcf1c43 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "../../../../MarlinCore.h" #include "draw_ready_print.h" @@ -37,13 +37,15 @@ static lv_obj_t * scr; -#define ID_S_WIFI 1 -#define ID_S_FAN 2 -#define ID_S_ABOUT 3 -#define ID_S_CONTINUE 4 -#define ID_S_MOTOR_OFF 5 -#define ID_S_LANGUAGE 6 -#define ID_S_RETURN 7 +#define ID_S_WIFI 1 +#define ID_S_FAN 2 +#define ID_S_ABOUT 3 +#define ID_S_CONTINUE 4 +#define ID_S_MOTOR_OFF 5 +#define ID_S_LANGUAGE 6 +#define ID_S_MACHINE_PARA 7 +#define ID_S_EEPROM_SET 8 +#define ID_S_RETURN 9 static void event_handler(lv_obj_t * obj, lv_event_t event) { switch (obj->mks_obj_id) { @@ -83,7 +85,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { #if HAS_SUICIDE suicide(); #else - queue.enqueue_one_now(PSTR("M84")); + queue.enqueue_now_P(PSTR("M84")); #endif } break; @@ -96,6 +98,24 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { lv_draw_language(); } break; + case ID_S_MACHINE_PARA: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_obj_del(scr); + lv_draw_machine_para(); + } + break; + case ID_S_EEPROM_SET: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_obj_del(scr); + lv_draw_eeprom_settings(); + } + break; case ID_S_RETURN: if (event == LV_EVENT_CLICKED) { // nothing to do @@ -115,6 +135,8 @@ void lv_draw_set(void) { #if HAS_LANG_SELECT_SCREEN lv_obj_t *buttonLanguage; #endif + lv_obj_t *buttonMachinePara; + lv_obj_t *buttonEepromSet; if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) { disp_state_stack._disp_index++; @@ -131,7 +153,7 @@ void lv_draw_set(void) { lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -141,72 +163,84 @@ void lv_draw_set(void) { /*Create an Image button*/ //buttonWifi = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, NULL); + buttonFan = lv_imgbtn_create(scr, NULL); buttonAbout = lv_imgbtn_create(scr, NULL); //buttonContinue = lv_imgbtn_create(scr, NULL); buMotorOff = lv_imgbtn_create(scr, NULL); #if HAS_LANG_SELECT_SCREEN buttonLanguage = lv_imgbtn_create(scr, NULL); #endif - buttonBack = lv_imgbtn_create(scr, NULL); + buttonMachinePara = lv_imgbtn_create(scr, NULL); + buttonEepromSet = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); //lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,"bmp_Wifi.bin",0); //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, &bmp_pic); //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_lable_pre); - //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_lable_rel); + //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_label_rel); //lv_obj_clear_protect(buttonWifi, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_S_FAN, "bmp_Fan.bin", 0); + lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_S_FAN, "bmp_fan.bin", 0); lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonAbout, event_handler, ID_S_ABOUT, "bmp_About.bin", 0); + lv_obj_set_event_cb_mks(buttonAbout, event_handler, ID_S_ABOUT, "bmp_about.bin", 0); lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_REL, &tft_style_label_rel); //lv_obj_set_event_cb_mks(buttonContinue, event_handler,ID_S_CONTINUE,"bmp_Breakpoint.bin",0); //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_REL, &bmp_pic); //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_lable_pre); - //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_lable_rel); + //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_label_rel); #if HAS_SUICIDE - lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_manual_off.bin", 0); + lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_Mamual.bin", 0); #else - lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_manual_off.bin", 0); + lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_function1.bin", 0); #endif lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_REL, &tft_style_label_rel); #if HAS_LANG_SELECT_SCREEN - lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, "bmp_Language.bin", 0); + lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, "bmp_language.bin", 0); lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_label_rel); #endif - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN, "bmp_Return.bin", 0); + lv_obj_set_event_cb_mks(buttonMachinePara, event_handler, ID_S_MACHINE_PARA, "bmp_machine_para.bin", 0); + lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_REL, &bmp_pic); + lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_PR, &bmp_pic); + lv_imgbtn_set_style(buttonMachinePara, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMachinePara, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonEepromSet, event_handler, ID_S_EEPROM_SET, "bmp_eeprom_settings.bin", 0); + lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_REL, &bmp_pic); + lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_PR, &bmp_pic); + lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); - #endif + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 /*lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); lv_obj_set_pos(buttonFan,BTN_X_PIXEL+INTERVAL_V*2,titleHeight); lv_obj_set_pos(buttonAbout,BTN_X_PIXEL*2+INTERVAL_V*3,titleHeight); lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); - lv_obj_set_pos(buMotorOff,INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_obj_set_pos(buMotorOff,INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight); lv_obj_set_pos(buttonLanguage,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ + lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ //lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); lv_obj_set_pos(buttonFan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); @@ -216,7 +250,9 @@ void lv_draw_set(void) { #if HAS_LANG_SELECT_SCREEN lv_obj_set_pos(buttonLanguage, INTERVAL_V, titleHeight); #endif - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonMachinePara, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonEepromSet, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ //lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); @@ -227,18 +263,21 @@ void lv_draw_set(void) { #if HAS_LANG_SELECT_SCREEN lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF); #endif + lv_btn_set_layout(buttonMachinePara, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonEepromSet, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); //lv_obj_t * labelWifi= lv_label_create(buttonWifi, NULL); - lv_obj_t * labelFan = lv_label_create(buttonFan, NULL); + lv_obj_t * labelFan = lv_label_create(buttonFan, NULL); lv_obj_t * label_About = lv_label_create(buttonAbout, NULL); //lv_obj_t * label_Continue = lv_label_create(buttonContinue, NULL); lv_obj_t * label_MotorOff = lv_label_create(buMotorOff, NULL); #if HAS_LANG_SELECT_SCREEN lv_obj_t * label_Language = lv_label_create(buttonLanguage, NULL); #endif - lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); - + lv_obj_t * label_MachinePara = lv_label_create(buttonMachinePara, NULL); + lv_obj_t * label_EepromSet = lv_label_create(buttonEepromSet, NULL); + lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); if (gCfgItems.multiple_language != 0) { //lv_label_set_text(labelWifi, set_menu.wifi); @@ -263,6 +302,11 @@ void lv_draw_set(void) { lv_label_set_text(label_Language, set_menu.language); lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); #endif + lv_label_set_text(label_MachinePara, set_menu.machine_para); + lv_obj_align(label_MachinePara, buttonMachinePara, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_EepromSet, set_menu.eepromSet); + lv_obj_align(label_EepromSet, buttonEepromSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -271,4 +315,4 @@ void lv_draw_set(void) { void lv_clear_set() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp new file mode 100644 index 000000000000..434c2f85795a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -0,0 +1,358 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" + +static lv_obj_t * scr; + +#define ID_STEP_RETURN 1 +#define ID_STEP_X 2 +#define ID_STEP_Y 3 +#define ID_STEP_Z 4 +#define ID_STEP_E0 5 +#define ID_STEP_E1 6 +#define ID_STEP_DOWN 7 +#define ID_STEP_UP 8 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_STEP_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_step_settings(); + draw_return_ui(); + } + break; + case ID_STEP_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = Xstep; + lv_clear_step_settings(); + lv_draw_number_key(); + } + break; + case ID_STEP_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = Ystep; + lv_clear_step_settings(); + lv_draw_number_key(); + } + break; + case ID_STEP_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = Zstep; + lv_clear_step_settings(); + lv_draw_number_key(); + } + break; + case ID_STEP_E0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E0step; + lv_clear_step_settings(); + lv_draw_number_key(); + } + break; + case ID_STEP_E1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E1step; + lv_clear_step_settings(); + lv_draw_number_key(); + } + break; + case ID_STEP_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_step_settings(); + lv_draw_step_settings(); + } + break; + case ID_STEP_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_step_settings(); + lv_draw_step_settings(); + } + break; + } +} + +void lv_draw_step_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != STEPS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = STEPS_UI; + } + disp_state = STEPS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.StepsConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + // LV_IMG_DECLARE(bmp_para_arrow); + LV_IMG_DECLARE(bmp_para_bank); + + if (uiCfg.para_ui_page != 1) { + buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonXText, event_handler); + lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); + labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + + buttonXValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_STEP_X, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonYText, event_handler); + lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); + labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + + buttonYValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_STEP_Y, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonZText, event_handler); + lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); + labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + + buttonZValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_STEP_Z, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ + lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE0Text, event_handler); + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); + labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + + buttonE0Value = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_STEP_E0, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); + labelE0Value = lv_label_create(buttonE0Value, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_DOWN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + } + else { + buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE1Text, event_handler); + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); + labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + + buttonE1Value = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_STEP_E1, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); + labelE1Value = lv_label_create(buttonE1Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_UP, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_STEP_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + lv_label_set_text(labelXText, machine_menu.X_Steps); + lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelYText, machine_menu.Y_Steps); + lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelZText, machine_menu.Z_Steps); + lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelE0Text, machine_menu.E0_Steps); + lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); + lv_label_set_text(labelE0Value, public_buf_l); + lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); + } + else { + lv_label_set_text(labelE1Text, machine_menu.E1_Steps); + lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); + lv_label_set_text(labelE1Value, public_buf_l); + lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); + } + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_step_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h new file mode 100644 index 000000000000..1a5efda40825 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_step_settings(void); +extern void lv_clear_step_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp new file mode 100644 index 000000000000..f1559e0f553e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -0,0 +1,385 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_TFT_LVGL_UI, HAS_TRINAMIC_CONFIG) + +#include "lv_conf.h" +#include "draw_ui.h" +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" +#include "../../../../module/stepper/indirection.h" +#include "../../../../feature/tmc_util.h" + +static lv_obj_t * scr; + +#define ID_TMC_CURRENT_RETURN 1 +#define ID_TMC_CURRENT_X 2 +#define ID_TMC_CURRENT_Y 3 +#define ID_TMC_CURRENT_Z 4 +#define ID_TMC_CURRENT_E0 5 +#define ID_TMC_CURRENT_E1 6 +#define ID_TMC_CURRENT_DOWN 7 +#define ID_TMC_CURRENT_UP 8 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_TMC_CURRENT_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_tmc_current_settings(); + draw_return_ui(); + } + break; + case ID_TMC_CURRENT_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = Xcurrent; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); + } + break; + case ID_TMC_CURRENT_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = Ycurrent; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); + } + break; + case ID_TMC_CURRENT_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = Zcurrent; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); + } + break; + case ID_TMC_CURRENT_E0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E0current; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); + } + break; + #if AXIS_IS_TMC(E1) + case ID_TMC_CURRENT_E1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = E1current; + lv_clear_tmc_current_settings(); + lv_draw_number_key(); + } + break; + + case ID_TMC_CURRENT_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_tmc_current_settings(); + lv_draw_tmc_current_settings(); + } + break; + case ID_TMC_CURRENT_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_tmc_current_settings(); + lv_draw_tmc_current_settings(); + } + break; + #endif + } +} + +void lv_draw_tmc_current_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *buttonXText = NULL, *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *buttonYText = NULL, *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *buttonZText = NULL, *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + #if AXIS_IS_TMC(E1) + lv_obj_t *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; + #endif + float milliamps; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_CURRENT_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = TMC_CURRENT_UI; + } + disp_state = TMC_CURRENT_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.TmcCurrentConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + // LV_IMG_DECLARE(bmp_para_arrow); + LV_IMG_DECLARE(bmp_para_bank); + + if (uiCfg.para_ui_page != 1) { + buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonXText, event_handler); + lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); + labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + + buttonXValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_TMC_CURRENT_X, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonXValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonXValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonYText, event_handler); + lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); + labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + + buttonYValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_TMC_CURRENT_Y, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonYValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonYValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonZText, event_handler); + lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); + labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + + buttonZValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_TMC_CURRENT_Z, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonZValue, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonZValue, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ + lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE0Text, event_handler); + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); + labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + + buttonE0Value = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_TMC_CURRENT_E0, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonE0Value, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonE0Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); + labelE0Value = lv_label_create(buttonE0Value, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + #if AXIS_IS_TMC(E1) + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_DOWN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif + } + else { + #if AXIS_IS_TMC(E1) + buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE1Text, event_handler); + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); + labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + + buttonE1Value = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_TMC_CURRENT_E1, "bmp_value_blank.bin", 0); + lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_REL, &bmp_para_bank); + lv_imgbtn_set_src(buttonE1Value, LV_BTN_STATE_PR, &bmp_para_bank); + lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonE1Value, LV_BTN_STATE_REL, &style_para_value_rel); + lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); + labelE1Value = lv_label_create(buttonE1Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_UP, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif + } + #if AXIS_IS_TMC(E1) + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + #endif + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_CURRENT_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + lv_label_set_text(labelXText, machine_menu.X_Current); + lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelYText, machine_menu.Y_Current); + lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelZText, machine_menu.Z_Current); + lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelE0Text, machine_menu.E0_Current); + lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + #if AXIS_IS_TMC(E1) + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + #endif + #if AXIS_IS_TMC(X) + milliamps = stepperX.getMilliamps(); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelXValue, public_buf_l); + lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); + #endif + #if AXIS_IS_TMC(Y) + milliamps = stepperY.getMilliamps(); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelYValue, public_buf_l); + lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); + #endif + #if AXIS_IS_TMC(Z) + milliamps = stepperZ.getMilliamps(); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + #endif + #if AXIS_IS_TMC(E0) + milliamps = stepperE0.getMilliamps(); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelE0Value, public_buf_l); + lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); + #endif + } + else { + #if AXIS_IS_TMC(E1) + lv_label_set_text(labelE1Text, machine_menu.E1_Current); + lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + + milliamps = stepperE1.getMilliamps(); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); + lv_label_set_text(labelE1Value, public_buf_l); + lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); + #endif + } + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_tmc_current_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI && HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h new file mode 100644 index 000000000000..46463dd3c6d1 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h @@ -0,0 +1,34 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_tmc_current_settings(void); +extern void lv_clear_tmc_current_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif + diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp new file mode 100644 index 000000000000..5e776a1c6745 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -0,0 +1,478 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_TFT_LVGL_UI, HAS_STEALTHCHOP) + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" +#include "../../../../module/stepper/indirection.h" +#include "../../../../feature/tmc_util.h" +#include "../../../../gcode/gcode.h" +#include "../../../../module/planner.h" + +static lv_obj_t * scr; + +#define ID_TMC_MODE_RETURN 1 +#define ID_TMC_MODE_X 2 +#define ID_TMC_MODE_Y 3 +#define ID_TMC_MODE_Z 4 +#define ID_TMC_MODE_E0 5 +#define ID_TMC_MODE_E1 6 +#define ID_TMC_MODE_DOWN 7 +#define ID_TMC_MODE_UP 8 + +static lv_obj_t *labelXState = NULL, *labelYState = NULL, *labelZState = NULL, *labelE0State = NULL; +static lv_obj_t *buttonXState = NULL, *buttonYState = NULL, *buttonZState = NULL, *buttonE0State = NULL; + +#if AXIS_HAS_STEALTHCHOP(E1) + static lv_obj_t *labelE1State = NULL, *buttonE1State = NULL; +#endif + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_TMC_MODE_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_tmc_step_mode_settings(); + draw_return_ui(); + } + break; + case ID_TMC_MODE_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperX.stored.stealthChop_enabled == true) { + stepperX.stored.stealthChop_enabled = false; + stepperX.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_disable.bin", 0); + lv_label_set_text(labelXState, machine_menu.disable); + // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + // gcode.process_subcommands_now_P(PSTR("M500")); + } + else { + stepperX.stored.stealthChop_enabled = true; + stepperX.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_enable.bin", 0); + lv_label_set_text(labelXState, machine_menu.enable); + // gcode.process_subcommands_now_P(PSTR("M500")); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + case ID_TMC_MODE_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperY.stored.stealthChop_enabled == true) { + stepperY.stored.stealthChop_enabled = false; + stepperY.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_disable.bin", 0); + lv_label_set_text(labelYState, machine_menu.disable); + // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + } + else { + stepperY.stored.stealthChop_enabled = true; + stepperY.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_enable.bin", 0); + lv_label_set_text(labelYState, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + case ID_TMC_MODE_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperZ.stored.stealthChop_enabled == true) { + stepperZ.stored.stealthChop_enabled = false; + stepperZ.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_disable.bin", 0); + lv_label_set_text(labelZState, machine_menu.disable); + // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + } + else { + stepperZ.stored.stealthChop_enabled = true; + stepperZ.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_enable.bin", 0); + lv_label_set_text(labelZState, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + case ID_TMC_MODE_E0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperE0.stored.stealthChop_enabled == true) { + stepperE0.stored.stealthChop_enabled = false; + stepperE0.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_disable.bin", 0); + lv_label_set_text(labelE0State, machine_menu.disable); + // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + } + else { + stepperE0.stored.stealthChop_enabled = true; + stepperE0.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_enable.bin", 0); + lv_label_set_text(labelE0State, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #if AXIS_HAS_STEALTHCHOP(E1) + case ID_TMC_MODE_E1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperE1.stored.stealthChop_enabled == true) { + stepperE1.stored.stealthChop_enabled = false; + stepperE1.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_disable.bin", 0); + lv_label_set_text(labelE1State, machine_menu.disable); + // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + } + else { + stepperE1.stored.stealthChop_enabled = true; + stepperE1.refresh_stepping_mode(); + lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_enable.bin", 0); + lv_label_set_text(labelE1State, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + + case ID_TMC_MODE_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_tmc_step_mode_settings(); + lv_draw_tmc_step_mode_settings(); + } + break; + case ID_TMC_MODE_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_tmc_step_mode_settings(); + lv_draw_tmc_step_mode_settings(); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(E1) + } +} + +void lv_draw_tmc_step_mode_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *buttonXText = NULL, *labelXText = NULL; + lv_obj_t *buttonYText = NULL, *labelYText = NULL; + lv_obj_t *buttonZText = NULL, *labelZText = NULL; + lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL; + + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + #if AXIS_HAS_STEALTHCHOP(E1) + lv_obj_t *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL; + #endif + + + labelXState = NULL; + buttonXState = NULL; + labelYState = NULL; + buttonYState = NULL; + labelZState = NULL; + buttonZState = NULL; + labelE0State = NULL; + buttonE0State = NULL; + #if AXIS_HAS_STEALTHCHOP(E1) + labelE1State = NULL; + buttonE1State = NULL; + #endif + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_MODE_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = TMC_MODE_UI; + } + disp_state = TMC_MODE_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_obj_t * title = lv_label_create(scr, NULL); + lv_obj_set_style(title, &tft_style_label_rel); + lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); + lv_label_set_text(title, machine_menu.TmcStepModeConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + LV_IMG_DECLARE(bmp_para_back); + LV_IMG_DECLARE(bmp_para_state); + // LV_IMG_DECLARE(bmp_para_bank); + + if (uiCfg.para_ui_page != 1) { + buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonXText, event_handler); + lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); + labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ + + buttonXState = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonXState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); + if (stepperX.get_stealthChop_status()) + lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_enable.bin", 0); + else + lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_disable.bin", 0); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, &bmp_para_state); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, &bmp_para_state); + lv_imgbtn_set_style(buttonXState, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonXState, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonXState, LV_LAYOUT_OFF); + labelXState = lv_label_create(buttonXState, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonYText, event_handler); + lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); + labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ + + buttonYState = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonYState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_STATE_V); + if (stepperY.get_stealthChop_status()) + lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_enable.bin", 0); + else + lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_disable.bin", 0); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, &bmp_para_state); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, &bmp_para_state); + lv_imgbtn_set_style(buttonYState, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonYState, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonYState, LV_LAYOUT_OFF); + labelYState = lv_label_create(buttonYState, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonZText, event_handler); + lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); + labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ + + buttonZState = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_STATE_V); + if (stepperZ.get_stealthChop_status()) + lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_enable.bin", 0); + else + lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_disable.bin", 0); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, &bmp_para_state); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, &bmp_para_state); + lv_imgbtn_set_style(buttonZState, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonZState, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonZState, LV_LAYOUT_OFF); + labelZState = lv_label_create(buttonZState, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ + lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE0Text, event_handler); + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); + labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ + + buttonE0State = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE0State, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V); + if (stepperE0.get_stealthChop_status()) + lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_enable.bin", 0); + else + lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_disable.bin", 0); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, &bmp_para_state); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, &bmp_para_state); + lv_imgbtn_set_style(buttonE0State, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonE0State, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonE0State, LV_LAYOUT_OFF); + labelE0State = lv_label_create(buttonE0State, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + #if AXIS_HAS_STEALTHCHOP(E1) + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_DOWN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif + } + else { + #if AXIS_HAS_STEALTHCHOP(E1) + buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb(buttonE1Text, event_handler); + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); + labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ + + buttonE1State = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonE1State, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); + if (stepperE1.get_stealthChop_status()) + lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_enable.bin", 0); + else + lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_disable.bin", 0); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, &bmp_para_state); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, &bmp_para_state); + lv_imgbtn_set_style(buttonE1State, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonE1State, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonE1State, LV_LAYOUT_OFF); + labelE1State = lv_label_create(buttonE1State, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_UP, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif + } + #if AXIS_HAS_STEALTHCHOP(E1) + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + #endif + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_MODE_RETURN, "bmp_back70x40.bin", 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_para_back); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_para_back); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + lv_label_set_text(labelXText, machine_menu.X_StepMode); + lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelYText, machine_menu.Y_StepMode); + lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelZText, machine_menu.Z_StepMode); + lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelE0Text, machine_menu.E0_StepMode); + lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + if (stepperX.get_stealthChop_status()) + lv_label_set_text(labelXState, machine_menu.enable); + else + lv_label_set_text(labelXState, machine_menu.disable); + lv_obj_align(labelXState, buttonXState, LV_ALIGN_CENTER, 0, 0); + + if (stepperY.get_stealthChop_status()) + lv_label_set_text(labelYState, machine_menu.enable); + else + lv_label_set_text(labelYState, machine_menu.disable); + lv_obj_align(labelYState, buttonYState, LV_ALIGN_CENTER, 0, 0); + + if (stepperZ.get_stealthChop_status()) + lv_label_set_text(labelZState, machine_menu.enable); + else + lv_label_set_text(labelZState, machine_menu.disable); + lv_obj_align(labelZState, buttonZState, LV_ALIGN_CENTER, 0, 0); + + if (stepperE0.get_stealthChop_status()) + lv_label_set_text(labelE0State, machine_menu.enable); + else + lv_label_set_text(labelE0State, machine_menu.disable); + lv_obj_align(labelE0State, buttonE0State, LV_ALIGN_CENTER, 0, 0); + + #if AXIS_HAS_STEALTHCHOP(E1) + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + #endif + } + else { + #if AXIS_HAS_STEALTHCHOP(E1) + lv_label_set_text(labelE1Text, machine_menu.E1_StepMode); + lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); + + if (stepperE1.get_stealthChop_status()) + lv_label_set_text(labelE1State, machine_menu.enable); + else + lv_label_set_text(labelE1State, machine_menu.disable); + lv_obj_align(labelE1State, buttonE1State, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + + #endif + } + + lv_label_set_text(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_tmc_step_mode_settings() { lv_obj_del(scr); } + +#endif // HAS_TFT_LVGL_UI && HAS_STEALTHCHOP diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h new file mode 100644 index 000000000000..93085b7ca16b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_tmc_step_mode_settings(void); +extern void lv_clear_tmc_step_mode_settings(); + +#ifdef __cplusplus +} /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 14b9ee80c592..2e6d164c0bb0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "lv_conf.h" #include "draw_ui.h" @@ -33,11 +33,8 @@ #include "../../../../MarlinCore.h" #include "../../../../gcode/queue.h" -//static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; +// static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; static lv_obj_t * scr; -#if ENABLED(MKS_TEST) - extern uint8_t curent_disp_ui; -#endif #define ID_T_PRE_HEAT 1 #define ID_T_EXTRUCT 2 @@ -128,14 +125,14 @@ void lv_draw_tool(void) { scr = lv_obj_create(NULL, NULL); - //static lv_style_t tool_style; + // static lv_style_t tool_style; lv_obj_set_style(scr, &tft_style_scr); lv_scr_load(scr); lv_obj_clean(scr); lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_lable_rel); + lv_obj_set_style(title, &tft_style_label_rel); lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); lv_label_set_text(title, creat_title_text()); @@ -144,74 +141,74 @@ void lv_draw_tool(void) { LV_IMG_DECLARE(bmp_pic); /*Create an Image button*/ - buttonPreHeat = lv_imgbtn_create(scr, NULL); + buttonPreHeat = lv_imgbtn_create(scr, NULL); buttonExtrusion = lv_imgbtn_create(scr, NULL); - buttonMove = lv_imgbtn_create(scr, NULL); - buttonHome = lv_imgbtn_create(scr, NULL); - buttonLevel = lv_imgbtn_create(scr, NULL); - //buttonFilament = lv_imgbtn_create(scr, NULL); - //buttonMore = lv_imgbtn_create(scr, NULL); + buttonMove = lv_imgbtn_create(scr, NULL); + buttonHome = lv_imgbtn_create(scr, NULL); + buttonLevel = lv_imgbtn_create(scr, NULL); + // buttonFilament = lv_imgbtn_create(scr, NULL); + // buttonMore = lv_imgbtn_create(scr, NULL); buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_T_PRE_HEAT, "bmp_PreHeat.bin", 0); + lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_T_PRE_HEAT, "bmp_preHeat.bin", 0); lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_clear_protect(buttonPreHeat, LV_PROTECT_FOLLOW); #if 1 - lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_T_EXTRUCT, "bmp_Extruct.bin", 0); + lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_T_EXTRUCT, "bmp_extruct.bin", 0); lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_T_MOV, "bmp_Mov.bin", 0); + lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_T_MOV, "bmp_mov.bin", 0); lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonHome, event_handler, ID_T_HOME, "bmp_Zero.bin", 0); + lv_obj_set_event_cb_mks(buttonHome, event_handler, ID_T_HOME, "bmp_zero.bin", 0); lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_REL, &tft_style_lable_rel); + lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_T_LEVELING, "bmp_Leveling.bin", 0); + lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_T_LEVELING, "bmp_leveling.bin", 0); lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_REL, &tft_style_lable_rel); - - //lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,"bmp_Filamentchange.bin",0); - //lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_lable_pre); - //lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_lable_rel); - - //lv_obj_set_event_cb_mks(buttonMore, event_handler,ID_T_MORE,"bmp_More.bin",0); - //lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_REL, &bmp_pic); - //lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_PR, &bmp_pic); - //lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_PR, &tft_style_lable_pre); - //lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_REL, &tft_style_lable_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_T_RETURN, "bmp_Return.bin", 0); + lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_REL, &tft_style_label_rel); + + // lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,"bmp_Filamentchange.bin",0); + // lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic); + // lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic); + // lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); + // lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); + + // lv_obj_set_event_cb_mks(buttonMore, event_handler,ID_T_MORE,"bmp_More.bin",0); + // lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_REL, &bmp_pic); + // lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_PR, &bmp_pic); + // lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_PR, &tft_style_label_pre); + // lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_T_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel); - #endif + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); + #endif // if 1 lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); lv_obj_set_pos(buttonExtrusion, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); lv_obj_set_pos(buttonMove, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); lv_obj_set_pos(buttonHome, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonLevel, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - //lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - //lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonLevel, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + // lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); + // lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); @@ -219,15 +216,15 @@ void lv_draw_tool(void) { lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); lv_btn_set_layout(buttonHome, LV_LAYOUT_OFF); lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonMore, LV_LAYOUT_OFF); + // lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); + // lv_btn_set_layout(buttonMore, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - lv_obj_t * labelPreHeat = lv_label_create(buttonPreHeat, NULL); + lv_obj_t * labelPreHeat = lv_label_create(buttonPreHeat, NULL); lv_obj_t * labelExtrusion = lv_label_create(buttonExtrusion, NULL); - lv_obj_t * label_Move = lv_label_create(buttonMove, NULL); - lv_obj_t * label_Home = lv_label_create(buttonHome, NULL); - lv_obj_t * label_Level = lv_label_create(buttonLevel, NULL); + lv_obj_t * label_Move = lv_label_create(buttonMove, NULL); + lv_obj_t * label_Home = lv_label_create(buttonHome, NULL); + lv_obj_t * label_Level = lv_label_create(buttonLevel, NULL); //lv_obj_t * label_Filament = lv_label_create(buttonFilament, NULL); //lv_obj_t * label_More = lv_label_create(buttonMore, NULL); lv_obj_t * label_Back = lv_label_create(buttonBack, NULL); @@ -254,11 +251,11 @@ void lv_draw_tool(void) { lv_label_set_text(label_Level, tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling)); lv_obj_align(label_Level, buttonLevel, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - //lv_label_set_text(label_Filament, tool_menu.filament); - //lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + // lv_label_set_text(label_Filament, tool_menu.filament); + // lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - //lv_label_set_text(label_More, tool_menu.more); - //lv_obj_align(label_More, buttonMore, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + // lv_label_set_text(label_More, tool_menu.more); + // lv_obj_align(label_More, buttonMore, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); @@ -267,4 +264,4 @@ void lv_draw_tool(void) { void lv_clear_tool() { lv_obj_del(scr); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index ef2a29a930a3..75e9b7cdc8a1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -21,24 +21,27 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI + +#if ENABLED(TFT_LVGL_UI_SPI) + #include "SPI_TFT.h" +#endif #include "W25Qxx.h" #include "tft_lvgl_configuration.h" -#include +#include "pic_manager.h" -#if ENABLED(SPI_GRAPHICAL_TFT) - #include "SPI_TFT.h" -#endif +#include "draw_ui.h" +#include "mks_hardware_test.h" + +#include #include "../../../../MarlinCore.h" #include "../../../../sd/cardreader.h" #include "../../../../module/motion.h" #include "../../../../module/planner.h" -#include "pic_manager.h" - #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif @@ -47,14 +50,13 @@ #include "../../../../feature/pause.h" #endif -#include "draw_ui.h" - CFG_ITMES gCfgItems; UI_CFG uiCfg; DISP_STATE_STACK disp_state_stack; DISP_STATE disp_state = MAIN_UI; DISP_STATE last_disp_state; PRINT_TIME print_time; +value_state value; uint32_t To_pre_view; uint8_t gcode_preview_over; @@ -72,9 +74,15 @@ extern uint8_t bmp_public_buf[17 * 1024]; extern void LCD_IO_WriteData(uint16_t RegValue); +lv_point_t line_points[4][2] = { + {{PARA_UI_POS_X, PARA_UI_POS_Y + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y + PARA_UI_SIZE_Y}}, + {{PARA_UI_POS_X, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}}, + {{PARA_UI_POS_X, PARA_UI_POS_Y*3 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*3 + PARA_UI_SIZE_Y}}, + {{PARA_UI_POS_X, PARA_UI_POS_Y*4 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*4 + PARA_UI_SIZE_Y}} +}; void gCfgItems_init() { gCfgItems.multiple_language = MULTI_LANGUAGE_ENABLE; - #if 1 //LCD_LANGUAGE == en + #if 1 // LCD_LANGUAGE == en gCfgItems.language = LANG_ENGLISH; #elif LCD_LANGUAGE == zh_CN gCfgItems.language = LANG_SIMPLE_CHINESE; @@ -101,12 +109,14 @@ void gCfgItems_init() { #elif LCD_LANGUAGE == pt gCfgItems.language = LANG_PORTUGUESE; #endif - gCfgItems.leveling_mode = 0; - gCfgItems.from_flash_pic = 0; - gCfgItems.curFilesize = 0; + gCfgItems.leveling_mode = 0; + gCfgItems.from_flash_pic = 0; + gCfgItems.curFilesize = 0; gCfgItems.finish_power_off = 0; - gCfgItems.pause_reprint = 0; - + gCfgItems.pause_reprint = 0; + gCfgItems.pausePosX = -1; + gCfgItems.pausePosY = -1; + gCfgItems.pausePosZ = 5; W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems.spi_flash_flag, VAR_INF_ADDR, sizeof(gCfgItems.spi_flash_flag)); if (gCfgItems.spi_flash_flag == GCFG_FLAG_VALUE) { W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); @@ -116,7 +126,6 @@ void gCfgItems_init() { W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); } - } void gCfg_to_spiFlah() { @@ -125,15 +134,16 @@ void gCfg_to_spiFlah() { } void ui_cfg_init() { - uiCfg.curTempType = 0; - uiCfg.curSprayerChoose = 0; - uiCfg.stepHeat = 10; + uiCfg.curTempType = 0; + uiCfg.curSprayerChoose = 0; + uiCfg.stepHeat = 10; uiCfg.leveling_first_time = 0; - uiCfg.extruStep = 5; - uiCfg.extruSpeed = 10; - uiCfg.move_dist = 1; - uiCfg.moveSpeed = 3000; - uiCfg.stepPrintSpeed = 10; + uiCfg.para_ui_page = 0; + uiCfg.extruStep = 5; + uiCfg.extruSpeed = 10; + uiCfg.move_dist = 1; + uiCfg.moveSpeed = 3000; + uiCfg.stepPrintSpeed = 10; } void update_spi_flash() { @@ -143,48 +153,106 @@ void update_spi_flash() { } lv_style_t tft_style_scr; -lv_style_t tft_style_lable_pre; -lv_style_t tft_style_lable_rel; +lv_style_t tft_style_label_pre; +lv_style_t tft_style_label_rel; +lv_style_t style_line; +lv_style_t style_para_value_pre; +lv_style_t style_para_value_rel; +lv_style_t style_num_key_pre; +lv_style_t style_num_key_rel; + +lv_style_t style_num_text; void tft_style_init() { lv_style_copy(&tft_style_scr, &lv_style_scr); - tft_style_scr.body.main_color = LV_COLOR_BACKGROUND; - tft_style_scr.body.grad_color = LV_COLOR_BACKGROUND; - tft_style_scr.text.color = LV_COLOR_TEXT; - tft_style_scr.text.sel_color = LV_COLOR_TEXT; - tft_style_scr.line.width = 0; + tft_style_scr.body.main_color = LV_COLOR_BACKGROUND; + tft_style_scr.body.grad_color = LV_COLOR_BACKGROUND; + tft_style_scr.text.color = LV_COLOR_TEXT; + tft_style_scr.text.sel_color = LV_COLOR_TEXT; + tft_style_scr.line.width = 0; tft_style_scr.text.letter_space = 0; - tft_style_scr.text.line_space = 0; - - lv_style_copy(&tft_style_lable_pre, &lv_style_scr); - lv_style_copy(&tft_style_lable_rel, &lv_style_scr); - tft_style_lable_pre.body.main_color = LV_COLOR_BACKGROUND; - tft_style_lable_pre.body.grad_color = LV_COLOR_BACKGROUND; - tft_style_lable_pre.text.color = LV_COLOR_TEXT; - tft_style_lable_pre.text.sel_color = LV_COLOR_TEXT; - tft_style_lable_rel.body.main_color = LV_COLOR_BACKGROUND; - tft_style_lable_rel.body.grad_color = LV_COLOR_BACKGROUND; - tft_style_lable_rel.text.color = LV_COLOR_TEXT; - tft_style_lable_rel.text.sel_color = LV_COLOR_TEXT; + tft_style_scr.text.line_space = 0; + + lv_style_copy(&tft_style_label_pre, &lv_style_scr); + lv_style_copy(&tft_style_label_rel, &lv_style_scr); + tft_style_label_pre.body.main_color = LV_COLOR_BACKGROUND; + tft_style_label_pre.body.grad_color = LV_COLOR_BACKGROUND; + tft_style_label_pre.text.color = LV_COLOR_TEXT; + tft_style_label_pre.text.sel_color = LV_COLOR_TEXT; + tft_style_label_rel.body.main_color = LV_COLOR_BACKGROUND; + tft_style_label_rel.body.grad_color = LV_COLOR_BACKGROUND; + tft_style_label_rel.text.color = LV_COLOR_TEXT; + tft_style_label_rel.text.sel_color = LV_COLOR_TEXT; + tft_style_label_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); + tft_style_label_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); + tft_style_label_pre.line.width = 0; + tft_style_label_rel.line.width = 0; + tft_style_label_pre.text.letter_space = 0; + tft_style_label_rel.text.letter_space = 0; + tft_style_label_pre.text.line_space = -5; + tft_style_label_rel.text.line_space = -5; + lv_style_copy(&style_para_value_pre, &lv_style_scr); + lv_style_copy(&style_para_value_rel, &lv_style_scr); + style_para_value_pre.body.main_color = LV_COLOR_BACKGROUND; + style_para_value_pre.body.grad_color = LV_COLOR_BACKGROUND; + style_para_value_pre.text.color = LV_COLOR_BLACK; + style_para_value_pre.text.sel_color = LV_COLOR_BLACK; + style_para_value_rel.body.main_color = LV_COLOR_BACKGROUND; + style_para_value_rel.body.grad_color = LV_COLOR_BACKGROUND; + style_para_value_rel.text.color = LV_COLOR_BLACK; + style_para_value_rel.text.sel_color = LV_COLOR_BLACK; + style_para_value_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); + style_para_value_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); + style_para_value_pre.line.width = 0; + style_para_value_rel.line.width = 0; + style_para_value_pre.text.letter_space = 0; + style_para_value_rel.text.letter_space = 0; + style_para_value_pre.text.line_space = -5; + style_para_value_rel.text.line_space = -5; + lv_style_copy(&style_num_key_pre, &lv_style_scr); + lv_style_copy(&style_num_key_rel, &lv_style_scr); + style_num_key_pre.body.main_color = LV_COLOR_KEY_BACKGROUND; + style_num_key_pre.body.grad_color = LV_COLOR_KEY_BACKGROUND; + style_num_key_pre.text.color = LV_COLOR_TEXT; + style_num_key_pre.text.sel_color = LV_COLOR_TEXT; + style_num_key_rel.body.main_color = LV_COLOR_KEY_BACKGROUND; + style_num_key_rel.body.grad_color = LV_COLOR_KEY_BACKGROUND; + style_num_key_rel.text.color = LV_COLOR_TEXT; + style_num_key_rel.text.sel_color = LV_COLOR_TEXT; #if HAS_SPI_FLASH_FONT - tft_style_lable_pre.text.font = &gb2312_puhui32; - tft_style_lable_rel.text.font = &gb2312_puhui32; + style_num_key_pre.text.font = &gb2312_puhui32; + style_num_key_rel.text.font = &gb2312_puhui32; #else - tft_style_lable_pre.text.font = LV_FONT_DEFAULT; - tft_style_lable_rel.text.font = LV_FONT_DEFAULT; + style_num_key_pre.text.font = LV_FONT_DEFAULT; + style_num_key_rel.text.font = LV_FONT_DEFAULT; #endif - tft_style_lable_pre.line.width = 0; - tft_style_lable_rel.line.width = 0; - tft_style_lable_pre.text.letter_space = 0; - tft_style_lable_rel.text.letter_space = 0; - tft_style_lable_pre.text.line_space = -5; - tft_style_lable_rel.text.line_space = -5; + + style_num_key_pre.line.width = 0; + style_num_key_rel.line.width = 0; + style_num_key_pre.text.letter_space = 0; + style_num_key_rel.text.letter_space = 0; + style_num_key_pre.text.line_space = -5; + style_num_key_rel.text.line_space = -5; + lv_style_copy(&style_num_text, &lv_style_scr); + + style_num_text.body.main_color = LV_COLOR_WHITE; + style_num_text.body.grad_color = LV_COLOR_WHITE; + style_num_text.text.color = LV_COLOR_BLACK; + style_num_text.text.sel_color = LV_COLOR_BLACK; + style_num_text.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); + style_num_text.line.width = 0; + style_num_text.text.letter_space = 0; + style_num_text.text.line_space = -5; + + lv_style_copy(&style_line, &lv_style_plain); + style_line.line.color = LV_COLOR_MAKE(0x49, 0x54, 0xff); + style_line.line.width = 1; + style_line.line.rounded = 1; } #define MAX_TITLE_LEN 28 char public_buf_m[100] = {0}; - char public_buf_l[30]; void titleText_cat(char *str, int strSize, char *addPart) { @@ -195,7 +263,7 @@ void titleText_cat(char *str, int strSize, char *addPart) { char *getDispText(int index) { - memset(public_buf_l, 0, sizeof(public_buf_l)); + ZERO(public_buf_l); switch (disp_state_stack._disp_state[index]) { case PRINT_READY_UI: @@ -206,11 +274,11 @@ char *getDispText(int index) { break; case PRINTING_UI: if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - #ifndef TFT35 - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - #endif - ) strcpy(public_buf_l, common_menu.print_special_title); + #ifndef TFT35 + || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI + || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI + #endif + ) strcpy(public_buf_l, common_menu.print_special_title); else strcpy(public_buf_l, printing_menu.title); break; case MOVE_MOTOR_UI: @@ -218,19 +286,19 @@ char *getDispText(int index) { break; case OPERATE_UI: if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - #ifndef TFT35 - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - #endif - ) strcpy(public_buf_l, common_menu.operate_special_title); + #ifndef TFT35 + || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI + || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI + #endif + ) strcpy(public_buf_l, common_menu.operate_special_title); else strcpy(public_buf_l, operation_menu.title); break; case PAUSE_UI: if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - ) strcpy(public_buf_l, common_menu.pause_special_title); + || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI + || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI + ) strcpy(public_buf_l, common_menu.pause_special_title); else strcpy(public_buf_l, pause_menu.title); break; @@ -244,7 +312,8 @@ char *getDispText(int index) { strcpy(public_buf_l, fan_menu.title); break; case PRE_HEAT_UI: - if ((disp_state_stack._disp_state[disp_state_stack._disp_index - 1] == OPERATE_UI)) strcpy(public_buf_l, preheat_menu.adjust_title); + if ((disp_state_stack._disp_state[disp_state_stack._disp_index - 1] == OPERATE_UI)) + strcpy(public_buf_l, preheat_menu.adjust_title); else strcpy(public_buf_l, preheat_menu.title); break; case SET_UI: @@ -292,7 +361,7 @@ char *getDispText(int index) { strcpy(public_buf_l, tool_menu.title); break; case WIFI_LIST_UI: - //strcpy(public_buf_l, list_menu.title); + // strcpy(public_buf_l, list_menu.title); break; case MACHINE_PARA_UI: strcpy(public_buf_l, MachinePara_menu.title); @@ -300,6 +369,9 @@ char *getDispText(int index) { case BABY_STEP_UI: strcpy(public_buf_l, operation_menu.babystep); break; + case EEPROM_SETTINGS_UI: + strcpy(public_buf_l, eeprom_menu.title); + break; default: break; } @@ -307,19 +379,19 @@ char *getDispText(int index) { } char *creat_title_text() { - int index = 0; + int index = 0; char *tmpText = 0; char tmpCurFileStr[20]; - memset(tmpCurFileStr, 0, sizeof(tmpCurFileStr)); + ZERO(tmpCurFileStr); #if _LFN_UNICODE - //cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr); + // cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr); #else cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr); #endif - memset(public_buf_m, 0, sizeof(public_buf_m)); + ZERO(public_buf_m); while (index <= disp_state_stack._disp_index) { tmpText = getDispText(index); @@ -335,15 +407,15 @@ char *creat_title_text() { } if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - /*|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI*/) { + /*|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI + || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI*/ + ) { titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)":"); titleText_cat(public_buf_m, sizeof(public_buf_m), tmpCurFileStr); } if (strlen(public_buf_m) > MAX_TITLE_LEN) { - memset(public_buf_m, 0, sizeof(public_buf_m)); - + ZERO(public_buf_m); tmpText = getDispText(0); if (*tmpText != 0) { titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); @@ -351,275 +423,425 @@ char *creat_title_text() { tmpText = getDispText(disp_state_stack._disp_index); if (*tmpText != 0) titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); } - } return public_buf_m; } #if HAS_GCODE_PREVIEW -uint32_t gPicturePreviewStart = 0; - -void preview_gcode_prehandle(char *path) { - #if ENABLED(SDSUPPORT) - //uint8_t re; - //uint32_t read; - uint32_t pre_read_cnt = 0; - uint32_t *p1; - char *cur_name; - - gPicturePreviewStart = 0; - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - card.read(public_buf, 512); - p1 = (uint32_t *)strstr((char *)public_buf, ";simage:"); - - if (p1) { - pre_read_cnt = (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); - - To_pre_view = pre_read_cnt; - gcode_preview_over = 1; - gCfgItems.from_flash_pic = 1; - update_spi_flash(); - } - else { - gcode_preview_over = 0; - default_preview_flg = 1; - gCfgItems.from_flash_pic = 0; - update_spi_flash(); - } - card.closefile(); - #endif -} -void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { - #if ENABLED(SDSUPPORT) - //uint8_t ress; - //uint32_t write; - volatile uint32_t i, j; - volatile uint16_t *p_index; - //int res; - char *cur_name; - - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - - if (gPicturePreviewStart <= 0) { - while (1) { - uint32_t br = card.read(public_buf, 400); - uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:"); - if (p1) { - gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); - break; - } - else { - gPicturePreviewStart += br; - } - if (br < 400) break; - } - } - - // SERIAL_ECHOLNPAIR("gPicturePreviewStart: ", gPicturePreviewStart, " PREVIEW_LITTLE_PIC_SIZE: ", PREVIEW_LITTLE_PIC_SIZE); - - card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); - #if ENABLED(SPI_GRAPHICAL_TFT) - SPI_TFT.spi_init(SPI_FULL_SPEED); - //SPI_TFT.SetCursor(0,0); - SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); - SPI_TFT.LCD_WriteRAM_Prepare(); - #else - ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); - LCD_WriteRAM_Prepare(); - #endif + uint32_t gPicturePreviewStart = 0; - j = i = 0; + void preview_gcode_prehandle(char *path) { + #if ENABLED(SDSUPPORT) + // uint8_t re; + // uint32_t read; + uint32_t pre_read_cnt = 0; + uint32_t *p1; + char *cur_name; - while (1) { - card.read(public_buf, 400); - for (i = 0; i < 400;) { - bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); - i += 2; - j++; - } + gPicturePreviewStart = 0; + cur_name = strrchr(path, '/'); + card.openFileRead(cur_name); + card.read(public_buf, 512); + p1 = (uint32_t *)strstr((char *)public_buf, ";simage:"); - //if (i > 800) break; - //#ifdef TFT70 - //if (j>400) { - // f_read(file, buff_pic, 1, &read); - // break; - //} - //#elif defined(TFT35) - if (j >= 400) - //f_read(file, buff_pic, 1, &read); - break; - //#endif + if (p1) { + pre_read_cnt = (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); - } - #if ENABLED(SPI_GRAPHICAL_TFT) - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; + To_pre_view = pre_read_cnt; + gcode_preview_over = 1; + gCfgItems.from_flash_pic = 1; + update_spi_flash(); } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(bmp_public_buf, 400, true); - SPI_TFT_CS_H; - #else - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color; - LCD_IO_WriteData(*p_index); - i += 2; + else { + gcode_preview_over = 0; + default_preview_flg = 1; + gCfgItems.from_flash_pic = 0; + update_spi_flash(); } - #endif - #if HAS_BAK_VIEW_IN_FLASH - W25QXX.init(SPI_QUARTER_SPEED); - if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); - W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); - #endif - row++; - if (row >= 200) { - size = 809; - row = 0; - - gcode_preview_over = 0; - //flash_preview_begin = 1; - card.closefile(); + #endif + } - /* - if (gCurFileState.file_open_flag != 0xaa) { - reset_file_info(); - res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); - if (res == FR_OK) { - f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xaa; - //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); - srcfp = file; - mksReprint.mks_printer_state = MKS_WORKING; - once_flag = 0; + #if 1 + + void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { + #if ENABLED(SDSUPPORT) + // uint8_t ress; + // uint32_t write; + volatile uint32_t i, j; + volatile uint16_t *p_index; + // int res; + char *cur_name; + + cur_name = strrchr(path, '/'); + card.openFileRead(cur_name); + + if (gPicturePreviewStart <= 0) { + while (1) { + uint32_t br = card.read(public_buf, 400); + uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:"); + if (p1) { + gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); + break; + } + else { + gPicturePreviewStart += br; + } + if (br < 400) break; + } } - } - */ - char *cur_name; - cur_name = strrchr(list_file.file_name[sel_id], '/'); + // SERIAL_ECHOLNPAIR("gPicturePreviewStart: ", gPicturePreviewStart, " PREVIEW_LITTLE_PIC_SIZE: ", PREVIEW_LITTLE_PIC_SIZE); + + card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); + #if ENABLED(TFT_LVGL_UI_SPI) + SPI_TFT.spi_init(SPI_FULL_SPEED); + // SPI_TFT.SetCursor(0,0); + SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); + SPI_TFT.LCD_WriteRAM_Prepare(); + #else + ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); + LCD_WriteRAM_Prepare(); + #endif - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } + j = i = 0; - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - // saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - if (EXTRUDERS == 2) { - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01; + while (1) { + card.read(public_buf, 400); + for (i = 0; i < 400;) { + bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); + i += 2; + j++; + } + if (j >= 400) break; } - card.startFileprint(); - TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = 0; - } - return; + #if ENABLED(TFT_LVGL_UI_SPI) + uint16_t Color, SpiColor; + SpiColor = (LV_COLOR_BACKGROUND.full >> 8) | ((LV_COLOR_BACKGROUND.full & 0xFF) << 8); + for (i = 0; i < 400;) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + Color = (*p_index >> 8); + *p_index = Color | ((*p_index & 0xFF) << 8); + i += 2; + if (*p_index == 0x0000) *p_index = SpiColor; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(bmp_public_buf, 400, true); + SPI_TFT_CS_H; + #else + for (i = 0; i < 400;) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // gCfgItems.preview_bk_color; + LCD_IO_WriteData(*p_index); + i += 2; + } + #endif + #if HAS_BAK_VIEW_IN_FLASH + W25QXX.init(SPI_QUARTER_SPEED); + if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); + W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); + #endif + row++; + if (row >= 200) { + size = 809; + row = 0; + + gcode_preview_over = 0; + // flash_preview_begin = 1; + + card.closefile(); + + /* + if (gCurFileState.file_open_flag != 0xaa) { + reset_file_info(); + res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); + if (res == FR_OK) { + f_lseek(file,PREVIEW_SIZE+To_pre_view); + gCurFileState.file_open_flag = 0xaa; + //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); + srcfp = file; + mksReprint.mks_printer_state = MKS_WORKING; + once_flag = 0; + } + } + */ + char *cur_name; + + cur_name = strrchr(list_file.file_name[sel_id], '/'); + + SdFile file; + SdFile *curDir; + card.endFilePrint(); + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_READ)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + update_spi_flash(); + } + + card.openFileRead(cur_name); + if (card.isFileOpen()) { + feedrate_percentage = 100; + // saved_feedrate_percentage = feedrate_percentage; + planner.flow_percentage[0] = 100; + planner.e_factor[0] = planner.flow_percentage[0] * 0.01; + if (EXTRUDERS == 2) { + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01; + } + card.startFileprint(); + TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); + once_flag = 0; + } + return; + } + card.closefile(); + #endif // SDSUPPORT } - card.closefile(); - #endif // SDSUPPORT -} -void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { - int index; - int x_off = 0, y_off = 0; - int _y; - uint16_t *p_index; - int i; - uint16_t temp_p; + #else // if 1 + + void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { + #if ENABLED(SDSUPPORT) + // uint8_t ress; + // uint32_t write; + volatile uint32_t i, j; + volatile uint16_t *p_index; + // int res; + char *cur_name; + uint16_t Color; + + cur_name = strrchr(path, '/'); + card.openFileRead(cur_name); + + card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); + #if ENABLED(TFT_LVGL_UI_SPI) + SPI_TFT.spi_init(SPI_FULL_SPEED); + // SPI_TFT.SetCursor(0,0); + SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); + SPI_TFT.LCD_WriteRAM_Prepare(); + #else + ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); + LCD_WriteRAM_Prepare(); + #endif - for (index = 0; index < 10; index++) { // 200*200 - #if HAS_BAK_VIEW_IN_FLASH - if (sel == 1) flash_view_Read(bmp_public_buf, 8000); //20k - //memset(bmp_public_buf,0x1f,8000); - else - //memset(bmp_public_buf,0x1f,8000); - default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); //20k - #else - default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); //20k - #endif + j = 0; + i = 0; - i = 0; - #if ENABLED(SPI_GRAPHICAL_TFT) - //SPI_TFT.spi_init(SPI_FULL_SPEED); - //SPI_TFT.SetWindows(xpos_pixel, y_off * 20+ypos_pixel, 200,20); //200*200 - //SPI_TFT.LCD_WriteRAM_Prepare(); - j = 0; - for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { - SPI_TFT.spi_init(SPI_FULL_SPEED); - SPI_TFT.SetWindows(xpos_pixel, y_off * 20 + ypos_pixel + j, 200, 1); //200*200 - SPI_TFT.LCD_WriteRAM_Prepare(); - - j++; - //memcpy(public_buf,&bmp_public_buf[i],400); - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(&bmp_public_buf[i], 400, true); - SPI_TFT_CS_H; - - i += 400; - if (i >= 8000) break; - } - #else - ili9320_SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); //200*200 + while (1) { + card.read(public_buf, 400); + for (i = 0; i < 400;) { + bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); + i += 2; + j++; + } + + //if (i > 800) break; + //#ifdef TFT70 + // if (j > 400) { + // f_read(file, buff_pic, 1, &read); + // break; + // } + //#elif defined(TFT35) + if (j >= 400) + //f_read(file, buff_pic, 1, &read); + break; + //#endif - LCD_WriteRAM_Prepare(); + } + #if ENABLED(TFT_LVGL_UI_SPI) + for (i = 0; i < 400;) { + p_index = (uint16_t *)(&bmp_public_buf[i]); - for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { - for (x_off = 0; x_off < 200; x_off++) { - if (sel == 1) { - temp_p = (uint16_t)(bmp_public_buf[i] | bmp_public_buf[i + 1] << 8); - p_index = &temp_p; + Color = (*p_index >> 8); + *p_index = Color | ((*p_index & 0xff) << 8); + i += 2; + if (*p_index == 0x0000) *p_index = 0xC318; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(bmp_public_buf, 400, true); + SPI_TFT_CS_H; + + #else + for (i = 0; i < 400;) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + if (*p_index == 0x0000) *p_index = 0x18C3; + LCD_IO_WriteData(*p_index); + i = i + 2; } - else { + #endif + W25QXX.init(SPI_QUARTER_SPEED); + if (row < 20) + W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); + W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); + row++; + if (row >= 200) { + size = 809; + row = 0; + + gcode_preview_over = 0; + // flash_preview_begin = 1; + + card.closefile(); + + /* + if (gCurFileState.file_open_flag != 0xaa) { + reset_file_info(); + res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); + if (res == FR_OK) { + f_lseek(file,PREVIEW_SIZE+To_pre_view); + gCurFileState.file_open_flag = 0xaa; + //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); + srcfp = file; + mksReprint.mks_printer_state = MKS_WORKING; + once_flag = 0; + } + } + */ + char *cur_name; + + cur_name = strrchr(list_file.file_name[sel_id], '/'); + + SdFile file; + SdFile *curDir; + card.endFilePrint(); + const char * const fname = card.diveToFile(true, curDir, cur_name); + if (!fname) return; + if (file.open(curDir, fname, O_READ)) { + gCfgItems.curFilesize = file.fileSize(); + file.close(); + update_spi_flash(); + } + + card.openFileRead(cur_name); + if (card.isFileOpen()) { + feedrate_percentage = 100; + // saved_feedrate_percentage = feedrate_percentage; + planner.flow_percentage[0] = 100; + planner.e_factor[0] = planner.flow_percentage[0] * 0.01; + if (EXTRUDERS == 2) { + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01; + } + card.startFileprint(); + TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); + once_flag = 0; + } + return; + } + card.closefile(); + #endif // SDSUPPORT + } + + #endif // if 1 + + void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { + int index; + int y_off = 0; + int _y; + uint16_t *p_index; + int i; + + for (index = 0; index < 10; index++) { // 200*200 + #if HAS_BAK_VIEW_IN_FLASH + if (sel == 1) { + flash_view_Read(bmp_public_buf, 8000); // 20k + } + else { + default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 20k + #if ENABLED(TFT_LVGL_UI_SPI) + uint16_t Color; + for (i = 0; i < (DEFAULT_VIEW_MAX_SIZE / 10);) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + Color = (*p_index >> 8); + *p_index = Color | ((*p_index & 0xff) << 8); + i += 2; + } + #endif + } + #else + default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 20k + #if ENABLED(TFT_LVGL_UI_SPI) + for (i = 0; i < (DEFAULT_VIEW_MAX_SIZE / 10);) { p_index = (uint16_t *)(&bmp_public_buf[i]); + Color = (*p_index >> 8); + *p_index = Color | ((*p_index & 0xff) << 8); + i += 2; + } + #endif + #endif + + i = 0; + #if ENABLED(TFT_LVGL_UI_SPI) + + // SPI_TFT.spi_init(SPI_FULL_SPEED); + // SPI_TFT.SetWindows(xpos_pixel, y_off * 20+ypos_pixel, 200,20); //200*200 + // SPI_TFT.LCD_WriteRAM_Prepare(); + int j = 0; + for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { + SPI_TFT.spi_init(SPI_FULL_SPEED); + SPI_TFT.SetWindows(xpos_pixel, y_off * 20 + ypos_pixel + j, 200, 1); // 200*200 + SPI_TFT.LCD_WriteRAM_Prepare(); + + j++; + // memcpy(public_buf,&bmp_public_buf[i],400); + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(&bmp_public_buf[i], 400, true); + SPI_TFT_CS_H; + + i += 400; + if (i >= 8000) break; + } + #else + int x_off = 0; + uint16_t temp_p; + ili9320_SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 + + LCD_WriteRAM_Prepare(); + + for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { + for (x_off = 0; x_off < 200; x_off++) { + if (sel == 1) { + temp_p = (uint16_t)(bmp_public_buf[i] | bmp_public_buf[i + 1] << 8); + p_index = &temp_p; + } + else { + p_index = (uint16_t *)(&bmp_public_buf[i]); + } + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // gCfgItems.preview_bk_color; + LCD_IO_WriteData(*p_index); + i += 2; } - if (*p_index == 0x0000)*p_index=LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color; - LCD_IO_WriteData(*p_index); - i += 2; + if (i >= 8000) break; } - if (i >= 8000) break; + #endif // if ENABLED(TFT_LVGL_UI_SPI) + y_off++; + } + W25QXX.init(SPI_QUARTER_SPEED); + } + + void disp_pre_gcode(int xpos_pixel, int ypos_pixel) { + if (gcode_preview_over == 1) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel); + #if HAS_BAK_VIEW_IN_FLASH + if (flash_preview_begin == 1) { + flash_preview_begin = 0; + Draw_default_preview(xpos_pixel, ypos_pixel, 1); + } + #endif + #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH + if (default_preview_flg == 1) { + Draw_default_preview(xpos_pixel, ypos_pixel, 0); + default_preview_flg = 0; } #endif - y_off++; } - W25QXX.init(SPI_QUARTER_SPEED); -} - -void disp_pre_gcode(int xpos_pixel, int ypos_pixel) { - if (gcode_preview_over == 1) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel); - #if HAS_BAK_VIEW_IN_FLASH - if (flash_preview_begin == 1) { - flash_preview_begin = 0; - Draw_default_preview(xpos_pixel, ypos_pixel, 1); - } - #endif - #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH - if (default_preview_flg == 1) { - Draw_default_preview(xpos_pixel, ypos_pixel, 0); - default_preview_flg = 0; - } - #endif -} -#endif +#endif // if HAS_GCODE_PREVIEW void print_time_run() { static uint8_t lastSec = 0; @@ -644,7 +866,7 @@ void GUI_RefreshPage() { switch (disp_state) { case MAIN_UI: - lv_draw_ready_print(); + // lv_draw_ready_print(); break; case EXTRUSION_UI: if (temperature_change_frequency == 1) { @@ -721,7 +943,7 @@ void GUI_RefreshPage() { { memset((char *)gCfgItems.move_z_coordinate, ' ', sizeof(gCfgItems.move_z_coordinate)); GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); - sprintf((char *)gCfgItems.move_z_coordinate, "Z: %.3f", current_position[Z_AXIS]); + sprintf_P((char *)gCfgItems.move_z_coordinate, PSTR("Z: %.3f"), current_position[Z_AXIS]); GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); } } @@ -831,7 +1053,7 @@ void clear_cur_ui() { switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { case PRINT_READY_UI: - //Get_Temperature_Flg = 0; + // Get_Temperature_Flg = 0; lv_clear_ready_print(); break; case PRINT_FILE_UI: @@ -844,7 +1066,7 @@ void clear_cur_ui() { lv_clear_move_motor(); break; case OPERATE_UI: - lv_clear_opration(); + lv_clear_operation(); break; case PAUSE_UI: //Clear_pause(); @@ -931,16 +1153,16 @@ void clear_cur_ui() { //Clear_Tips(); break; case MACHINE_PARA_UI: - //Clear_MachinePara(); + lv_clear_machine_para(); break; case MACHINE_SETTINGS_UI: - //Clear_MachineSettings(); + lv_clear_machine_settings(); break; case TEMPERATURE_SETTINGS_UI: //Clear_TemperatureSettings(); break; case MOTOR_SETTINGS_UI: - //Clear_MotorSettings(); + lv_clear_motor_settings(); break; case MACHINETYPE_UI: //Clear_MachineType(); @@ -970,16 +1192,18 @@ void clear_cur_ui() { //Clear_XYZLevelPara(); break; case MAXFEEDRATE_UI: - //Clear_MaxFeedRate(); + lv_clear_max_feedrate_settings(); break; case STEPS_UI: - //Clear_Steps(); + lv_clear_step_settings(); break; case ACCELERATION_UI: - //Clear_Acceleration(); + lv_clear_acceleration_settings(); break; case JERK_UI: - //Clear_Jerk(); + #if HAS_CLASSIC_JERK + lv_clear_jerk_settings(); + #endif break; case MOTORDIR_UI: //Clear_MotorDir(); @@ -994,7 +1218,7 @@ void clear_cur_ui() { //Clear_HotbedConfig(); break; case ADVANCED_UI: - //Clear_Advanced(); + lv_clear_advance_settings(); break; case DOUBLE_Z_UI: //Clear_DoubleZ(); @@ -1003,15 +1227,31 @@ void clear_cur_ui() { //Clear_EnableInvert(); break; case NUMBER_KEY_UI: - //Clear_NumberKey(); + lv_clear_number_key(); break; case BABY_STEP_UI: //Clear_babyStep(); break; + case PAUSE_POS_UI: + lv_clear_pause_position(); + break; + #if HAS_TRINAMIC_CONFIG + case TMC_CURRENT_UI: + lv_clear_tmc_current_settings(); + break; + #endif + case EEPROM_SETTINGS_UI: + lv_clear_eeprom_settings(); + break; + #if HAS_STEALTHCHOP + case TMC_MODE_UI: + lv_clear_tmc_step_mode_settings(); + break; + #endif default: break; } - //GUI_Clear(); + // GUI_Clear(); } void draw_return_ui() { @@ -1034,13 +1274,13 @@ void draw_return_ui() { lv_draw_move_motor(); break; case OPERATE_UI: - lv_draw_opration(); + lv_draw_operation(); break; #if 1 - case PAUSE_UI: - //draw_pause(); - break; + case PAUSE_UI: + //draw_pause(); + break; #endif case EXTRUSION_UI: @@ -1075,9 +1315,9 @@ void draw_return_ui() { break; #if tan_mask - case LOG_UI: - //draw_Connect(); - break; + case LOG_UI: + //draw_Connect(); + break; #endif case CALIBRATE_UI: @@ -1106,9 +1346,9 @@ void draw_return_ui() { break; #if tan_mask - case ZOFFSET_UI: - //draw_Zoffset(); - break; + case ZOFFSET_UI: + //draw_Zoffset(); + break; #endif case TOOL_UI: @@ -1130,16 +1370,16 @@ void draw_return_ui() { //draw_Tips(); break; case MACHINE_PARA_UI: - //draw_MachinePara(); + lv_draw_machine_para(); break; case MACHINE_SETTINGS_UI: - //draw_MachineSettings(); + lv_draw_machine_settings(); break; case TEMPERATURE_SETTINGS_UI: //draw_TemperatureSettings(); break; case MOTOR_SETTINGS_UI: - //draw_MotorSettings(); + lv_draw_motor_settings(); break; case MACHINETYPE_UI: //draw_MachineType(); @@ -1169,16 +1409,18 @@ void draw_return_ui() { //draw_XYZLevelPara(); break; case MAXFEEDRATE_UI: - //draw_MaxFeedRate(); + lv_draw_max_feedrate_settings(); break; case STEPS_UI: - //draw_Steps(); + lv_draw_step_settings(); break; case ACCELERATION_UI: - //draw_Acceleration(); + lv_draw_acceleration_settings(); break; case JERK_UI: - //draw_Jerk(); + #if HAS_CLASSIC_JERK + lv_draw_jerk_settings(); + #endif break; case MOTORDIR_UI: //draw_MotorDir(); @@ -1193,7 +1435,7 @@ void draw_return_ui() { //draw_HotbedConfig(); break; case ADVANCED_UI: - //draw_Advanced(); + lv_draw_advance_settings(); break; case DOUBLE_Z_UI: //draw_DoubleZ(); @@ -1202,7 +1444,7 @@ void draw_return_ui() { //draw_EnableInvert(); break; case NUMBER_KEY_UI: - //draw_NumberKey(); + lv_draw_number_key(); break; case DIALOG_UI: //draw_dialog(DialogType); @@ -1210,6 +1452,22 @@ void draw_return_ui() { case BABY_STEP_UI: //draw_babyStep(); break; + case PAUSE_POS_UI: + lv_draw_pause_position(); + break; + #if HAS_TRINAMIC_CONFIG + case TMC_CURRENT_UI: + lv_draw_tmc_current_settings(); + break; + #endif + case EEPROM_SETTINGS_UI: + lv_draw_eeprom_settings(); + break; + #if HAS_STEALTHCHOP + case TMC_MODE_UI: + lv_draw_tmc_step_mode_settings(); + break; + #endif default: break; } } @@ -1228,6 +1486,13 @@ void draw_return_ui() { #endif +void lv_ex_line(lv_obj_t * line, lv_point_t *points) { + /*Copy the previous line and apply the new style*/ + lv_line_set_points(line, points, 2); /*Set the points*/ + lv_line_set_style(line, LV_LINE_STYLE_MAIN, &style_line); + lv_obj_align(line, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); +} + extern volatile uint32_t systick_uptime_millis; void print_time_count() { @@ -1236,14 +1501,14 @@ void print_time_count() { } void LV_TASK_HANDLER() { - //lv_tick_inc(1); + // lv_tick_inc(1); lv_task_handler(); - TERN_(MKS_TEST, mks_test()); + if (mks_test_flag == 0x1e) mks_hardware_test(); #if HAS_GCODE_PREVIEW disp_pre_gcode(2, 36); #endif GUI_RefreshPage(); - //sd_detection(); + // sd_detection(); } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 612ba4b51cad..5c114c2ac13f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -22,16 +22,17 @@ #pragma once #ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ + extern "C" { /* C-declarations for C++ */ #endif +#include + #include #include -#include "lvgl.h" -//the colors of the last MKS Ui +// the colors of the last MKS Ui #undef LV_COLOR_BACKGROUND -#define LV_COLOR_BACKGROUND LV_COLOR_MAKE(0x1A, 0x1A, 0x1A) //LV_COLOR_MAKE(0x00, 0x00, 0x00) +#define LV_COLOR_BACKGROUND LV_COLOR_MAKE(0x1A, 0x1A, 0x1A) // LV_COLOR_MAKE(0x00, 0x00, 0x00) #include "tft_multi_language.h" #include "draw_ready_print.h" @@ -41,7 +42,7 @@ extern "C" { /* C-declarations for C++ */ #include "draw_print_file.h" #include "draw_dialog.h" #include "draw_printing.h" -#include "draw_opration.h" +#include "draw_operation.h" #include "draw_preHeat.h" #include "draw_extrusion.h" #include "draw_home.h" @@ -51,7 +52,22 @@ extern "C" { /* C-declarations for C++ */ #include "draw_change_speed.h" #include "draw_manuaLevel.h" #include "draw_error_message.h" -#include "printer_opration.h" +#include "printer_operation.h" +#include "draw_machine_para.h" +#include "draw_machine_settings.h" +#include "draw_motor_settings.h" +#include "draw_advance_settings.h" +#include "draw_acceleration_settings.h" +#include "draw_number_key.h" +#include "draw_jerk_settings.h" +#include "draw_pause_position.h" +#include "draw_step_settings.h" +#include "draw_tmc_current_settings.h" +#include "draw_eeprom_settings.h" +#include "draw_max_feedrate_settings.h" +#include "draw_tmc_step_mode_settings.h" + +#include "../../inc/MarlinConfigPre.h" #define TFT35 @@ -70,8 +86,8 @@ extern "C" { /* C-declarations for C++ */ #define BUTTON_TEXT_Y_OFFSET -20 - #define TITLE_XPOS 3 //TFT_screen.title_xpos - #define TITLE_YPOS 5 //TFT_screen.title_ypos + #define TITLE_XPOS 3 // TFT_screen.title_xpos + #define TITLE_YPOS 5 // TFT_screen.title_ypos #define FILE_BTN_CNT 6 @@ -81,17 +97,39 @@ extern "C" { /* C-declarations for C++ */ #define FILE_PRE_PIC_X_OFFSET 8 #define FILE_PRE_PIC_Y_OFFSET 0 - #define PREVIEW_LITTLE_PIC_SIZE 40910//400*100+9*101+1 - #define PREVIEW_SIZE 202720//(PREVIEW_LITTLE_PIC_SIZE+800*200+201*9+1) + #define PREVIEW_LITTLE_PIC_SIZE 40910 // 400*100+9*101+1 + #define PREVIEW_SIZE 202720 // (PREVIEW_LITTLE_PIC_SIZE+800*200+201*9+1) #define GCFG_FLAG_VALUE 0xEE -#else + // machine parameter ui + #define PARA_UI_POS_X 10 + #define PARA_UI_POS_Y 50 + + #define PARA_UI_SIZE_X 450 + #define PARA_UI_SIZE_Y 40 + + #define PARA_UI_ARROW_V 12 + + #define PARA_UI_BACL_POS_X 400 + #define PARA_UI_BACL_POS_Y 270 + + #define PARA_UI_TURN_PAGE_POS_X 320 + #define PARA_UI_TURN_PAGE_POS_Y 270 + + #define PARA_UI_VALUE_SIZE_X 370 + #define PARA_UI_VALUE_POS_X 400 + #define PARA_UI_VALUE_V 5 + + #define PARA_UI_STATE_POS_X 380 + #define PARA_UI_STATE_V 2 + +#else // ifdef TFT35 #define TFT_WIDTH 320 #define TFT_HEIGHT 240 -#endif +#endif // ifdef TFT35 extern char public_buf_m[100]; extern char public_buf_l[30]; @@ -104,6 +142,9 @@ typedef struct { uint8_t from_flash_pic; uint8_t finish_power_off; uint8_t pause_reprint; + float pausePosX; + float pausePosY; + float pausePosZ; uint32_t curFilesize; } CFG_ITMES; @@ -111,7 +152,8 @@ typedef struct { uint8_t curTempType : 1, curSprayerChoose : 3, stepHeat : 4; - uint8_t leveling_first_time : 1; + uint8_t leveling_first_time : 1, + para_ui_page : 1; uint8_t extruStep; uint8_t extruSpeed; uint8_t print_state; @@ -185,7 +227,11 @@ typedef enum { ENABLE_INVERT_UI, NUMBER_KEY_UI, BABY_STEP_UI, - ERROR_MESSAGE_UI + ERROR_MESSAGE_UI, + PAUSE_POS_UI, + TMC_CURRENT_UI, + TMC_MODE_UI, + EEPROM_SETTINGS_UI } DISP_STATE; typedef struct { @@ -203,6 +249,46 @@ typedef struct { } PRINT_TIME; extern PRINT_TIME print_time; +typedef enum { + PrintAcceleration, + RetractAcceleration, + TravelAcceleration, + XAcceleration, + YAcceleration, + ZAcceleration, + E0Acceleration, + E1Acceleration, + + XMaxFeedRate, + YMaxFeedRate, + ZMaxFeedRate, + E0MaxFeedRate, + E1MaxFeedRate, + + XJerk, + YJerk, + ZJerk, + EJerk, + + Xstep, + Ystep, + Zstep, + E0step, + E1step, + + Xcurrent, + Ycurrent, + Zcurrent, + E0current, + E1current, + + pause_pos_x, + pause_pos_y, + pause_pos_z + +}value_state; +extern value_state value; + extern CFG_ITMES gCfgItems; extern UI_CFG uiCfg; extern DISP_STATE disp_state; @@ -210,8 +296,16 @@ extern DISP_STATE last_disp_state; extern DISP_STATE_STACK disp_state_stack; extern lv_style_t tft_style_scr; -extern lv_style_t tft_style_lable_pre; -extern lv_style_t tft_style_lable_rel; +extern lv_style_t tft_style_label_pre; +extern lv_style_t tft_style_label_rel; +extern lv_style_t style_line; +extern lv_style_t style_para_value_pre; +extern lv_style_t style_para_value_rel; +extern lv_style_t style_num_key_pre; +extern lv_style_t style_num_key_rel; +extern lv_style_t style_num_text; + +extern lv_point_t line_points[4][2]; extern void gCfgItems_init(); extern void ui_cfg_init(); @@ -230,6 +324,7 @@ extern void gCfg_to_spiFlah(); extern void print_time_count(); extern void LV_TASK_HANDLER(); +extern void lv_ex_line(lv_obj_t * line, lv_point_t *points); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp index 2d7b7d440b69..856d645e9ed4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp @@ -21,11 +21,12 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" -#include "lvgl.h" #include "pic_manager.h" +#include + +#include "../../../../inc/MarlinConfig.h" #if HAS_SPI_FLASH_FONT @@ -46,10 +47,10 @@ typedef struct { } glyph_dsc_t; static x_header_t __g_xbf_hd = { .min = 0, .max = 0, .bpp = 0 }; -static uint8_t __g_font_buf[75]; +static uint8_t __g_font_buf[63]; static uint8_t *__user_font_getdata(int offset, int size) { - //memset(__g_font_buf,0,sizeof(__g_font_buf)); + //ZERO(__g_font_buf); get_spi_flash_data((char *)__g_font_buf, offset, size); return __g_font_buf; //return &buf_test[offset]; @@ -106,10 +107,9 @@ lv_font_t gb2312_puhui32; void init_gb2312_font() { gb2312_puhui32.get_glyph_bitmap = __user_font_get_bitmap; gb2312_puhui32.get_glyph_dsc = __user_font_get_glyph_dsc; - gb2312_puhui32.line_height = 25; + gb2312_puhui32.line_height = 21; gb2312_puhui32.base_line = 0; } #endif // HAS_SPI_FLASH_FONT - -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index a4061eec2c2e..54db9dd5b049 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -21,63 +21,69 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI + +#if ENABLED(TFT_LVGL_UI_SPI) + #include "SPI_TFT.h" +#endif #include "tft_lvgl_configuration.h" -#include "lvgl.h" #include "draw_ready_print.h" #include "W25Qxx.h" #include "mks_hardware_test.h" +#include "draw_ui.h" +#include "pic_manager.h" +#include #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" #include "../../../../feature/touch/xpt2046.h" +#include "../../../../sd/cardreader.h" -#include "pic_manager.h" - -#if ENABLED(MKS_TEST) - - extern uint8_t curent_disp_ui; - - uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det2_sta, mt_det3_sta; - uint8_t endstopx1_sta, endstopx2_sta, endstopy1_sta, endstopy2_sta, endstopz1_sta, endstopz2_sta; - void test_gpio_readlevel_L() { +uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det2_sta, mt_det3_sta; +uint8_t endstopx1_sta, endstopx2_sta, endstopy1_sta, endstopy2_sta, endstopz1_sta, endstopz2_sta; +void test_gpio_readlevel_L() { + #if ENABLED(MKS_TEST) volatile uint32_t itest; - WRITE(WIFI_IO2_PIN, HIGH); + WRITE(WIFI_IO0_PIN, HIGH); itest = 10000; while (itest--); pw_det_sta = (READ(POWER_LOSS_PIN) == 0); pw_off_sta = (READ(PS_ON_PIN) == 0); - mt_det_sta = (READ(FIL_RUNOUT_PIN) == 0); - mt_det2_sta = (READ(FIL_RUNOUT_2_PIN) == 0); - mt_det3_sta = (READ(FIL_RUNOUT_3_PIN) == 0); + mt_det_sta = (READ(MT_DET_1_PIN) == 0); + mt_det2_sta = (READ(MT_DET_2_PIN) == 0); + //mt_det3_sta = (READ(FIL_RUNOUT_3_PIN) == 0); endstopx1_sta = (READ(X_MIN_PIN) == 0); endstopx2_sta = (READ(X_MAX_PIN) == 0); endstopy1_sta = (READ(Y_MIN_PIN) == 0); endstopy2_sta = (READ(Y_MAX_PIN) == 0); endstopz1_sta = (READ(Z_MIN_PIN) == 0); endstopz2_sta = (READ(Z_MAX_PIN) == 0); - } + #endif +} - void test_gpio_readlevel_H() { +void test_gpio_readlevel_H() { + #if ENABLED(MKS_TEST) volatile uint32_t itest; - WRITE(WIFI_IO2_PIN, LOW); + WRITE(WIFI_IO0_PIN, LOW); itest = 10000; while (itest--); pw_det_sta = (READ(POWER_LOSS_PIN) == 1); pw_off_sta = (READ(PS_ON_PIN) == 1); - mt_det_sta = (READ(FIL_RUNOUT_PIN) == 1); - mt_det2_sta = (READ(FIL_RUNOUT_2_PIN) == 1); - mt_det3_sta = (READ(FIL_RUNOUT_3_PIN) == 1); + mt_det_sta = (READ(MT_DET_1_PIN) == 1); + mt_det2_sta = (READ(MT_DET_2_PIN) == 1); + //mt_det3_sta = (READ(MT_DET_3_PIN) == 1); endstopx1_sta = (READ(X_MIN_PIN) == 1); endstopx2_sta = (READ(X_MAX_PIN) == 1); endstopy1_sta = (READ(Y_MIN_PIN) == 1); endstopy2_sta = (READ(Y_MAX_PIN) == 1); endstopz1_sta = (READ(Z_MIN_PIN) == 1); endstopz2_sta = (READ(Z_MAX_PIN) == 1); - } + #endif +} - void init_Tst_GPIO() { +void init_test_gpio() { + #ifdef MKS_TEST SET_INPUT_PULLUP(X_MIN_PIN); SET_INPUT_PULLUP(X_MAX_PIN); SET_INPUT_PULLUP(Y_MIN_PIN); @@ -85,70 +91,77 @@ SET_INPUT_PULLUP(Z_MIN_PIN); SET_INPUT_PULLUP(Z_MAX_PIN); - SET_OUTPUT(WIFI_IO2_PIN); + SET_OUTPUT(WIFI_IO0_PIN); - SET_INPUT_PULLUP(FIL_RUNOUT_PIN); - SET_INPUT_PULLUP(FIL_RUNOUT_2_PIN); - SET_INPUT_PULLUP(FIL_RUNOUT_3_PIN); + SET_INPUT_PULLUP(MT_DET_1_PIN); + SET_INPUT_PULLUP(MT_DET_2_PIN); + //SET_INPUT_PULLUP(MT_DET_3_PIN); SET_INPUT_PULLUP(POWER_LOSS_PIN); SET_INPUT_PULLUP(PS_ON_PIN); SET_INPUT_PULLUP(SERVO0_PIN); - SET_OUTPUT(E0_ENABLE_PIN); SET_OUTPUT(X_ENABLE_PIN); + SET_OUTPUT(Y_ENABLE_PIN); + SET_OUTPUT(Z_ENABLE_PIN); + SET_OUTPUT(E0_ENABLE_PIN); + SET_OUTPUT(E1_ENABLE_PIN); WRITE(X_ENABLE_PIN, LOW); WRITE(Y_ENABLE_PIN, LOW); WRITE(Z_ENABLE_PIN, LOW); WRITE(E0_ENABLE_PIN, LOW); WRITE(E1_ENABLE_PIN, LOW); - WRITE(E2_ENABLE_PIN, LOW); - } + //WRITE(E2_ENABLE_PIN, LOW); + #endif +} - void mks_test_beeper() { +void mks_test_beeper() { + #ifdef MKS_TEST WRITE(BEEPER_PIN, HIGH); delay(100); WRITE(BEEPER_PIN, LOW); delay(100); - } + #endif +} - void Test_GPIO() { - init_Tst_GPIO(); +void mks_gpio_test(){ + #if ENABLED(MKS_TEST) + init_test_gpio(); test_gpio_readlevel_L(); test_gpio_readlevel_H(); test_gpio_readlevel_L(); - if ((pw_det_sta == 1) && (mt_det_sta == 1) && (mt_det2_sta == 1) && (mt_det3_sta == 1)) { - if (curent_disp_ui == 1) disp_det_ok(); - } - else if (curent_disp_ui == 1) disp_det_error(); - if ((endstopx1_sta == 1) - && (endstopx2_sta == 1) - && (endstopy1_sta == 1) - && (endstopy2_sta == 1) - && (endstopz1_sta == 1) - && (endstopz2_sta == 1) - ) { - if (curent_disp_ui == 1) disp_Limit_ok(); - } - else if (curent_disp_ui == 1) - disp_Limit_error(); - //mks_test_beeper(); + if ((pw_det_sta == 1) && (mt_det_sta == 1) && (mt_det2_sta == 1)) // &&(mt_det3_sta == 1)) + disp_det_ok(); + else + disp_det_error(); - } + if ( (endstopx1_sta == 1) + && (endstopx2_sta == 1) + && (endstopy1_sta == 1) + && (endstopy2_sta == 1) + && (endstopz1_sta == 1) + && (endstopz2_sta == 1) + ) + disp_Limit_ok(); + else + disp_Limit_error(); + #endif +} - void mks_test() { +void mks_hardware_test(){ + #if ENABLED(MKS_TEST) if (millis() % 2000 < 1000) { WRITE(X_DIR_PIN, LOW); WRITE(Y_DIR_PIN, LOW); WRITE(Z_DIR_PIN, LOW); WRITE(E0_DIR_PIN, LOW); WRITE(E1_DIR_PIN, LOW); - WRITE(E2_DIR_PIN, LOW); + //WRITE(E2_DIR_PIN, LOW); thermalManager.fan_speed[0] = 255; - WRITE(HEATER_2_PIN, HIGH); // HE2 + //WRITE(HEATER_2_PIN, HIGH); // HE2 WRITE(HEATER_1_PIN, HIGH); // HE1 WRITE(HEATER_0_PIN, HIGH); // HE0 WRITE(HEATER_BED_PIN, HIGH); // HOT-BED @@ -159,28 +172,29 @@ WRITE(Z_DIR_PIN, HIGH); WRITE(E0_DIR_PIN, HIGH); WRITE(E1_DIR_PIN, HIGH); - WRITE(E2_DIR_PIN, HIGH); + //WRITE(E2_DIR_PIN, HIGH); thermalManager.fan_speed[0] = 0; - WRITE(HEATER_2_PIN, LOW); // HE2 + //WRITE(HEATER_2_PIN, LOW); // HE2 WRITE(HEATER_1_PIN, LOW); // HE1 WRITE(HEATER_0_PIN, LOW); // HE0 WRITE(HEATER_BED_PIN, LOW); // HOT-BED } - if ((endstopx1_sta == 1) && (endstopx2_sta == 1) - && (endstopy1_sta == 1) && (endstopy2_sta == 1) - && (endstopz1_sta == 1) && (endstopz2_sta == 1) - ) { + if ( (endstopx1_sta == 1) && (endstopx2_sta == 1) + && (endstopy1_sta == 1) && (endstopy2_sta == 1) + && (endstopz1_sta == 1) && (endstopz2_sta == 1) + ) { + // nothing here } else { - mks_test_beeper(); + //mks_test_beeper(); } - if (curent_disp_ui == 1) - disp_test(); - } + if (disp_state == PRINT_READY_UI) + mks_disp_test(); -#endif // MKS_TEST + #endif +} static const uint16_t ASCII_Table_16x24[] PROGMEM = { // Space ' ' @@ -568,8 +582,10 @@ static const uint16_t ASCII_Table_16x24[] PROGMEM = { void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint16_t bkColor) { for (uint16_t i = 0; i < 24; i++) { const uint16_t tmp_char = pgm_read_word(&ASCII_Table_16x24[((c - 0x20) * 24) + i]); - for (uint16_t j = 0; j < 16; j++) - tft_set_point(x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor); + for (uint16_t j = 0; j < 16; j++) { + TERN(TFT_LVGL_UI_SPI, SPI_TFT.SetPoint, tft_set_point) + (x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor); + } } } @@ -582,14 +598,30 @@ void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor } //static lv_obj_t * scr_test; -void disp_pic_update() { - LCD_Clear(0x0000); - disp_string(120, 150, "PIC Updating...", 0xFFFF, 0x0000); +void disp_assets_update() { + #if DISABLED(TFT_LVGL_UI_SPI) + LCD_Clear(0x0000); + #endif + disp_string(100, 150, "Assets Updating...", 0xFFFF, 0x0000); } -void disp_font_update() { - LCD_Clear(0x0000); - disp_string(120, 150, "FONT Updating...", 0xFFFF, 0x0000); +void disp_assets_update_progress(const char *msg) { + char buf[30]; + memset(buf, ' ', COUNT(buf)); + strncpy(buf, msg, strlen(msg)); + buf[COUNT(buf)-1] = '\0'; + disp_string(100, 200, buf, 0xFFFF, 0x0000); } -#endif // TFT_LVGL_UI +uint8_t mks_test_flag = 0; +const char *MKSTestPath = "MKS_TEST"; + +#if ENABLED(SDSUPPORT) + void mks_test_get() { + SdFile dir, root = card.getroot(); + if (dir.open(&root, MKSTestPath, O_RDONLY)) + mks_test_flag = 0x1e; + } +#endif + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h index 6dc9fb6368c0..0e2d8096bac9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h @@ -21,11 +21,13 @@ */ #pragma once -#include "lvgl.h" +#include -void Test_GPIO(); +void mks_gpio_test(); void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint16_t bkColor); void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor); -void mks_test(); -void disp_pic_update(); -void disp_font_update(); +void mks_hardware_test(); +void disp_assets_update(); +void disp_assets_update_progress(const char *msg); +void mks_test_get(); +extern uint8_t mks_test_flag; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 8cf2233715f6..3f9af712d1e2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -21,7 +21,7 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "../../../../MarlinCore.h" @@ -40,7 +40,7 @@ extern unsigned char bmp_public_buf[17 * 1024]; extern char *createFilename(char * const buffer, const dir_t &p); #endif -static char assets[][30] = { +static char assets[][LONG_FILENAME_LENGTH] = { //homing screen "bmp_Zero.bin", "bmp_zeroX.bin", @@ -90,7 +90,7 @@ static char assets[][30] = { //select file screen "bmp_pageUp.bin", "bmp_pageDown.bin", - //"bmp_Back.bin", //TODO: why two back buttons? Why not just one? (return / back) + "bmp_Back.bin", //TODO: why two back buttons? Why not just one? (return / back) "bmp_Dir.bin", "bmp_File.bin", @@ -164,14 +164,18 @@ static char assets[][30] = { "bmp_French_sel.bin", "bmp_Italy.bin", "bmp_Italy_sel.bin", - #endif //HAS_LANG_SELECT_SCREEN + #endif // HAS_LANG_SELECT_SCREEN - //gcode preview + // gcode preview #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH "bmp_preview.bin", #endif - //settings screen + #if HAS_LOGO_IN_FLASH + "bmp_logo.bin", + #endif + + // settings screen "bmp_About.bin", //"bmp_Language.bin", //"bmp_Fan.bin", @@ -182,14 +186,27 @@ static char assets[][30] = { "bmp_Set.bin", "bmp_Tool.bin", - //base icons + #if ENABLED(HAS_STEALTHCHOP) + //"bmp_back70x40.bin", + "bmp_disable.bin", + "bmp_enable.bin", + #endif + + // settings screen + "bmp_eeprom_settings.bin", + "bmp_machine_para.bin", + "bmp_function1.bin", + + // base icons + "bmp_arrow.bin", + "bmp_back70x40.bin", + "bmp_value_blank.bin", "bmp_Return.bin" }; #if HAS_SPI_FLASH_FONT - static char fonts[][50] = { - "GBK16.bin", - "UNIGBK.bin", + static char fonts[][LONG_FILENAME_LENGTH] = { + "FontUNIGBK.bin", }; #endif @@ -220,22 +237,19 @@ uint32_t lv_get_pic_addr(uint8_t *Pname) { addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35; else addr = PIC_DATA_ADDR_TFT32 + i * PER_PIC_MAX_SPACE_TFT32; - return (addr + 4);//The purpose of adding 4 is to remove 4-byte picture header information. + return addr; } } return addr; } -const char *picPath = "mks_pic"; -const char *bakPath = "bak_pic"; - -const char *fontPath = "mks_font"; -const char *bakFont = "bak_font"; +const char *assetsPath = "assets"; +const char *bakPath = "_assets"; void spiFlashErase_PIC() { volatile uint32_t pic_sectorcnt = 0; - for (pic_sectorcnt = 0; pic_sectorcnt < TERN(MKS_TEST, 2, PIC_SIZE_xM * 1024 / 64); pic_sectorcnt++) + for (pic_sectorcnt = 0; pic_sectorcnt < PIC_SIZE_xM * 1024 / 64; pic_sectorcnt++) W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024); } @@ -347,103 +361,123 @@ uint8_t public_buf[512]; longName[j] = '\0'; } - void UpdatePic() { - char *fn; - unsigned char logoFlag; + static int8_t arrayFindStr(const char arr[][LONG_FILENAME_LENGTH], uint8_t arraySize, const char* str) { + for (uint8_t a = 0; a < arraySize; a++) { + if (strcasecmp(arr[a], str) == 0) + return a; + } + return -1; + } + + #define ASSET_TYPE_ICON 0 + #define ASSET_TYPE_LOGO 1 + #define ASSET_TYPE_TITLE_LOGO 2 + #define ASSET_TYPE_G_PREVIEW 3 + #define ASSET_TYPE_FONT 4 + static void loadAsset(SdFile &dir, dir_t& entry, const char *fn, int8_t assetType) { + SdFile file; + char dosFilename[FILENAME_LENGTH]; + createFilename(dosFilename, entry); + if (!file.open(&dir, dosFilename, O_READ)) { + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("Error opening Asset: ", fn); + #endif + return; + } + + disp_assets_update_progress(fn); uint16_t pbr; uint32_t pfileSize; uint32_t totalSizeLoaded = 0; uint32_t Pic_Write_Addr; + pfileSize = file.fileSize(); + totalSizeLoaded += pfileSize; + if (assetType == ASSET_TYPE_LOGO) { + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); // + if (pbr < BMP_WRITE_BUF_LEN) break; + } + } + else if (assetType == ASSET_TYPE_TITLE_LOGO) { + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); // + if (pbr < BMP_WRITE_BUF_LEN) break; + } + } + else if (assetType == ASSET_TYPE_G_PREVIEW) { + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + default_view_Write(public_buf, pbr); // + if (pbr < BMP_WRITE_BUF_LEN) break; + } + } + else if (assetType == ASSET_TYPE_ICON) { + Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize); + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); + Pic_Write_Addr += pbr; + if (pbr < BMP_WRITE_BUF_LEN) break; + } + } + else if (assetType == ASSET_TYPE_FONT) { + Pic_Write_Addr = UNIGBK_FLASH_ADDR; + while (1) { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); + Pic_Write_Addr += pbr; + if (pbr < BMP_WRITE_BUF_LEN) break; + } + } + + file.close(); + + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("Asset added: ", fn); + #endif + } + void UpdateAssets() { SdFile dir, root = card.getroot(); - if (dir.open(&root, picPath, O_RDONLY)) { + if (dir.open(&root, assetsPath, O_RDONLY)) { - disp_pic_update(); + disp_assets_update(); spiFlashErase_PIC(); + #if HAS_SPI_FLASH_FONT + spiFlashErase_FONT(); + #endif dir_t d; while (dir.readDir(&d, card.longFilename) > 0) { // if we dont get a long name, but gets a short one, try it - if (card.longFilename[0] == 0 && d.name[0] != 0) { + if (card.longFilename[0] == 0 && d.name[0] != 0) dosName2LongName((const char*)d.name, card.longFilename); - } + if (card.longFilename[0] == 0) continue; + if (card.longFilename[0] == '.') continue; - if (card.longFilename[0] == 0) - continue; - if (card.longFilename[0] == '.') - continue; + uint8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); + if (a >= 0 && a < COUNT(assets)) { + uint8_t assetType = ASSET_TYPE_ICON; + if (strstr(assets[a], "_logo")) + assetType = ASSET_TYPE_LOGO; + else if (strstr(assets[a], "_titlelogo")) + assetType = ASSET_TYPE_TITLE_LOGO; + else if (strstr(assets[a], "_preview")) + assetType = ASSET_TYPE_G_PREVIEW; - uint8_t a = -1; - for(a = 0; a < COUNT(assets); a++) { - if (strcasecmp(assets[a], card.longFilename) == 0) { - break; - } - } - if (a < 0 || a >= COUNT(assets)) continue; + loadAsset(dir, d, assets[a], assetType); - fn = assets[a]; - char dosFilename[FILENAME_LENGTH]; - createFilename(dosFilename, d); - - SdFile file; - if (!file.open(&dir, dosFilename, O_READ)) { - #if ENABLED(MARLIN_DEV_MODE) - SERIAL_ECHOLNPAIR("Error opening Asset: ", fn); - #endif continue; } - if (strstr(fn, "_logo")) - logoFlag = 1; - else if (strstr(fn, "_titlelogo")) - logoFlag = 2; - else if (strstr(fn, "_preview")) - logoFlag = 3; - else - logoFlag = 0; - - pfileSize = file.fileSize(); - totalSizeLoaded += pfileSize; - if (logoFlag == 1) { - while (1) { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) - break; - } - } - else if (logoFlag == 2) { - while (1) { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) - break; - } - } - else if (logoFlag == 3) { - while (1) { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - default_view_Write(public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) - break; - } - } - else { - Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize); - while (1) { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); - Pic_Write_Addr += pbr; - if (pbr < BMP_WRITE_BUF_LEN) - break; + #if HAS_SPI_FLASH_FONT + a = arrayFindStr(fonts, COUNT(fonts), card.longFilename); + if (a >= 0 && a < COUNT(fonts)) { + loadAsset(dir, d, fonts[a], ASSET_TYPE_FONT); } - } - - #if ENABLED(MARLIN_DEV_MODE) - SERIAL_ECHOLNPAIR("Asset added: ", fn); #endif - - file.close(); } dir.rename(&root, bakPath); } @@ -452,62 +486,12 @@ uint8_t public_buf[512]; #if ENABLED(MARLIN_DEV_MODE) uint8_t pic_counter = 0; W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); - SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter, ", Total size: ", totalSizeLoaded); + SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter); #endif } #if HAS_SPI_FLASH_FONT - void spi_flash_read_test() { W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN); } - - void UpdateFont() { - char *fn; - uint16_t pbr; - uint32_t flashaddr = 0; - - SdFile dir, root = card.getroot(); - if (dir.open(&root, fontPath, O_RDONLY)) { - - disp_font_update(); - spiFlashErase_FONT(); - - dir_t d; - while (dir.readDir(&d, card.longFilename) > 0) { - if (card.longFilename[0] == 0) - break; - - if (card.longFilename[0] == '.') - continue; - - fn = card.longFilename; - - if (strstr(fn, ".bin")) { - char dosFilename[FILENAME_LENGTH]; - createFilename(dosFilename, d); - //strcat(public_buf, dosFilename); - - SdFile file; - if (file.open(&dir, dosFilename, O_READ)) { - - flashaddr = UNIGBK_FLASH_ADDR; - pbr = 0; - while (1) { - flashaddr += pbr; - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - W25QXX.SPI_FLASH_BufferWrite(public_buf, flashaddr, pbr); - if (pbr < BMP_WRITE_BUF_LEN) break; - } - file.close(); - } - - } - } - - dir.rename(&root, bakFont); - dir.close(); - } - } - #endif // HAS_SPI_FLASH_FONT #endif // SDSUPPORT @@ -552,6 +536,7 @@ void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) { uint32_t logo_addroffset = 0; void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) { + W25QXX.init(SPI_QUARTER_SPEED); W25QXX.SPI_FLASH_BufferRead(Logo_Rbuff, PIC_LOGO_ADDR + logo_addroffset, LogoReadsize); logo_addroffset += LogoReadsize; if (logo_addroffset >= LOGO_MAX_SIZE_TFT35) @@ -561,7 +546,6 @@ void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize uint32_t default_view_addroffset = 0; void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize) { W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead(default_view_Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset, default_view_Readsize); default_view_addroffset += default_view_Readsize; if (default_view_addroffset >= DEFAULT_VIEW_MAX_SIZE) @@ -572,7 +556,6 @@ void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsi uint32_t flash_view_addroffset = 0; void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize) { W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead(flash_view_Rbuff, BAK_VIEW_ADDR_TFT35 + flash_view_addroffset, flash_view_Readsize); flash_view_addroffset += flash_view_Readsize; if (flash_view_addroffset >= FLASH_VIEW_MAX_SIZE) @@ -580,4 +563,4 @@ void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsi } #endif -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index c0130d0e7e41..663a88d8db3a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -25,29 +25,33 @@ extern "C" { /* C-declarations for C++ */ #endif +#include "../../inc/MarlinConfigPre.h" + +#include + #include #include -#include "lvgl.h" - -#include "../../inc/MarlinConfigPre.h" #ifndef HAS_SPI_FLASH_FONT - #define HAS_SPI_FLASH_FONT 0 //disabled until fix the font load code + #define HAS_SPI_FLASH_FONT 1 // Disabled until fix the font load code #endif #ifndef HAS_GCODE_PREVIEW #define HAS_GCODE_PREVIEW 1 #endif #ifndef HAS_LANG_SELECT_SCREEN - #define HAS_LANG_SELECT_SCREEN 0 + #define HAS_LANG_SELECT_SCREEN 1 #endif #ifndef HAS_BAK_VIEW_IN_FLASH - #define HAS_BAK_VIEW_IN_FLASH 1 + #define HAS_BAK_VIEW_IN_FLASH 1 #endif #ifndef HAS_GCODE_DEFAULT_VIEW_IN_FLASH - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 1 +#endif +#ifndef HAS_LOGO_IN_FLASH + #define HAS_LOGO_IN_FLASH 1 #endif #ifndef SPI_FLASH_SIZE - #define SPI_FLASH_SIZE 0x1000000 // 16MB + #define SPI_FLASH_SIZE 0x1000000 // 16MB #endif #define PIC_MAX_CN 100 // Maximum number of pictures @@ -66,48 +70,52 @@ extern "C" { /* C-declarations for C++ */ #if SPI_FLASH_SIZE == 0x200000 //pic //Robin_pro pic addr - #define PIC_NAME_ADDR 0x001000 // Pic information addr - #define PIC_SIZE_ADDR 0x001800 // Pic size information addr - #define PIC_COUNTER_ADDR 0x002000 // Pic total number - #define PER_PIC_SAVE_ADDR 0x000000 // Storage address of each picture - #define PIC_LOGO_ADDR 0x000000 // Logo addr - #define PIC_DATA_ADDR 0x003000 // + #define PIC_NAME_ADDR 0x001000 // Pic information addr + #define PIC_SIZE_ADDR 0x001800 // Pic size information addr + #define PIC_COUNTER_ADDR 0x002000 // Pic total number + #define PER_PIC_SAVE_ADDR 0x000000 // Storage address of each picture + #define PIC_LOGO_ADDR 0x000000 // Logo addr + #define PIC_DATA_ADDR 0x003000 // // TFT35 - #define DEFAULT_VIEW_ADDR_TFT35 0x1ea070 - #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) - #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) - #define PIC_DATA_ADDR_TFT35 0x003000 // (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 + #define DEFAULT_VIEW_ADDR_TFT35 0x1ea070 + #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) + #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) + #define PIC_DATA_ADDR_TFT35 0x003000 // (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 - #define PIC_DATA_ADDR_TFT32 0x00F000 - #define PIC_ICON_LOGO_ADDR_TFT32 0x5D8000 - #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 + #define PIC_DATA_ADDR_TFT32 0x00F000 + #define PIC_ICON_LOGO_ADDR_TFT32 0x5D8000 + #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 + + // font + #define FONTINFOADDR 0x183000 // 6M -- font addr + #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 #else //pic //Robin_pro pic addr - #define PIC_NAME_ADDR 0x003000 // Pic information addr - #define PIC_SIZE_ADDR 0x007000 // Pic size information addr - #define PIC_COUNTER_ADDR 0x008000 // Pic total number - #define PER_PIC_SAVE_ADDR 0x009000 // Storage address of each picture - #define PIC_LOGO_ADDR 0x00A000 // Logo addr - //#define PIC_DATA_ADDR 0x02F000 // + #define PIC_NAME_ADDR 0x003000 // Pic information addr + #define PIC_SIZE_ADDR 0x007000 // Pic size information addr + #define PIC_COUNTER_ADDR 0x008000 // Pic total number + //#define PER_PIC_SAVE_ADDR 0x009000 // Storage address of each picture + #define PIC_LOGO_ADDR 0x009000 // Logo addr + //#define PIC_DATA_ADDR 0x02F000 // // TFT35 - #define DEFAULT_VIEW_ADDR_TFT35 0xC5800 - #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) - #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) - #define PIC_DATA_ADDR_TFT35 (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 + #define DEFAULT_VIEW_ADDR_TFT35 0xC5800 + #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) + #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) + #define PIC_DATA_ADDR_TFT35 (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 // TFT32 - #define PIC_DATA_ADDR_TFT32 0x02F000 - #define PIC_ICON_LOGO_ADDR_TFT32 0x5D8000 - #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 + #define PIC_DATA_ADDR_TFT32 0x02F000 + #define PIC_ICON_LOGO_ADDR_TFT32 0x5D8000 + #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 // font - #define FONTINFOADDR 0x600000 // 6M -- font addr - #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 - #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024 + #define FONTINFOADDR 0x600000 // 6M -- font addr + #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 + #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024 #endif @@ -137,6 +145,7 @@ typedef struct pic_msg PIC_MSG; #define FONT_SIZE_xM 2 extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff); +extern void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize); extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); extern uint32_t lv_get_pic_addr(uint8_t *Pname); extern void get_spi_flash_data(const char *rec_buf, int offset, int size); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp new file mode 100644 index 000000000000..138168b12fb0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -0,0 +1,217 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "../../../../MarlinCore.h" + +#include "lv_conf.h" +#include "draw_ui.h" +#include "../../../../module/temperature.h" +#include "../../../../module/motion.h" +#include "../../../../sd/cardreader.h" +#include "../../../../gcode/queue.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#include "../../../../gcode/gcode.h" +#include "../../../../module/planner.h" + +extern uint32_t To_pre_view; +extern uint8_t flash_preview_begin, default_preview_flg, gcode_preview_over; + +void printer_state_polling() { + if (uiCfg.print_state == PAUSING) { + #if ENABLED(SDSUPPORT) + if (!planner.has_blocks_queued() && card.getIndex() > MIN_FILE_PRINTED) + uiCfg.waitEndMoves++; + + if (uiCfg.waitEndMoves > 20) { + uiCfg.waitEndMoves = 0; + planner.synchronize(); + gcode.process_subcommands_now_P(PSTR("M25")); + if (gCfgItems.pausePosZ != (float)-1) { + gcode.process_subcommands_now_P(PSTR("G91")); + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 Z%.1f"), gCfgItems.pausePosZ); + gcode.process_subcommands_now(public_buf_l); + gcode.process_subcommands_now_P(PSTR("G90")); + } + if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%.1f Y%.1f"), gCfgItems.pausePosX, gCfgItems.pausePosY); + gcode.process_subcommands_now(public_buf_l); + } + uiCfg.print_state = PAUSED; + + // #if ENABLED(POWER_LOSS_RECOVERY) + // if (recovery.enabled) recovery.save(true); + // #endif + gCfgItems.pause_reprint = 1; + update_spi_flash(); + } + #endif + } + else + uiCfg.waitEndMoves = 0; + + if (uiCfg.print_state == PAUSED) { + } + + if (uiCfg.print_state == RESUMING) { + if (IS_SD_PAUSED()) { + gcode.process_subcommands_now_P(PSTR("M24\nG91\nG1 Z-5\nG90")); + uiCfg.print_state = WORKING; + start_print_time(); + + gCfgItems.pause_reprint = 0; + update_spi_flash(); + } + } + #if ENABLED(POWER_LOSS_RECOVERY) + if (uiCfg.print_state == REPRINTED) { + ZERO(public_buf_m); + #if HAS_HOTEND + HOTEND_LOOP() { + const int16_t et = recovery.info.target_temperature[e]; + if (et) { + #if HAS_MULTI_HOTEND + sprintf_P(public_buf_m, PSTR("T%i"), e); + gcode.process_subcommands_now(public_buf_m); + #endif + sprintf_P(public_buf_m, PSTR("M109 S%i"), et); + gcode.process_subcommands_now(public_buf_m); + } + } + #endif + + if (gCfgItems.pause_reprint == 1) { + gcode.process_subcommands_now_P(PSTR("G91\nG1 Z-5\nG90")); + } + recovery.resume(); + + uiCfg.print_state = WORKING; + start_print_time(); + + gCfgItems.pause_reprint = 0; + update_spi_flash(); + } + #endif + + if (uiCfg.print_state == WORKING) + filament_check(); +} + +void filament_pin_setup() { + #if PIN_EXISTS(MT_DET_1) + pinMode(MT_DET_1_PIN, INPUT_PULLUP); + #endif + #if PIN_EXISTS(MT_DET_2) + pinMode(MT_DET_2_PIN, INPUT_PULLUP); + #endif + #if PIN_EXISTS(MT_DET_3) + pinMode(MT_DET_3_PIN, INPUT_PULLUP); + #endif +} + +void filament_check() { + const int FIL_DELAY = 20; + #if PIN_EXISTS(MT_DET_1) + static int fil_det_count_1 = 0; + if (!READ(MT_DET_1_PIN) && !MT_DET_PIN_INVERTING) + fil_det_count_1++; + else if (READ(MT_DET_1_PIN) && MT_DET_PIN_INVERTING) + fil_det_count_1++; + else if (fil_det_count_1 > 0) + fil_det_count_1--; + + if (!READ(MT_DET_1_PIN) && !MT_DET_PIN_INVERTING) + fil_det_count_1++; + else if (READ(MT_DET_1_PIN) && MT_DET_PIN_INVERTING) + fil_det_count_1++; + else if (fil_det_count_1 > 0) + fil_det_count_1--; + #endif + + #if PIN_EXISTS(MT_DET_2) + static int fil_det_count_2 = 0; + if (!READ(MT_DET_2_PIN) && !MT_DET_PIN_INVERTING) + fil_det_count_2++; + else if (READ(MT_DET_2_PIN) && MT_DET_PIN_INVERTING) + fil_det_count_2++; + else if (fil_det_count_2 > 0) + fil_det_count_2--; + + if (!READ(MT_DET_2_PIN) && !MT_DET_PIN_INVERTING) + fil_det_count_2++; + else if (READ(MT_DET_2_PIN) && MT_DET_PIN_INVERTING) + fil_det_count_2++; + else if (fil_det_count_2 > 0) + fil_det_count_2--; + #endif + + #if PIN_EXISTS(MT_DET_3) + static int fil_det_count_3 = 0; + if (!READ(MT_DET_3_PIN) && !MT_DET_PIN_INVERTING) + fil_det_count_3++; + else if (READ(MT_DET_3_PIN) && MT_DET_PIN_INVERTING) + fil_det_count_3++; + else if (fil_det_count_3 > 0) + fil_det_count_3--; + + if (!READ(MT_DET_3_PIN) && !MT_DET_PIN_INVERTING) + fil_det_count_3++; + else if (READ(MT_DET_3_PIN) && MT_DET_PIN_INVERTING) + fil_det_count_3++; + else if (fil_det_count_3 > 0) + fil_det_count_3--; + #endif + + if (false + #if PIN_EXISTS(MT_DET_1) + || fil_det_count_1 >= FIL_DELAY + #endif + #if PIN_EXISTS(MT_DET_2) + || fil_det_count_2 >= FIL_DELAY + #endif + #if PIN_EXISTS(MT_DET_3) + || fil_det_count_3 >= FIL_DELAY + #endif + ) { + clear_cur_ui(); + card.pauseSDPrint(); + stop_print_time(); + uiCfg.print_state = PAUSING; + + if (gCfgItems.from_flash_pic == 1) + flash_preview_begin = 1; + else + default_preview_flg = 1; + + lv_draw_printing(); + } +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h similarity index 100% rename from Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h rename to Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp deleted file mode 100644 index c081e92bf14b..000000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if ENABLED(TFT_LVGL_UI) - - #include "../../../../MarlinCore.h" - - #include "lv_conf.h" - #include "draw_ui.h" - #include "../../../../module/temperature.h" - #include "../../../../module/motion.h" - #include "../../../../sd/cardreader.h" - #include "../../../../gcode/queue.h" - - #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" - #endif - - #include "../../../../gcode/gcode.h" - #include "../../../../module/planner.h" - - extern uint32_t To_pre_view; - extern uint8_t flash_preview_begin, default_preview_flg, gcode_preview_over; - - void printer_state_polling() { - if (uiCfg.print_state == PAUSING) { - #if ENABLED(SDSUPPORT) - if (!planner.has_blocks_queued() && card.getIndex() > MIN_FILE_PRINTED) //���� �ļ��� M109��M190ָ�� - uiCfg.waitEndMoves++; - - if (uiCfg.waitEndMoves > 20) { - uiCfg.waitEndMoves = 0; - planner.synchronize(); - gcode.process_subcommands_now_P(PSTR("M25\nG91\nG1 Z5\nG90")); - - uiCfg.print_state = PAUSED; - - //#if ENABLED(POWER_LOSS_RECOVERY) - // if (recovery.enabled) recovery.save(true); - //#endif - gCfgItems.pause_reprint = 1; - update_spi_flash(); - } - #endif - } - else { - uiCfg.waitEndMoves = 0; - } - - if (uiCfg.print_state == PAUSED) { - - } - - if (uiCfg.print_state == RESUMING) { - if (IS_SD_PAUSED()) { - gcode.process_subcommands_now_P(PSTR("G91\nG1 Z-5\nG90\nM24")); - uiCfg.print_state = WORKING; - start_print_time(); - - gCfgItems.pause_reprint = 0; - update_spi_flash(); - } - } - #if ENABLED(POWER_LOSS_RECOVERY) - if (uiCfg.print_state == REPRINTED) { - memset(public_buf_m, 0, sizeof(public_buf_m)); - #if HOTENDS - HOTEND_LOOP() { - const int16_t et = recovery.info.target_temperature[e]; - if (et) { - #if HOTENDS > 1 - sprintf_P(public_buf_m, PSTR("T%i"), e); - gcode.process_subcommands_now(public_buf_m); - #endif - sprintf_P(public_buf_m, PSTR("M109 S%i"), et); - gcode.process_subcommands_now(public_buf_m); - } - } - #endif - - if (gCfgItems.pause_reprint == 1) - gcode.process_subcommands_now_P(PSTR("G91\nG1 Z-5\nG90")); - recovery.resume(); - - uiCfg.print_state = WORKING; - start_print_time(); - - gCfgItems.pause_reprint = 0; - update_spi_flash(); - } - #endif - - if (uiCfg.print_state == WORKING) - filament_check(); - } - - void filament_pin_setup() { - #if PIN_EXISTS(MT_DET_1) - pinMode(MT_DET_1_PIN, INPUT_PULLUP); - #endif - #if PIN_EXISTS(MT_DET_2) - pinMode(MT_DET_2_PIN, INPUT_PULLUP); - #endif - #if PIN_EXISTS(MT_DET_3) - pinMode(MT_DET_3_PIN, INPUT_PULLUP); - #endif - } - - void filament_check() { - const int FIL_DELAY = 20; - #if PIN_EXISTS(MT_DET_1) - static int fil_det_count_1 = 0; - if (!READ(MT_DET_1_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_1++; - else if (READ(MT_DET_1_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_1++; - else if (fil_det_count_1 > 0) - fil_det_count_1--; - - if (!READ(MT_DET_1_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_1++; - else if (READ(MT_DET_1_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_1++; - else if (fil_det_count_1 > 0) - fil_det_count_1--; - #endif - - #if PIN_EXISTS(MT_DET_2) - static int fil_det_count_2 = 0; - if (!READ(MT_DET_2_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_2++; - else if (READ(MT_DET_2_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_2++; - else if (fil_det_count_2 > 0) - fil_det_count_2--; - - if (!READ(MT_DET_2_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_2++; - else if (READ(MT_DET_2_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_2++; - else if (fil_det_count_2 > 0) - fil_det_count_2--; - #endif - - #if PIN_EXISTS(MT_DET_3) - static int fil_det_count_3 = 0; - if (!READ(MT_DET_3_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_3++; - else if (READ(MT_DET_3_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_3++; - else if (fil_det_count_3 > 0) - fil_det_count_3--; - - if (!READ(MT_DET_3_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_3++; - else if (READ(MT_DET_3_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_3++; - else if (fil_det_count_3 > 0) - fil_det_count_3--; - #endif - - if ( - #if PIN_EXISTS(MT_DET_1) - fil_det_count_1 >= FIL_DELAY - #else - false - #endif - #if PIN_EXISTS(MT_DET_2) - || fil_det_count_2 >= FIL_DELAY - #endif - #if PIN_EXISTS(MT_DET_3) - || fil_det_count_3 >= FIL_DELAY - #endif - ) { - clear_cur_ui(); - card.pauseSDPrint(); - stop_print_time(); - uiCfg.print_state = PAUSING; - - if (gCfgItems.from_flash_pic == 1) - flash_preview_begin = 1; - else - default_preview_flg = 1; - - lv_draw_printing(); - } - } - -#endif // TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 137dae2e2d74..54e06f582648 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -22,13 +22,13 @@ #pragma once //****************英文***************************// -#define MACHINE_CONFIG_EN "Machine\nSettings" +#define MACHINE_CONFIG_EN "Config" #define NEXT_EN "Next" #define PREVIOUS_EN "Previous" #define DEFAULT_EN "Default" #define KEY_BACK_EN "Del" -#define KEY_REST_EN "Rest" +#define KEY_REST_EN "Reset" #define KEY_CONFIRM_EN "Confirm" #define KEYBOARD_KEY0_EN "0" @@ -44,12 +44,11 @@ #define KEYBOARD_KEY_POINT_EN "." #define KEYBOARD_KEY_NEGATIVE_EN "-" -#define MACHINE_PARA_EN "Machine\nsettings" -#define MACHINE_PARA_TITLE_EN "Machine settings" -#define MACHINE_TYPE_CNOFIG_EN "Machine" -#define TEMPERATURE_CONFIG_EN "Temperature" -#define MOTOR_CONFIG_EN "Motor" -#define ADVANCE_CONFIG_EN "Adavance" +#define MACHINE_PARA_TITLE_EN "Config" +#define MACHINE_TYPE_CNOFIG_EN "Machine settings" +#define TEMPERATURE_CONFIG_EN "Temperature settings" +#define MOTOR_CONFIG_EN "Motor settings" +#define ADVANCE_CONFIG_EN "Adavance settings" #define MACHINE_CONFIG_TITLE_EN "Machine Settings" #define MACHINE_TYPE_EN "Machine type" @@ -158,6 +157,8 @@ #define ACCELERATION_CONF_EN "Acceleration settings" #define JERKCONF_EN "Jerk settings" #define STEPSCONF_EN "Steps settings" +#define TMC_CURRENT_EN "TMC Current settings" +#define TMC_STEP_MODE_EN "TMC Step mode settings" #define MOTORDIRCONF_EN "Motor direction settings" #define HOMEFEEDRATECONF_EN "Home speed setting" @@ -191,6 +192,20 @@ #define E0_STEPS_EN "E0-axis steps" #define E1_STEPS_EN "E1-axis steps" +#define TMC_CURRENT_CONF_TITLE_EN "Machine Settings>TMC current settings" +#define X_TMC_CURRENT_EN "X axis current (mA)" +#define Y_TMC_CURRENT_EN "Y axis current (mA)" +#define Z_TMC_CURRENT_EN "Z axis current (mA)" +#define E0_TMC_CURRENT_EN "E0 axis current (mA)" +#define E1_TMC_CURRENT_EN "E1 axis current (mA)" + +#define TMC_MODE_CONF_TITLE_EN "Machine Settings>TMC step mode settings" +#define X_TMC_MODE_EN "Whether X axis enable stealthChop modes" +#define Y_TMC_MODE_EN "Whether Y axis enable stealthChop modes" +#define Z_TMC_MODE_EN "Whether Z axis enable stealthChop modes" +#define E0_TMC_MODE_EN "Whether E0 axis enable stealthChop modes" +#define E1_TMC_MODE_EN "Whether E1 axis enable stealthChop modes" + #define MOTORDIR_CONF_TITLE_EN "Machine Settings>Motor direction" #define X_MOTORDIR_EN "X-axis motor direction invert" #define Y_MOTORDIR_EN "Y-axis motor direction invert" @@ -223,6 +238,11 @@ #define Z_ENABLE_PINS_INVERT_EN "Z_ENABLE_PIN_INVERT" #define E_ENABLE_PINS_INVERT_EN "E_ENABLE_PIN_INVERT" +#define PAUSE_POSITION_EN "Printing pause position settings" +#define PAUSE_POSITION_X_EN "X axis position (Absolute position,-1 invalid)" +#define PAUSE_POSITION_Y_EN "Y axis position (Absolute position,-1 invalid)" +#define PAUSE_POSITION_Z_EN "Z axis position (Relative position,-1 invalid)" + #define TOOL_TEXT_EN "Tool" #define PREHEAT_TEXT_EN "Preheat" #define MOVE_TEXT_EN "Move" @@ -299,6 +319,8 @@ #define MOTOR_OFF_TEXT_EN "Motor-off" #define MOTOR_OFF_XY_TEXT_EN "Off-XY" #define SHUTDOWN_TEXT_EN "Shutdown" +#define MACHINE_PARA_EN "Config" +#define EEPROM_SETTINGS_EN "Eeprom Set" #define U_DISK_TEXT_EN "USB" #define SD_CARD_TEXT_EN "SD" @@ -368,8 +390,8 @@ #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,\nclick for return!" -#define PRE_HEAT_EXT_TEXT_EN "E" -#define PRE_HEAT_BED_TEXT_EN "Bed" +#define PRE_HEAT_EXT_TEXT_EN "E" +#define PRE_HEAT_BED_TEXT_EN "Bed" #define FILE_LOADING_EN "Loading......" #if 0 @@ -703,16 +725,24 @@ #define PRINTING_OPERATION_OTHER_LANGUGE "Operation" #define PRINTING_PAUSE_OTHER_LANGUGE "Pause" -#define MESSEGE_PAUSING_EN "Parking..." -#define MESSEGE_CHANGING_EN "Wait for filament change to start" -#define MESSEGE_UNLOAD_EN "Wait for filament unload" -#define MESSEGE_WAITING_EN "Press Button to resume print" -#define MESSEGE_INSERT_EN "Insert filament and press button to continue" -#define MESSEGE_LOAD_EN "Wait for filament load" -#define MESSEGE_PURGE_EN "Wait for filament purge" -#define MESSEGE_RESUME_EN "Wait for print to resume..." -#define MESSEGE_HEAT_EN "Press button to heat nozzle" -#define MESSEGE_HEATING_EN "Nozzle heating Please wait..." -#define MESSEGE_OPTION_EN "Purge more or continue print?" -#define MESSEGE_PURGE_MORE_EN "Purge" -#define MESSEGE_CONTINUE_PRINT_EN "Print" +#define MESSAGE_PAUSING_EN "Parking..." +#define MESSAGE_CHANGING_EN "Wait for filament change to start" +#define MESSAGE_UNLOAD_EN "Wait for filament unload" +#define MESSAGE_WAITING_EN "Press Button to resume print" +#define MESSAGE_INSERT_EN "Insert filament and press button to continue" +#define MESSAGE_LOAD_EN "Wait for filament load" +#define MESSAGE_PURGE_EN "Wait for filament purge" +#define MESSAGE_RESUME_EN "Wait for print to resume..." +#define MESSAGE_HEAT_EN "Press button to heat nozzle" +#define MESSAGE_HEATING_EN "Nozzle heating Please wait..." +#define MESSAGE_OPTION_EN "Purge more or continue print?" +#define MESSAGE_PURGE_MORE_EN "Purge" +#define MESSAGE_CONTINUE_PRINT_EN "Print" +#define EEPROM_SETTINGS_TITLE_EN "EEPROM Settings" +#define EEPROM_SETTINGS_STORE_EN "Store settings to EEPROM" +#define EEPROM_SETTINGS_READ_EN "Read settings from EEPROM" +#define EEPROM_SETTINGS_REVERT_EN "Revert settings to factory defaults" + +#define EEPROM_STORE_TIPS_EN "Store settings to EEPROM?" +#define EEPROM_READ_TIPS_EN "Read settings from EEPROM?" +#define EEPROM_REVERT_TIPS_EN "Revert settings to factory defaults?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index 5cea0e3ac856..3fe95654b1a4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -98,6 +98,8 @@ #define MOTOR_OFF_TEXT_FR "M-hors" #define MOTOR_OFF_XY_TEXT_FR "M-hors-XY" #define SHUTDOWN_TEXT_FR "Eteindre" +#define MACHINE_PARA_FR "Config" +#define EEPROM_SETTINGS_FR "Eeprom Set" #define U_DISK_TEXT_FR "Clé usb" #define SD_CARD_TEXT_FR "Carte SD" @@ -249,28 +251,36 @@ #define DIALOG_CANCEL_PRINT_FR "Arrêter?" #define DIALOG_STOP_FR "Arrêter" -#define DIALOG_REPRINT_FROM_BREAKPOINT_FR "Continuer?" -//#define DIALOG_UNBIND_PRINTER_FR "Non lié?" -#define DIALOG_ERROR_TIPS1_FR "Erreur:error:Aucun fichier, \nvérifiez à nouveau." -#define DIALOG_ERROR_TIPS2_FR "Erreur:La opération a échoué. \nVerifiez que le baudrate de l'écran et de \nla carte mère soient identique!" -#define DIALOG_ERROR_TIPS3_FR "Erreur: le nom du fichier ou le \nchemin d'accès est trop long." -#define DIALOG_UNBIND_PRINTER_FR "Unbind the printer?" -#define DIALOG_FILAMENT_NO_PRESS_FR "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_FR "L'impression est terminée!" -#define DIALOG_PRINT_TIME_FR "Temps d'impression: " -#define DIALOG_REPRINT_FR "Print again" -#define DIALOG_WIFI_ENABLE_TIPS_FR "The wifi module is being configured,\nplease wait a moment....." - -#define MESSEGE_PAUSING_FR "Parking..." -#define MESSEGE_CHANGING_FR "Attente filament pour démarrer" -#define MESSEGE_UNLOAD_FR "Attente retrait du filament" -#define MESSEGE_WAITING_FR "Presser bouton,pour reprendre" -#define MESSEGE_INSERT_FR "Insérer filament et app. bouton pour continuer..." -#define MESSEGE_LOAD_FR "Attente chargement filament" -#define MESSEGE_PURGE_FR "Attente Purge filament" -#define MESSEGE_RESUME_FR "Attente reprise impression" -#define MESSEGE_HEAT_FR "Presser le bouton pour chauffer..." -#define MESSEGE_HEATING_FR "Buse en chauffe Patienter SVP..." -#define MESSEGE_OPTION_FR "Purger davantage ou continuer l'impression?" -#define MESSEGE_PURGE_MORE_FR "Purge" -#define MESSEGE_CONTINUE_PRINT_FR "Impression" +#define DIALOG_REPRINT_FROM_BREAKPOINT_FR "Continuer?" +//#define DIALOG_UNBIND_PRINTER_FR "Non lié?" +#define DIALOG_ERROR_TIPS1_FR "Erreur:error:Aucun fichier, \nvérifiez à nouveau." +#define DIALOG_ERROR_TIPS2_FR "Erreur:La opération a échoué. \nVerifiez que le baudrate de l'écran et de \nla carte mère soient identique!" +#define DIALOG_ERROR_TIPS3_FR "Erreur: le nom du fichier ou le \nchemin d'accès est trop long." +#define DIALOG_UNBIND_PRINTER_FR "Unbind the printer?" +#define DIALOG_FILAMENT_NO_PRESS_FR "Filament detection switch is not pressed" +#define DIALOG_PRINT_FINISH_FR "L'impression est terminée!" +#define DIALOG_PRINT_TIME_FR "Temps d'impression: " +#define DIALOG_REPRINT_FR "Print again" +#define DIALOG_WIFI_ENABLE_TIPS_FR "The wifi module is being configured,\nplease wait a moment....." + +#define MESSAGE_PAUSING_FR "Parking..." +#define MESSAGE_CHANGING_FR "Attente filament pour démarrer" +#define MESSAGE_UNLOAD_FR "Attente retrait du filament" +#define MESSAGE_WAITING_FR "Presser bouton,pour reprendre" +#define MESSAGE_INSERT_FR "Insérer filament et app. bouton pour continuer..." +#define MESSAGE_LOAD_FR "Attente chargement filament" +#define MESSAGE_PURGE_FR "Attente Purge filament" +#define MESSAGE_RESUME_FR "Attente reprise impression" +#define MESSAGE_HEAT_FR "Presser le bouton pour chauffer..." +#define MESSAGE_HEATING_FR "Buse en chauffe Patienter SVP..." +#define MESSAGE_OPTION_FR "Purger davantage ou continuer l'impression?" +#define MESSAGE_PURGE_MORE_FR "Purge" +#define MESSAGE_CONTINUE_PRINT_FR "Impression" +#define EEPROM_SETTINGS_TITLE_FR "Paramètres EEPROM" +#define EEPROM_SETTINGS_STORE_FR "Stocker les paramètres dans l'EEPROM" +#define EEPROM_SETTINGS_READ_FR "Lire les paramètres de l'EEPROM" +#define EEPROM_SETTINGS_REVERT_FR "Rétablir les paramètres par défaut d'usine" + +#define EEPROM_STORE_TIPS_FR "Stocker les paramètres dans l'EEPROM?" +#define EEPROM_READ_TIPS_FR "Lire les paramètres de l'EEPROM?" +#define EEPROM_REVERT_TIPS_FR "Rétablir les paramètres par défaut d'usine?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index e800cbc12ba4..aef6cfaf9609 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -22,250 +22,260 @@ #pragma once //****************æ„大利语***************************// -#define TOOL_TEXT_IT "Strumento" -#define PREHEAT_TEXT_IT "Prerisc" -#define MOVE_TEXT_IT "Muovi" -#define HOME_TEXT_IT "Home" -#define PRINT_TEXT_IT "Stampa" -#define EXTRUDE_TEXT_IT "Estrude" -#define LEVELING_TEXT_IT "Leveling" -#define AUTO_LEVELING_TEXT_IT "AutoLevel" -#define SET_TEXT_IT "Imposta" -#define MORE_TEXT_IT "Di più" +#define TOOL_TEXT_IT "Strumento" +#define PREHEAT_TEXT_IT "Prerisc" +#define MOVE_TEXT_IT "Muovi" +#define HOME_TEXT_IT "Home" +#define PRINT_TEXT_IT "Stampa" +#define EXTRUDE_TEXT_IT "Estrude" +#define LEVELING_TEXT_IT "Leveling" +#define AUTO_LEVELING_TEXT_IT "AutoLevel" +#define SET_TEXT_IT "Imposta" +#define MORE_TEXT_IT "Di più" -#define ADD_TEXT_IT "Aumentare" -#define DEC_TEXT_IT "Ridurre" -#define EXTRUDER_1_TEXT_IT "Estrude1" -#define EXTRUDER_2_TEXT_IT "Estrude2" -#define HEATBED_TEXT_IT "Piano" -#define TEXT_1C_IT "1℃" -#define TEXT_5C_IT "5℃" -#define TEXT_10C_IT "10℃" -#define CLOSE_TEXT_IT "Spento" +#define ADD_TEXT_IT "Aumentare" +#define DEC_TEXT_IT "Ridurre" +#define EXTRUDER_1_TEXT_IT "Estrude1" +#define EXTRUDER_2_TEXT_IT "Estrude2" +#define HEATBED_TEXT_IT "Piano" +#define TEXT_1C_IT "1℃" +#define TEXT_5C_IT "5℃" +#define TEXT_10C_IT "10℃" +#define CLOSE_TEXT_IT "Spento" -#define BACK_TEXT_IT "Indietro" +#define BACK_TEXT_IT "Indietro" -#define TOOL_PREHEAT_IT "Prerisc" -#define TOOL_EXTRUDE_IT "Estrude" -#define TOOL_MOVE_IT "Muovi" -#define TOOL_HOME_IT "Home" -#define TOOL_LEVELING_IT "Leveling" +#define TOOL_PREHEAT_IT "Prerisc" +#define TOOL_EXTRUDE_IT "Estrude" +#define TOOL_MOVE_IT "Muovi" +#define TOOL_HOME_IT "Home" +#define TOOL_LEVELING_IT "Leveling" #define TOOL_AUTO_LEVELING_IT "Autolevel" -#define TOOL_FILAMENT_IT "Filamento" -#define TOOL_MORE_IT "Di più" +#define TOOL_FILAMENT_IT "Filamento" +#define TOOL_MORE_IT "Di più" -#define AXIS_X_ADD_TEXT_IT "X+" -#define AXIS_X_DEC_TEXT_IT "X-" -#define AXIS_Y_ADD_TEXT_IT "Y+" -#define AXIS_Y_DEC_TEXT_IT "Y-" -#define AXIS_Z_ADD_TEXT_IT "Z+" -#define AXIS_Z_DEC_TEXT_IT "Z-" -#define TEXT_01MM_IT "0.1mm" -#define TEXT_1MM_IT "1mm" -#define TEXT_10MM_IT "10mm" +#define AXIS_X_ADD_TEXT_IT "X+" +#define AXIS_X_DEC_TEXT_IT "X-" +#define AXIS_Y_ADD_TEXT_IT "Y+" +#define AXIS_Y_DEC_TEXT_IT "Y-" +#define AXIS_Z_ADD_TEXT_IT "Z+" +#define AXIS_Z_DEC_TEXT_IT "Z-" +#define TEXT_01MM_IT "0.1mm" +#define TEXT_1MM_IT "1mm" +#define TEXT_10MM_IT "10mm" -#define HOME_X_TEXT_IT "X" -#define HOME_Y_TEXT_IT "Y" -#define HOME_Z_TEXT_IT "Z" -#define HOME_ALL_TEXT_IT "All" -#define HOME_STOPMOVE_IT "Quickstop" +#define HOME_X_TEXT_IT "X" +#define HOME_Y_TEXT_IT "Y" +#define HOME_Z_TEXT_IT "Z" +#define HOME_ALL_TEXT_IT "All" +#define HOME_STOPMOVE_IT "Quickstop" -#define PAGE_UP_TEXT_IT "Pagina su" -#define PAGE_DOWN_TEXT_IT "Pagina giù" +#define PAGE_UP_TEXT_IT "Pagina su" +#define PAGE_DOWN_TEXT_IT "Pagina giù" -#define EXTRUDER_IN_TEXT_IT "Estru" -#define EXTRUDER_OUT_TEXT_IT "Ritra" -#define EXTRUDE_1MM_TEXT_IT "1mm" -#define EXTRUDE_5MM_TEXT_IT "5mm" -#define EXTRUDE_10MM_TEXT_IT "10mm" -#define EXTRUDE_LOW_SPEED_TEXT_IT "Bassa" -#define EXTRUDE_MEDIUM_SPEED_TEXT_IT "Media" -#define EXTRUDE_HIGH_SPEED_TEXT_IT "Alta" +#define EXTRUDER_IN_TEXT_IT "Estru" +#define EXTRUDER_OUT_TEXT_IT "Ritra" +#define EXTRUDE_1MM_TEXT_IT "1mm" +#define EXTRUDE_5MM_TEXT_IT "5mm" +#define EXTRUDE_10MM_TEXT_IT "10mm" +#define EXTRUDE_LOW_SPEED_TEXT_IT "Bassa" +#define EXTRUDE_MEDIUM_SPEED_TEXT_IT "Media" +#define EXTRUDE_HIGH_SPEED_TEXT_IT "Alta" -#define LEVELING_POINT1_TEXT_IT "Primo" -#define LEVELING_POINT2_TEXT_IT "Secondo" -#define LEVELING_POINT3_TEXT_IT "Terzo" -#define LEVELING_POINT4_TEXT_IT "Quarto" -#define LEVELING_POINT5_TEXT_IT "Quinto" +#define LEVELING_POINT1_TEXT_IT "Primo" +#define LEVELING_POINT2_TEXT_IT "Secondo" +#define LEVELING_POINT3_TEXT_IT "Terzo" +#define LEVELING_POINT4_TEXT_IT "Quarto" +#define LEVELING_POINT5_TEXT_IT "Quinto" -#define FILESYS_TEXT_IT "FileSys" -#define WIFI_TEXT_IT "WIFI" -#define FAN_TEXT_IT "Ventola" -#define ABOUT_TEXT_IT "Circa" -#define BREAK_POINT_TEXT_IT "Continua" -#define FILAMENT_TEXT_IT "Filamento" -#define LANGUAGE_TEXT_IT "Lingua" -#define MOTOR_OFF_TEXT_IT "Motor off" -#define MOTOR_OFF_XY_TEXT_IT "Off-XY" -#define SHUTDOWN_TEXT_IT "Spento" +#define FILESYS_TEXT_IT "FileSys" +#define WIFI_TEXT_IT "WIFI" +#define FAN_TEXT_IT "Ventola" +#define ABOUT_TEXT_IT "Circa" +#define BREAK_POINT_TEXT_IT "Continua" +#define FILAMENT_TEXT_IT "Filamento" +#define LANGUAGE_TEXT_IT "Lingua" +#define MOTOR_OFF_TEXT_IT "Motor off" +#define MOTOR_OFF_XY_TEXT_IT "Off-XY" +#define SHUTDOWN_TEXT_IT "Spento" +#define MACHINE_PARA_IT "Config" +#define EEPROM_SETTINGS_IT "Eeprom Set" -#define U_DISK_TEXT_IT "USB" -#define SD_CARD_TEXT_IT "SD" -#define WIFI_NAME_TEXT_IT "WIFI: " -#define WIFI_KEY_TEXT_IT "KEY: " -#define WIFI_IP_TEXT_IT "IP: " -#define WIFI_AP_TEXT_IT "Stato: AP" -#define WIFI_STA_TEXT_IT "Stato: STA" -#define WIFI_CONNECTED_TEXT_IT "Connesso" -#define WIFI_DISCONNECTED_TEXT_IT "Disconnesso" -#define WIFI_EXCEPTION_TEXT_IT "Eccezione" -#define WIFI_RECONNECT_TEXT_IT "Reconnect" -#define CLOUD_TEXT_IT "Cloud" -#define CLOUD_BIND_IT "Legato" -#define CLOUD_UNBIND_IT "Libero" -#define CLOUD_DISCONNECTED_IT "Disconnesso" -#define CLOUD_UNBINDING_IT "Libero" -#define CLOUD_UNBINDED_IT "Sciolto" -#define CLOUD_BINDED_IT "Legato" -#define CLOUD_DISABLE_IT "Disable" +#define U_DISK_TEXT_IT "USB" +#define SD_CARD_TEXT_IT "SD" +#define WIFI_NAME_TEXT_IT "WIFI: " +#define WIFI_KEY_TEXT_IT "KEY: " +#define WIFI_IP_TEXT_IT "IP: " +#define WIFI_AP_TEXT_IT "Stato: AP" +#define WIFI_STA_TEXT_IT "Stato: STA" +#define WIFI_CONNECTED_TEXT_IT "Connesso" +#define WIFI_DISCONNECTED_TEXT_IT "Disconnesso" +#define WIFI_EXCEPTION_TEXT_IT "Eccezione" +#define WIFI_RECONNECT_TEXT_IT "Reconnect" +#define CLOUD_TEXT_IT "Cloud" +#define CLOUD_BIND_IT "Legato" +#define CLOUD_UNBIND_IT "Libero" +#define CLOUD_DISCONNECTED_IT "Disconnesso" +#define CLOUD_UNBINDING_IT "Libero" +#define CLOUD_UNBINDED_IT "Sciolto" +#define CLOUD_BINDED_IT "Legato" +#define CLOUD_DISABLE_IT "Disable" -#define FAN_ADD_TEXT_IT "Aumentare" -#define FAN_DEC_TEXT_IT "Ridurre" -#define FAN_OPEN_TEXT_IT "100%" -#define FAN_HALF_TEXT_IT "50%" -#define FAN_CLOSE_TEXT_IT "Spento" -#define FAN_TIPS1_TEXT_IT "Ventola" -#define FAN_TIPS2_TEXT_IT "Ventola\n0" +#define FAN_ADD_TEXT_IT "Aumentare" +#define FAN_DEC_TEXT_IT "Ridurre" +#define FAN_OPEN_TEXT_IT "100%" +#define FAN_HALF_TEXT_IT "50%" +#define FAN_CLOSE_TEXT_IT "Spento" +#define FAN_TIPS1_TEXT_IT "Ventola" +#define FAN_TIPS2_TEXT_IT "Ventola\n0" -#define FILAMENT_IN_TEXT_IT "Inser" -#define FILAMENT_OUT_TEXT_IT "Estra" -#define FILAMENT_EXT0_TEXT_IT "Estrude1" -#define FILAMENT_EXT1_TEXT_IT "Estrude2" -#define FILAMENT_HEAT_TEXT_IT "Preriscaldamento" -#define FILAMENT_STOP_TEXT_IT "Stop" -//#define FILAMENT_CHANGE_TEXT_IT "Filamento" -#define FILAMENT_TIPS2_TEXT_IT "T:" -#define FILAMENT_TIPS3_TEXT_IT "Inserimento del filamento..." -#define FILAMENT_TIPS4_TEXT_IT "Estrazione del filamento..." -#define FILAMENT_TIPS5_TEXT_IT "Temp is too low to go,please heat" -#define FILAMENT_TIPS6_TEXT_IT "Completato" +#define FILAMENT_IN_TEXT_IT "Inser" +#define FILAMENT_OUT_TEXT_IT "Estra" +#define FILAMENT_EXT0_TEXT_IT "Estrude1" +#define FILAMENT_EXT1_TEXT_IT "Estrude2" +#define FILAMENT_HEAT_TEXT_IT "Preriscaldamento" +#define FILAMENT_STOP_TEXT_IT "Stop" +//#define FILAMENT_CHANGE_TEXT_IT "Filamento" +#define FILAMENT_TIPS2_TEXT_IT "T:" +#define FILAMENT_TIPS3_TEXT_IT "Inserimento del filamento..." +#define FILAMENT_TIPS4_TEXT_IT "Estrazione del filamento..." +#define FILAMENT_TIPS5_TEXT_IT "Temp is too low to go,please heat" +#define FILAMENT_TIPS6_TEXT_IT "Completato" #if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_IT "Please click or \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_IT "Please click or ,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please click for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,click for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,click for return!" + #define FILAMENT_REPLAYS_IDLE_TEXT_IT "Please click or \nto replace filament!" + #define FILAMENT_CHANGE_TEXT_IT "Please click or ,\nAfter pinter pause." + #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." + #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." + #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament to extruder,and click for start loading." + #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,and click for start loading." + #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please click for start unloading.!" + #define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" + #define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" + #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,click for return!" + #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,click for return!" #endif -#define FILAMENT_CHANGE_TEXT_IT "Please click \nor ,After \npinter pause." -#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." -#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." -#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament \nto extruder,and click \nfor start loading." -#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,\nand click for start loading." -#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" -#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,\nclick for return!" -#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,\nclick for return!" +#define FILAMENT_CHANGE_TEXT_IT "Please click \nor ,After \npinter pause." +#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." +#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." +#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament \nto extruder,and click \nfor start loading." +#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,\nand click for start loading." +#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please \nclick for start unloading.!" +#define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,\nclick for return!" +#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,\nclick for return!" -#define PRE_HEAT_EXT_TEXT_IT "E" -#define PRE_HEAT_BED_TEXT_IT "Piano" +#define PRE_HEAT_EXT_TEXT_IT "E" +#define PRE_HEAT_BED_TEXT_IT "Piano" -#define FILE_LOADING_IT "Caricamento......" +#define FILE_LOADING_IT "Caricamento......" #if 0 - #define NO_FILE_AND_CHECK_IT "Nessun file trovato! Inserisci la scheda SD o il disco U!" + #define NO_FILE_AND_CHECK_IT "Nessun file trovato! Inserisci la scheda SD o il disco U!" #endif -#define NO_FILE_AND_CHECK_IT "Nessun file,\n per favore controllare di nuovo!" +#define NO_FILE_AND_CHECK_IT "Nessun file,\n per favore controllare di nuovo!" -#define NO_FILE_IT "Nessun file!" +#define NO_FILE_IT "Nessun file!" -#define EXTRUDER_TEMP_TEXT_IT "Temper" -#define EXTRUDER_E_LENGTH1_TEXT_IT "Estrude1" -#define EXTRUDER_E_LENGTH2_TEXT_IT "Estrude2" -#define EXTRUDER_E_LENGTH3_TEXT_IT "Estrude3" +#define EXTRUDER_TEMP_TEXT_IT "Temper" +#define EXTRUDER_E_LENGTH1_TEXT_IT "Estrude1" +#define EXTRUDER_E_LENGTH2_TEXT_IT "Estrude2" +#define EXTRUDER_E_LENGTH3_TEXT_IT "Estrude3" -#define ABOUT_TYPE_TEXT_IT "Type: " -#define ABOUT_VERSION_TEXT_IT "Firmware: " -#define ABOUT_WIFI_TEXT_IT "WiFi: " +#define ABOUT_TYPE_TEXT_IT "Type: " +#define ABOUT_VERSION_TEXT_IT "Firmware: " +#define ABOUT_WIFI_TEXT_IT "WiFi: " -#define PRINTING_OPERATION_IT "Opzioni" -#define PRINTING_PAUSE_IT "Pause" -#define PRINTING_TEMP_IT "Temp." -#define PRINTING_CHANGESPEED_IT "Velocità" -#define PRINTING_RESUME_IT "Recupero" -#define PRINTING_STOP_IT "Stop" -#define PRINTING_MORE_IT "Di più" -#define PRINTING_EXTRUDER_IT "Estrude" -#define PRINTING_MOVE_IT "Muovi" +#define PRINTING_OPERATION_IT "Opzioni" +#define PRINTING_PAUSE_IT "Pause" +#define PRINTING_TEMP_IT "Temp." +#define PRINTING_CHANGESPEED_IT "Velocità" +#define PRINTING_RESUME_IT "Recupero" +#define PRINTING_STOP_IT "Stop" +#define PRINTING_MORE_IT "Di più" +#define PRINTING_EXTRUDER_IT "Estrude" +#define PRINTING_MOVE_IT "Muovi" -#define EXTRUDER_SPEED_IT "Estrude" -#define MOVE_SPEED_IT "Muovi" -#define EXTRUDER_SPEED_STATE_IT "Estrusione" -#define MOVE_SPEED_STATE_IT "Movimento" -#define STEP_1PERCENT_IT "1%" -#define STEP_5PERCENT_IT "5%" -#define STEP_10PERCENT_IT "10%" +#define EXTRUDER_SPEED_IT "Estrude" +#define MOVE_SPEED_IT "Muovi" +#define EXTRUDER_SPEED_STATE_IT "Estrusione" +#define MOVE_SPEED_STATE_IT "Movimento" +#define STEP_1PERCENT_IT "1%" +#define STEP_5PERCENT_IT "5%" +#define STEP_10PERCENT_IT "10%" -#define ZOFFSET_IT "Z Offset" -#define ZOFFSET_INC_IT "Add" -#define ZOFFSET_DEC_IT "Dec" +#define ZOFFSET_IT "Z Offset" +#define ZOFFSET_INC_IT "Add" +#define ZOFFSET_DEC_IT "Dec" -#define TITLE_READYPRINT_IT "Pronto" -#define TITLE_PREHEAT_IT "Preris" -#define TITLE_MOVE_IT "Muovi" -#define TITLE_HOME_IT "Home" -#define TITLE_EXTRUDE_IT "Estrude" -#define TITLE_LEVELING_IT "Livella" -#define TITLE_SET_IT "Impostare" -#define TITLE_MORE_IT "Di più" -#define TITLE_CHOOSEFILE_IT "File" -#define TITLE_PRINTING_IT "Stampa" -#define TITLE_OPERATION_IT "Opzioni" -#define TITLE_ADJUST_IT "Regolare" -#define TITLE_WIRELESS_IT "Wireless" -#define TITLE_FILAMENT_IT "Filamento" -#define TITLE_ABOUT_IT "Circa" -#define TITLE_FAN_IT "Ventola" -#define TITLE_LANGUAGE_IT "Lingua" -#define TITLE_PAUSE_IT "Pausa" -#define TITLE_CHANGESPEED_IT "Velocità" -#define TITLE_CLOUD_TEXT_IT "Cloud" -#define TITLE_DIALOG_CONFIRM_IT "Confirm" -#define TITLE_FILESYS_IT "FileSys" -#define TITLE_ZOFFSET_IT "Z Offset" +#define TITLE_READYPRINT_IT "Pronto" +#define TITLE_PREHEAT_IT "Preris" +#define TITLE_MOVE_IT "Muovi" +#define TITLE_HOME_IT "Home" +#define TITLE_EXTRUDE_IT "Estrude" +#define TITLE_LEVELING_IT "Livella" +#define TITLE_SET_IT "Impostare" +#define TITLE_MORE_IT "Di più" +#define TITLE_CHOOSEFILE_IT "File" +#define TITLE_PRINTING_IT "Stampa" +#define TITLE_OPERATION_IT "Opzioni" +#define TITLE_ADJUST_IT "Regolare" +#define TITLE_WIRELESS_IT "Wireless" +#define TITLE_FILAMENT_IT "Filamento" +#define TITLE_ABOUT_IT "Circa" +#define TITLE_FAN_IT "Ventola" +#define TITLE_LANGUAGE_IT "Lingua" +#define TITLE_PAUSE_IT "Pausa" +#define TITLE_CHANGESPEED_IT "Velocità" +#define TITLE_CLOUD_TEXT_IT "Cloud" +#define TITLE_DIALOG_CONFIRM_IT "Confirm" +#define TITLE_FILESYS_IT "FileSys" +#define TITLE_ZOFFSET_IT "Z Offset" -#define AUTO_SHUTDOWN_IT "Auto" -#define MANUAL_SHUTDOWN_IT "Manuale" +#define AUTO_SHUTDOWN_IT "Auto" +#define MANUAL_SHUTDOWN_IT "Manuale" -#define DIALOG_CONFIRM_IT "Conferma" -#define DIALOG_CANCLE_IT "Cancella" -#define DIALOG_OK_IT "OK" -#define DIALOG_RESET_IT "Resettare" -#define DIALOG_RETRY_IT "Riprovare" -#define DIALOG_DISABLE_IT "Disable" -#define DIALOG_PRINT_MODEL_IT "Gcode stampa?" -#define DIALOG_CANCEL_PRINT_IT "Stop stampa?" -#define DIALOG_STOP_IT "Stop" -#define DIALOG_REPRINT_FROM_BREAKPOINT_IT "Continua a stampare dal \npunto di interruzione?" -//#define DIALOG_UNBIND_PRINTER_IT "Libero?" -#define DIALOG_ERROR_TIPS1_IT "Errore: nessun file, \nper favore controllare di nuovo." -#define DIALOG_ERROR_TIPS2_IT "Errore: operazione non riuscita, \nsi prega di controllare se il baudrate del \ndisplay è lo stesso scheda madre" -#define DIALOG_ERROR_TIPS3_IT "Errore: il nome del file o il \npercorso è troppo lungo!" -#define DIALOG_CLOSE_MACHINE_IT "Closing machine......" -#define DIALOG_UNBIND_PRINTER_IT "Unbind the printer?" -#define DIALOG_FILAMENT_NO_PRESS_IT "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_IT "La stampa è completa!" +#define DIALOG_CONFIRM_IT "Conferma" +#define DIALOG_CANCLE_IT "Cancella" +#define DIALOG_OK_IT "OK" +#define DIALOG_RESET_IT "Resettare" +#define DIALOG_RETRY_IT "Riprovare" +#define DIALOG_DISABLE_IT "Disable" +#define DIALOG_PRINT_MODEL_IT "Gcode stampa?" +#define DIALOG_CANCEL_PRINT_IT "Stop stampa?" +#define DIALOG_STOP_IT "Stop" +#define DIALOG_REPRINT_FROM_BREAKPOINT_IT "Continua a stampare dal \npunto di interruzione?" +//#define DIALOG_UNBIND_PRINTER_IT "Libero?" +#define DIALOG_ERROR_TIPS1_IT "Errore: nessun file, \nper favore controllare di nuovo." +#define DIALOG_ERROR_TIPS2_IT "Errore: operazione non riuscita, \nsi prega di controllare se il baudrate del \ndisplay è lo stesso scheda madre" +#define DIALOG_ERROR_TIPS3_IT "Errore: il nome del file o il \npercorso è troppo lungo!" +#define DIALOG_CLOSE_MACHINE_IT "Closing machine......" +#define DIALOG_UNBIND_PRINTER_IT "Unbind the printer?" +#define DIALOG_FILAMENT_NO_PRESS_IT "Filament detection switch is not pressed" +#define DIALOG_PRINT_FINISH_IT "La stampa è completa!" #define DIALOG_PRINT_TIME_IT "Tempo di stampa: " #define DIALOG_REPRINT_IT "Print again" -#define DIALOG_WIFI_ENABLE_TIPS_IT "The wifi module is being configured,\nplease wait a moment....." +#define DIALOG_WIFI_ENABLE_TIPS_IT "The wifi module is being configured,\nplease wait a moment....." -#define MESSEGE_PAUSING_IT "Parcheggiando..." -#define MESSEGE_CHANGING_IT "Attendere avvio del cambio di filamento" -#define MESSEGE_UNLOAD_IT "Attendere l'espulsione del filamento" -#define MESSEGE_WAITING_IT "Premi per riprendere la stampa" -#define MESSEGE_INSERT_IT "Inserisci il filamento e premi per continuare" -#define MESSEGE_LOAD_IT "Attendere il caricamento del filamento" -#define MESSEGE_PURGE_IT "Attendere lo spurgo del filamento" -#define MESSEGE_RESUME_IT "Attendere la ripresa della stampa..." -#define MESSEGE_HEAT_IT "Premi per riscaldare ugello" -#define MESSEGE_HEATING_IT "Riscaldam. ugello Attendere prego..." -#define MESSEGE_OPTION_IT "Eliminare di più o continuare a stampare?" -#define MESSEGE_PURGE_MORE_IT "Epurazione" -#define MESSEGE_CONTINUE_PRINT_IT "Stampa" +#define MESSAGE_PAUSING_IT "Parcheggiando..." +#define MESSAGE_CHANGING_IT "Attendere avvio del cambio di filamento" +#define MESSAGE_UNLOAD_IT "Attendere l'espulsione del filamento" +#define MESSAGE_WAITING_IT "Premi per riprendere la stampa" +#define MESSAGE_INSERT_IT "Inserisci il filamento e premi per continuare" +#define MESSAGE_LOAD_IT "Attendere il caricamento del filamento" +#define MESSAGE_PURGE_IT "Attendere lo spurgo del filamento" +#define MESSAGE_RESUME_IT "Attendere la ripresa della stampa..." +#define MESSAGE_HEAT_IT "Premi per riscaldare ugello" +#define MESSAGE_HEATING_IT "Riscaldam. ugello Attendere prego..." +#define MESSAGE_OPTION_IT "Eliminare di più o continuare a stampare?" +#define MESSAGE_PURGE_MORE_IT "Epurazione" +#define MESSAGE_CONTINUE_PRINT_IT "Stampa" +#define EEPROM_SETTINGS_TITLE_IT "Impostazioni EEPROM" +#define EEPROM_SETTINGS_STORE_IT "Memorizzare le impostazioni su EEPROM" +#define EEPROM_SETTINGS_READ_IT "Leggi le impostazioni dalla EEPROM" +#define EEPROM_SETTINGS_REVERT_IT "Ripristina le impostazioni predefinite di fabbrica" + +#define EEPROM_STORE_TIPS_IT "Memorizzare le impostazioni su EEPROM?" +#define EEPROM_READ_TIPS_IT "Leggi le impostazioni dalla EEPROM?" +#define EEPROM_REVERT_TIPS_IT "Ripristinare le impostazioni predefinite?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index 6778331cc9c5..2ec39ab01646 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -98,6 +98,8 @@ #define MOTOR_OFF_TEXT_RU "отклмотор" #define MOTOR_OFF_XY_TEXT_RU "Off-XY" #define SHUTDOWN_TEXT_RU "выключение" +#define MACHINE_PARA_RU "конфиг" +#define EEPROM_SETTINGS_RU "Eeprom Set" #define U_DISK_TEXT_RU "U диÑк" #define SD_CARD_TEXT_RU "SD диÑк" @@ -257,16 +259,24 @@ #define DIALOG_REPRINT_RU "Print again" #define DIALOG_WIFI_ENABLE_TIPS_RU "The wifi module is being configured,\nplease wait a moment....." -#define MESSEGE_PAUSING_RU "СтоÑнка..." -#define MESSEGE_CHANGING_RU "Подождите, пока начнетÑÑ Ñмена филамента" -#define MESSEGE_UNLOAD_RU "ДождитеÑÑŒ выгрузки нити" -#define MESSEGE_WAITING_RU "Ðажмите кнопку,чтобы возобновить печать" -#define MESSEGE_INSERT_RU "Ð’Ñтавьте нить и нажмите кнопку,чтобы продолжить" -#define MESSEGE_LOAD_RU "ДождитеÑÑŒ загрузки нити" -#define MESSEGE_PURGE_RU "ДождитеÑÑŒ чиÑтки нити" -#define MESSEGE_RESUME_RU "Подождите,пока печать возобновитÑÑ ..." -#define MESSEGE_HEAT_RU "Ðажмите кнопку, чтобы нагреть форÑунку" -#define MESSEGE_HEATING_RU "Подогрев форÑунки ПожалуйÑта, подождите ..." -#define MESSEGE_OPTION_RU "ОчиÑтить больше или продолжить печать?" -#define MESSEGE_PURGE_MORE_RU "чиÑтка" -#define MESSEGE_CONTINUE_PRINT_RU "РаÑпечатать" +#define MESSAGE_PAUSING_RU "СтоÑнка..." +#define MESSAGE_CHANGING_RU "Подождите, пока начнетÑÑ Ñмена филамента" +#define MESSAGE_UNLOAD_RU "ДождитеÑÑŒ выгрузки нити" +#define MESSAGE_WAITING_RU "Ðажмите кнопку,чтобы возобновить печать" +#define MESSAGE_INSERT_RU "Ð’Ñтавьте нить и нажмите кнопку,чтобы продолжить" +#define MESSAGE_LOAD_RU "ДождитеÑÑŒ загрузки нити" +#define MESSAGE_PURGE_RU "ДождитеÑÑŒ чиÑтки нити" +#define MESSAGE_RESUME_RU "Подождите,пока печать возобновитÑÑ ..." +#define MESSAGE_HEAT_RU "Ðажмите кнопку, чтобы нагреть форÑунку" +#define MESSAGE_HEATING_RU "Подогрев форÑунки ПожалуйÑта, подождите ..." +#define MESSAGE_OPTION_RU "ОчиÑтить больше или продолжить печать?" +#define MESSAGE_PURGE_MORE_RU "чиÑтка" +#define MESSAGE_CONTINUE_PRINT_RU "РаÑпечатать" +#define EEPROM_SETTINGS_TITLE_RU "ÐаÑтройки EEPROM" +#define EEPROM_SETTINGS_STORE_RU "Сохранение наÑтроек в EEPROM" +#define EEPROM_SETTINGS_READ_RU "Чтение наÑтроек из EEPROM" +#define EEPROM_SETTINGS_REVERT_RU "ВоÑÑтановить заводÑкие наÑтройки по умолчанию" + +#define EEPROM_STORE_TIPS_RU "Сохранить наÑтройки в EEPROM?" +#define EEPROM_READ_TIPS_RU "Читать наÑтройки из EEPROM?" +#define EEPROM_REVERT_TIPS_RU "Revert settings to factory defaults?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index c8b0a7194d00..ea481c89a24e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -22,6 +22,211 @@ #pragma once //*************简体中文***********************// +#define NEXT_CN "下一页" +#define PREVIOUS_CN "上一页" +#define DEFAULT_CN "默认值" +#define KEY_BACK_CN "退格" +#define KEY_REST_CN "é‡ç½®" +#define KEY_CONFIRM_CN "确定" + +#define MACHINE_PARA_TITLE_CN "机器å‚æ•°" +#define MACHINE_TYPE_CNOFIG_CN "机器设置" +#define TEMPERATURE_CONFIG_CN "温度设置" +#define MOTOR_CONFIG_CN "电机设置" +#define ADVANCE_CONFIG_CN "高级设置" + +#define MACHINE_CONFIG_TITLE_CN "机器å‚æ•°>机器é…ç½®" +#define MACHINE_TYPE_CN "机型选择" +#define MACHINE_STROKE_CN "行程设置" +#define MACHINE_HOMEDIR_CN "归零方å‘" +#define MACHINE_ENDSTOP_TYPE_CN "é™ä½å¼€å…³ç±»åž‹" +#define MACHINE_FILAMENT_CONFIG_CN "æ¢æ–™è®¾ç½®" +#define MACHINE_LEVELING_CONFIG_CN "调平设置" + +#define MACHINE_TYPE_CONFIG_TITLE_CN "机器å‚æ•°>机型选择" +#define MACHINE_TYPE_XYZ_CN "XYZ机型" +#define MACHINE_TYPE_DELTA_CN "Delta机型" +#define MACHINE_TYPE_COREXY_CN "Corexy机型" + +#define MACHINE_STROKE_CONF_TITLE_CN "机器å‚æ•°>机器行程" +#define X_MAX_LENGTH_CN "X轴最大行程" +#define Y_MAX_LENGTH_CN "Y轴最大行程" +#define Z_MAX_LENGTH_CN "Z轴最大行程" + +#define X_MIN_LENGTH_CN "X轴最å°è¡Œç¨‹" +#define Y_MIN_LENGTH_CN "Y轴最å°è¡Œç¨‹" +#define Z_MIN_LENGTH_CN "Z轴最å°è¡Œç¨‹" + +#define HOME_DIR_CONF_TITLE_CN "机器å‚æ•°>归零方å‘" +#define HOME_DIR_X_CN "X轴归零方å‘" +#define HOME_DIR_Y_CN "Y轴归零方å‘" +#define HOME_DIR_Z_CN "Z轴归零方å‘" +#define HOME_MIN_CN "MIN" +#define HOME_MAX_CN "MAX" + +#define ENDSTOP_CONF_TITLE_CN "机器å‚æ•°>é™ä½å¼€å…³" +#define MIN_ENDSTOP_X_CN "X轴最å°é™ä½" +#define MIN_ENDSTOP_Y_CN "Y轴最å°é™ä½" +#define MIN_ENDSTOP_Z_CN "Z轴最å°é™ä½" +#define MAX_ENDSTOP_X_CN "X轴最大é™ä½" +#define MAX_ENDSTOP_Y_CN "Y轴最大é™ä½" +#define MAX_ENDSTOP_Z_CN "Z轴最大é™ä½" +#define ENDSTOP_FIL_CN "断料开关类型" +#define ENDSTOP_LEVEL_CN "调平开关类型" +#define ENDSTOP_OPENED_CN "常开" +#define ENDSTOP_CLOSED_CN "常闭" + +#define FILAMENT_CONF_TITLE_CN "æ¢æ–™è®¾ç½®" +#define FILAMENT_IN_TEMPERATURE_CN "进料温度" +#define FILAMENT_IN_LENGTH_CN "进料长度" +#define FILAMENT_IN_SPEED_CN "进料速度" +#define FILAMENT_OUT_TEMPERATURE_CN "退料温度" +#define FILAMENT_OUT_LENGTH_CN "退料长度" +#define FILAMENT_OUT_SPEED_CN "退料速度" + +#define LEVELING_CONF_TITLE_CN "调平设置" +#define LEVELING_PARA_CONF_CN "调平设置" +#define LEVELING_DELTA_CN "delta机型设置" +#define LEVELING_XYZ_CN "手动调平å标设置" + +#define LEVELING_PARA_CONF_TITLE_CN "调平å‚æ•°" +#define AUTO_LEVELING_ENABLE_CN "自动调平" +#define BLTOUCH_LEVELING_ENABLE_CN "å¯åŠ¨BLtouch" +#define PROBE_PORT_CN "调平探针接å£" +#define PROBE_X_OFFSET_CN "探针Xæ–¹å‘å移" +#define PROBE_Y_OFFSET_CN "探针Yæ–¹å‘å移" +#define PROBE_Z_OFFSET_CN "探针Zæ–¹å‘å移" +#define PROBE_XY_SPEED_CN "探针XYæ–¹å‘移动速度" +#define PROBE_Z_SPEED_CN "探针Zæ–¹å‘移动速度" +#define ENABLE_CN "是" +#define DISABLE_CN "å¦" +#define Z_MIN_CN "ZMin" +#define Z_MAX_CN "ZMax" + +#define DELTA_LEVEL_CONF_TITLE_CN "Delta机器å‚æ•°" +#define DELTA_LEVEL_CONF_CN "Delta机器调平" +#define DELTA_MACHINE_RADIUS_CN "机器åŠå¾„" +#define DELTA_DIAGONAL_ROD_CN "机器æ†é•¿" +#define DELTA_PRINT_RADIUS_CN "打å°åŠå¾„" +#define DELTA_HEIGHT_CN "打å°é«˜åº¦" +#define SMOOTH_ROD_OFFSET_CN "滑å—å移" +#define EFFECTOR_OFFSET_CN "效应器å移" +#define CALIBRATION_RADIUS_CN "调平åŠå¾„" + +#define XYZ_LEVEL_CONF_TITLE_CN "XYZ机器å‚æ•°" +#define PROBE_REACH_MAX_LEFT_CN "探针达到最左ä½ç½®" +#define PROBE_REACH_MAX_RIGHT_CN "探针达到最å³ä½ç½®" +#define PROBE_REACH_MAX_FRONT_CN "探针达到最å‰ä½ç½®" +#define PROBE_REACH_MAX_BACK_CN "探针达到最åŽä½ç½®" + +#define TEMPERATURE_CONF_TITLE_CN "机器å‚æ•°>温度设置" +#define NOZZLE_CONF_CN "喷头设置" +#define HOTBED_CONF_CN "热床设置" +#define PREHEAT_TEMPER_CN "预设温度" + +#define NOZZLE_CONF_TITLE_CN "机器å‚æ•°>喷头设置" +#define NOZZLECNT_CN "喷头数é‡" +#define NOZZLE_TYPE_CN "E0温感类型" +#define NOZZLE_ADJUST_TYPE_CN "PID调温" +#define NOZZLE_MIN_TEMPERATURE_CN "最低温度" +#define NOZZLE_MAX_TEMPERATURE_CN "最高温度" +#define EXTRUD_MIN_TEMPER_CN "最低挤出温度" + +#define HOTBED_CONF_TITLE_CN "机器å‚æ•°>热床设置" +#define HOTBED_ADJUST_CN "PID调温" +#define HOTBED_MIN_TEMPERATURE_CN "最低温度" +#define HOTBED_MAX_TEMPERATURE_CN "最高温度" + +#define MOTOR_CONF_TITLE_CN "机器å‚æ•°>电机设置" +#define MAXFEEDRATE_CONF_CN "最大速度设置" +#define ACCELERATION_CONF_CN "加速度设置" +#define JERKCONF_CN "çªå˜é€Ÿåº¦è®¾ç½®" +#define STEPSCONF_CN "脉冲设置" +#define TMC_CURRENT_CN "TMC 驱动电æµè®¾ç½®" +#define TMC_STEP_MODE_CN "TMC 驱动模å¼è®¾ç½®" +#define MOTORDIRCONF_CN "电机方å‘设置" +#define HOMEFEEDRATECONF_CN "归零速度设置" + +#define MAXFEEDRATE_CONF_TITLE_CN "机器å‚æ•°>最大速度" +#define X_MAXFEEDRATE_CN "X轴最大速度" +#define Y_MAXFEEDRATE_CN "Y轴最大速度" +#define Z_MAXFEEDRATE_CN "Z轴最大速度" +#define E0_MAXFEEDRATE_CN "E0轴最大速度" +#define E1_MAXFEEDRATE_CN "E1轴最大速度" + +#define ACCELERATION_CONF_TITLE_CN "机器å‚æ•°>加速度" +#define PRINT_ACCELERATION_CN "打å°åŠ é€Ÿåº¦" +#define RETRACT_ACCELERATION_CN "回抽加速度" +#define TRAVEL_ACCELERATION_CN "空载加速度" +#define X_ACCELERATION_CN "X轴加速度" +#define Y_ACCELERATION_CN "Y轴加速度" +#define Z_ACCELERATION_CN "Z轴加速度" +#define E0_ACCELERATION_CN "E0轴加速度" +#define E1_ACCELERATION_CN "E1轴加速度" + +#define JERK_CONF_TITLE_CN "机器å‚æ•°>çªå˜é€Ÿåº¦" +#define X_JERK_CN "Xè½´çªå˜é€Ÿåº¦" +#define Y_JERK_CN "Yè½´çªå˜é€Ÿåº¦" +#define Z_JERK_CN "Zè½´çªå˜é€Ÿåº¦" +#define E_JERK_CN "Eè½´çªå˜é€Ÿåº¦" + +#define STEPS_CONF_TITLE_CN "机器å‚æ•°>脉冲设置" +#define X_STEPS_CN "X轴脉冲" +#define Y_STEPS_CN "Y轴脉冲" +#define Z_STEPS_CN "Z轴脉冲" +#define E0_STEPS_CN "E0轴脉冲" +#define E1_STEPS_CN "E1轴脉冲" + +#define TMC_CURRENT_CONF_TITLE_CN "机器å‚æ•°>TMC电æµè®¾ç½®" +#define X_TMC_CURRENT_CN "X轴电æµ(毫安)" +#define Y_TMC_CURRENT_CN "Y轴电æµ(毫安)" +#define Z_TMC_CURRENT_CN "Z轴电æµ(毫安)" +#define E0_TMC_CURRENT_CN "E0轴电æµ(毫安)" +#define E1_TMC_CURRENT_CN "E1轴电æµ(毫安)" + +#define TMC_MODE_CONF_TITLE_CN "机器å‚æ•°>TMC模å¼è®¾ç½®" +#define X_TMC_MODE_CN "X轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define Y_TMC_MODE_CN "Y轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define Z_TMC_MODE_CN "Z轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define E0_TMC_MODE_CN "E0轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" +#define E1_TMC_MODE_CN "E1轴是å¦ä½¿èƒ½é™éŸ³æ¨¡å¼" + +#define MOTORDIR_CONF_TITLE_CN "机器å‚æ•°>电机方å‘" +#define X_MOTORDIR_CN "X轴电机方å‘" +#define Y_MOTORDIR_CN "Y轴电机方å‘" +#define Z_MOTORDIR_CN "Z轴电机方å‘" +#define E0_MOTORDIR_CN "E0轴电机方å‘" +#define E1_MOTORDIR_CN "E1轴电机方å‘" +#define INVERT_P_CN "æ­£å‘" +#define INVERT_N_CN "åå‘" + +#define HOMEFEEDRATE_CONF_TITLE_CN "机器å‚æ•°>归零速度" +#define X_HOMESPEED_CN "XY轴归零速度" +#define Y_HOMESPEED_CN "Y轴归零速度" +#define Z_HOMESPEED_CN "Z轴归零速度" + +#define ADVANCED_CONF_TITLE_CN "机器å‚æ•°>高级设置" +#define PWROFF_DECTION_CN "断电检测模å—" +#define PWROFF_AFTER_PRINT_CN "å¯åŠ¨æ‰“完关机功能" +#define HAVE_UPS_CN "机器é…备UPS电æº" +#define Z2_AND_Z2ENDSTOP_CONF_CN "åŒZè½´åŒé™ä½åŠŸèƒ½è®¾ç½®" +#define ENABLE_PINS_CONF_CN "电机使能脚电平设置" + +#define Z2_AND_Z2ENDSTOP_CONF_TITLE_CN "åŒzåŒé™ä½è®¾ç½®" +#define Z2_ENABLE_CN "å¯ç”¨Z2è½´" +#define Z2_ENDSTOP_CN "å¯ç”¨Z2é™ä½" +#define Z2_PORT_CN "Z2é™ä½æŽ¥å£" + +#define ENABLE_PINS_CONF_TITLE_CN "电机使能脚电平" +#define X_ENABLE_PINS_INVERT_CN "X轴电机使能电平" +#define Y_ENABLE_PINS_INVERT_CN "Y轴电机使能电平" +#define Z_ENABLE_PINS_INVERT_CN "Z轴电机使能电平" +#define E_ENABLE_PINS_INVERT_CN "E轴电机使能电平" + +#define PAUSE_POSITION_CN "打å°æš‚åœä½ç½®è®¾ç½®" +#define PAUSE_POSITION_X_CN "Xè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" +#define PAUSE_POSITION_Y_CN "Yè½´æš‚åœä½ç½®(ç»å¯¹ä½ç½®,-1无效)" +#define PAUSE_POSITION_Z_CN "Zè½´æš‚åœä½ç½®(相对ä½ç½®,-1无效)" #define TOOL_TEXT_CN "工具" #define PREHEAT_TEXT_CN "预热" #define MOVE_TEXT_CN "移动" @@ -98,6 +303,8 @@ #define MOTOR_OFF_TEXT_CN "关闭电机" #define MOTOR_OFF_XY_TEXT_CN "关闭XY" #define SHUTDOWN_TEXT_CN "关机" +#define MACHINE_PARA_CN "机器å‚æ•°" +#define EEPROM_SETTINGS_CN "Eeprom设置" #define U_DISK_TEXT_CN "U盘" #define SD_CARD_TEXT_CN "SDå¡" @@ -249,16 +456,24 @@ #define PRINTING_OPERATION_GBK "æ“作" #define PRINTING_PAUSE_GBK "æš‚åœ" -#define MESSEGE_PAUSING_CN "æš‚åœä¸­..." -#define MESSEGE_CHANGING_CN "等待æ¢æ–™å¼€å§‹..." -#define MESSEGE_UNLOAD_CN "退料中,请ç¨ç­‰..." -#define MESSEGE_WAITING_CN "点击按钮æ¢å¤æ‰“å°" -#define MESSEGE_INSERT_CN "装载耗æåŽ,点击按钮开始打å°" -#define MESSEGE_LOAD_CN "进料中,请ç¨ç­‰..." -#define MESSEGE_PURGE_CN "等待挤出..." -#define MESSEGE_RESUME_CN "等待æ¢å¤æ‰“å°..." -#define MESSEGE_HEAT_CN "按下按钮,加热喷头" -#define MESSEGE_HEATING_CN "喷头加热中,请等待..." -#define MESSEGE_OPTION_CN "挤出更多还是继续打å°?" -#define MESSEGE_PURGE_MORE_CN "挤出" -#define MESSEGE_CONTINUE_PRINT_CN "打å°" +#define MESSAGE_PAUSING_CN "æš‚åœä¸­..." +#define MESSAGE_CHANGING_CN "等待æ¢æ–™å¼€å§‹..." +#define MESSAGE_UNLOAD_CN "退料中,请ç¨ç­‰..." +#define MESSAGE_WAITING_CN "点击按钮æ¢å¤æ‰“å°" +#define MESSAGE_INSERT_CN "装载耗æåŽ,点击按钮开始打å°" +#define MESSAGE_LOAD_CN "进料中,请ç¨ç­‰..." +#define MESSAGE_PURGE_CN "等待挤出..." +#define MESSAGE_RESUME_CN "等待æ¢å¤æ‰“å°..." +#define MESSAGE_HEAT_CN "按下按钮,加热喷头" +#define MESSAGE_HEATING_CN "喷头加热中,请等待..." +#define MESSAGE_OPTION_CN "挤出更多还是继续打å°?" +#define MESSAGE_PURGE_MORE_CN "挤出" +#define MESSAGE_CONTINUE_PRINT_CN "打å°" +#define EEPROM_SETTINGS_TITLE_CN "EEPROM 设置" +#define EEPROM_SETTINGS_STORE_CN "ä¿å­˜å‚数至EEPROM" +#define EEPROM_SETTINGS_READ_CN "读å–EEPROMå‚æ•°" +#define EEPROM_SETTINGS_REVERT_CN "æ¢å¤é»˜è®¤å‚æ•°" + +#define EEPROM_STORE_TIPS_CN "是å¦ä¿å­˜å‚数到EEPROM?" +#define EEPROM_READ_TIPS_CN "是å¦ä½¿ç”¨EEPROMå‚æ•°?" +#define EEPROM_REVERT_TIPS_CN "是å¦æ¢å¤é»˜è®¤å‚æ•°?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 75d1fd539d8b..289874c6baf1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -98,6 +98,8 @@ #define MOTOR_OFF_TEXT_SP "Apagar motor" #define MOTOR_OFF_XY_TEXT_SP "Off-XY" #define SHUTDOWN_TEXT_SP "Apagar" +#define MACHINE_PARA_SP "Config" +#define EEPROM_SETTINGS_SP "Eeprom Set" #define U_DISK_TEXT_SP "PENDRIVE" #define SD_CARD_TEXT_SP "SD" @@ -245,9 +247,9 @@ #define DIALOG_PRINT_MODEL_SP "¿Está seguro?" #define DIALOG_CANCEL_PRINT_SP "¿Está seguro que desea detener la impresión?" -#define DIALOG_RETRY_SP "Reintentar" -#define DIALOG_STOP_SP "Stop" -#define DIALOG_REPRINT_FROM_BREAKPOINT_SP "Reprint from breakpoint?" +#define DIALOG_RETRY_SP "Reintentar" +#define DIALOG_STOP_SP "Stop" +#define DIALOG_REPRINT_FROM_BREAKPOINT_SP "Reprint from breakpoint?" //#define DIALOG_UNBIND_PRINTER_SP "Unbind the printer?" #define DIALOG_ERROR_TIPS1_SP "Error:archivo no encontrado, \npor favor insertar SD o disco USB." #define DIALOG_ERROR_TIPS2_SP "error:transacción fallida, \nconfigurar baudrate del \ndisplay para la placa base!" @@ -260,20 +262,28 @@ #define DIALOG_REPRINT_SP "Print again" #define DIALOG_WIFI_ENABLE_TIPS_SP "The wifi module is being configured,\nplease wait a moment....." -#define PRINTING_SP "Imprimiendo" -#define PRINTING_AJUSTES_SP "Ajustes" -#define PRINTING_PAUSAR_SP "Pausar" +#define PRINTING_SP "Imprimiendo" +#define PRINTING_AJUSTES_SP "Ajustes" +#define PRINTING_PAUSAR_SP "Pausar" + +#define MESSAGE_PAUSING_SP "Aparcando..." +#define MESSAGE_CHANGING_SP "Esperando para iniciar el cambio de filamento" +#define MESSAGE_UNLOAD_SP "Espere para liberar el filamento" +#define MESSAGE_WAITING_SP "Pulsar el botón para reanudar impresión" +#define MESSAGE_INSERT_SP "Inserte el filamento y pulse el botón para continuar..." +#define MESSAGE_LOAD_SP "Espere para purgar el filamento" +#define MESSAGE_PURGE_SP "Espere para purgar el filamento" +#define MESSAGE_RESUME_SP "Esperando impresora para reanudar..." +#define MESSAGE_HEAT_SP "Pulse el botón para calentar la boquilla" +#define MESSAGE_HEATING_SP "Calentando boquilla Espere por favor..." +#define MESSAGE_OPTION_SP "¿Purgar más o continuar con la impresión?" +#define MESSAGE_PURGE_MORE_SP "Purga" +#define MESSAGE_CONTINUE_PRINT_SP "Impresión" +#define EEPROM_SETTINGS_TITLE_SP "Configuraciones EEPROM" +#define EEPROM_SETTINGS_STORE_SP "Guardar configuración en EEPROM" +#define EEPROM_SETTINGS_READ_SP "Leer la configuración de EEPROM" +#define EEPROM_SETTINGS_REVERT_SP "Revert settings to factory defaults" -#define MESSEGE_PAUSING_SP "Aparcando..." -#define MESSEGE_CHANGING_SP "Esperando para iniciar el cambio de filamento" -#define MESSEGE_UNLOAD_SP "Espere para liberar el filamento" -#define MESSEGE_WAITING_SP "Pulsar el botón para reanudar impresión" -#define MESSEGE_INSERT_SP "Inserte el filamento y pulse el botón para continuar..." -#define MESSEGE_LOAD_SP "Espere para purgar el filamento" -#define MESSEGE_PURGE_SP "Espere para purgar el filamento" -#define MESSEGE_RESUME_SP "Esperando impresora para reanudar..." -#define MESSEGE_HEAT_SP "Pulse el botón para calentar la boquilla" -#define MESSEGE_HEATING_SP "Calentando boquilla Espere por favor..." -#define MESSEGE_OPTION_SP "¿Purgar más o continuar con la impresión?" -#define MESSEGE_PURGE_MORE_SP "Purga" -#define MESSEGE_CONTINUE_PRINT_SP "Impresión" +#define EEPROM_STORE_TIPS_SP "¿Guardar ajustes en EEPROM?" +#define EEPROM_READ_TIPS_SP "Leer la configuración de EEPROM?" +#define EEPROM_REVERT_TIPS_SP "Revert settings to factory defaults?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index e69de29bb2d1..19bd511d9a38 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -0,0 +1,480 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +//***************ç¹ä½“中文**********************// +#define NEXT_T_CN "下一é " +#define PREVIOUS_T_CN "上一é " +#define DEFAULT_T_CN "默èªå€¼" +#define KEY_BACK_T_CN "退格" +#define KEY_REST_T_CN "é‡ç½®" +#define KEY_CONFIRM_T_CN "確定" + +#define MACHINE_PARA_TITLE_T_CN "機器åƒæ•¸" +#define MACHINE_TYPE_CNOFIG_T_CN "機器設置" +#define TEMPERATURE_CONFIG_T_CN "溫度設置" +#define MOTOR_CONFIG_T_CN "電機設置" +#define ADVANCE_CONFIG_T_CN "高級設置" + +#define MACHINE_CONFIG_TITLE_T_CN "機器åƒæ•¸>機器é…ç½®" +#define MACHINE_TYPE_T_CN "æ©Ÿåž‹é¸æ“‡" +#define MACHINE_STROKE_T_CN "行程設置" +#define MACHINE_HOMEDIR_T_CN "歸零方å‘" +#define MACHINE_ENDSTOP_TYPE_T_CN "é™ä½é–‹é—œé¡žåž‹" +#define MACHINE_FILAMENT_CONFIG_T_CN "æ›æ–™è¨­ç½®" +#define MACHINE_LEVELING_CONFIG_T_CN "調平設置" + +#define MACHINE_TYPE_CONFIG_TITLE_T_CN "機器åƒæ•¸>æ©Ÿåž‹é¸æ“‡" +#define MACHINE_TYPE_XYZ_T_CN "XYZæ©Ÿåž‹" +#define MACHINE_TYPE_DELTA_T_CN "Deltaæ©Ÿåž‹" +#define MACHINE_TYPE_COREXY_T_CN "Corexyæ©Ÿåž‹" + +#define MACHINE_STROKE_CONF_TITLE_T_CN "機器åƒæ•¸>機器行程" +#define X_MAX_LENGTH_T_CN "X軸最大行程" +#define Y_MAX_LENGTH_T_CN "Y軸最大行程" +#define Z_MAX_LENGTH_T_CN "Z軸最大行程" + +#define X_MIN_LENGTH_T_CN "X軸最å°è¡Œç¨‹" +#define Y_MIN_LENGTH_T_CN "Y軸最å°è¡Œç¨‹" +#define Z_MIN_LENGTH_T_CN "Z軸最å°è¡Œç¨‹" + +#define HOME_DIR_CONF_TITLE_T_CN "機器åƒæ•¸>歸零方å‘" +#define HOME_DIR_X_T_CN "X軸歸零方å‘" +#define HOME_DIR_Y_T_CN "Y軸歸零方å‘" +#define HOME_DIR_Z_T_CN "Z軸歸零方å‘" +#define HOME_MIN_T_CN "MIN" +#define HOME_MAX_T_CN "MAX" + +#define ENDSTOP_CONF_TITLE_T_CN "機器åƒæ•¸>é™ä½é–‹é—œ" +#define MIN_ENDSTOP_X_T_CN "X軸最å°é™ä½" +#define MIN_ENDSTOP_Y_T_CN "Y軸最å°é™ä½" +#define MIN_ENDSTOP_Z_T_CN "Z軸最å°é™ä½" +#define MAX_ENDSTOP_X_T_CN "X軸最大é™ä½" +#define MAX_ENDSTOP_Y_T_CN "Y軸最大é™ä½" +#define MAX_ENDSTOP_Z_T_CN "Z軸最大é™ä½" +#define ENDSTOP_FIL_T_CN "斷料開關類型" +#define ENDSTOP_LEVEL_T_CN "調平開關類型" +#define ENDSTOP_OPENED_T_CN "常開" +#define ENDSTOP_CLOSED_T_CN "常閉" + +#define FILAMENT_CONF_TITLE_T_CN "æ›æ–™è¨­ç½®" +#define FILAMENT_IN_TEMPERATURE_T_CN "進料溫度" +#define FILAMENT_IN_LENGTH_T_CN "進料長度" +#define FILAMENT_IN_SPEED_T_CN "進料速度" +#define FILAMENT_OUT_TEMPERATURE_T_CN "退料溫度" +#define FILAMENT_OUT_LENGTH_T_CN "退料長度" +#define FILAMENT_OUT_SPEED_T_CN "退料速度" + +#define LEVELING_CONF_TITLE_T_CN "調平設置" +#define LEVELING_PARA_CONF_T_CN "調平設置" +#define LEVELING_DELTA_T_CN "delta機型設置" +#define LEVELING_XYZ_T_CN "手動調平å標設置" + +#define LEVELING_PARA_CONF_TITLE_T_CN "調平åƒæ•¸" +#define AUTO_LEVELING_ENABLE_T_CN "自動調平" +#define BLTOUCH_LEVELING_ENABLE_T_CN "å•Ÿå‹•BLtouch" +#define PROBE_PORT_T_CN "調平探é‡æŽ¥å£" +#define PROBE_X_OFFSET_T_CN "探é‡Xæ–¹å‘å移" +#define PROBE_Y_OFFSET_T_CN "探针Yæ–¹å‘å移" +#define PROBE_Z_OFFSET_T_CN "探针Zæ–¹å‘å移" +#define PROBE_XY_SPEED_T_CN "探针XYæ–¹å‘移動速度" +#define PROBE_Z_SPEED_T_CN "探针Zæ–¹å‘移動速度" +#define ENABLE_T_CN "是" +#define DISABLE_T_CN "å¦" +#define Z_MIN_T_CN "ZMin" +#define Z_MAX_T_CN "ZMax" + +#define DELTA_LEVEL_CONF_TITLE_T_CN "Delta機器åƒæ•¸" +#define DELTA_LEVEL_CONF_T_CN "Delta機器調平" +#define DELTA_MACHINE_RADIUS_T_CN "機器åŠå¾‘" +#define DELTA_DIAGONAL_ROD_T_CN "機器桿長" +#define DELTA_PRINT_RADIUS_T_CN "打å°åŠå¾‘" +#define DELTA_HEIGHT_T_CN "打å°é«˜åº¦" +#define SMOOTH_ROD_OFFSET_T_CN "滑塊å移" +#define EFFECTOR_OFFSET_T_CN "效應器å移" +#define CALIBRATION_RADIUS_T_CN "調平åŠå¾‘" + +#define XYZ_LEVEL_CONF_TITLE_T_CN "XYZ機器åƒæ•¸" +#define PROBE_REACH_MAX_LEFT_T_CN "探针é”到最左ä½ç½®" +#define PROBE_REACH_MAX_RIGHT_T_CN "探针é”到最å³ä½ç½®" +#define PROBE_REACH_MAX_FRONT_T_CN "探针é”到最å‰ä½ç½®" +#define PROBE_REACH_MAX_BACK_T_CN "探针é”到最後ä½ç½®" + +#define TEMPERATURE_CONF_TITLE_T_CN "機器åƒæ•¸>溫度設置" +#define NOZZLE_CONF_T_CN "噴頭設置" +#define HOTBED_CONF_T_CN "熱床設置" +#define PREHEAT_TEMPER_T_CN "é è¨­æº«åº¦" + +#define NOZZLE_CONF_TITLE_T_CN "機器åƒæ•¸>噴頭設置" +#define NOZZLECNT_T_CN "噴頭數é‡" +#define NOZZLE_TYPE_T_CN "E0溫感類型" +#define NOZZLE_ADJUST_TYPE_T_CN "PID調溫" +#define NOZZLE_MIN_TEMPERATURE_T_CN "最低溫度" +#define NOZZLE_MAX_TEMPERATURE_T_CN "最高溫度" +#define EXTRUD_MIN_TEMPER_T_CN "最低擠出溫度" + +#define HOTBED_CONF_TITLE_T_CN "機器åƒæ•¸>熱床設置" +#define HOTBED_ADJUST_T_CN "PID調溫" +#define HOTBED_MIN_TEMPERATURE_T_CN "最低溫度" +#define HOTBED_MAX_TEMPERATURE_T_CN "最高溫度" + +#define MOTOR_CONF_TITLE_T_CN "機器åƒæ•¸>電機設置" +#define MAXFEEDRATE_CONF_T_CN "最大速度設置" +#define ACCELERATION_CONF_T_CN "加速度設置" +#define JERKCONF_T_CN "çªè®Šé€Ÿåº¦è¨­ç½®" +#define STEPSCONF_T_CN "脈沖設置" +#define TMC_CURRENT_T_CN "TMC é©…å‹•é›»æµè¨­ç½®" +#define TMC_STEP_MODE_T_CN "TMC 驅動模å¼è¨­ç½®" +#define MOTORDIRCONF_T_CN "電機方å‘設置" +#define HOMEFEEDRATECONF_T_CN "歸零速度設置" + +#define MAXFEEDRATE_CONF_TITLE_T_CN "機器åƒæ•¸>最大速度" +#define X_MAXFEEDRATE_T_CN "X軸最大速度" +#define Y_MAXFEEDRATE_T_CN "Y軸最大速度" +#define Z_MAXFEEDRATE_T_CN "Z軸最大速度" +#define E0_MAXFEEDRATE_T_CN "E0軸最大速度" +#define E1_MAXFEEDRATE_T_CN "E1軸最大速度" + +#define ACCELERATION_CONF_TITLE_T_CN "機器åƒæ•¸>加速度" +#define PRINT_ACCELERATION_T_CN "打å°åŠ é€Ÿåº¦" +#define RETRACT_ACCELERATION_T_CN "回抽加速度" +#define TRAVEL_ACCELERATION_T_CN "空載加速度" +#define X_ACCELERATION_T_CN "X軸加速度" +#define Y_ACCELERATION_T_CN "Y軸加速度" +#define Z_ACCELERATION_T_CN "Z軸加速度" +#define E0_ACCELERATION_T_CN "E0軸加速度" +#define E1_ACCELERATION_T_CN "E1軸加速度" + +#define JERK_CONF_TITLE_T_CN "機器åƒæ•¸>çªè®Šé€Ÿåº¦" +#define X_JERK_T_CN "X軸çªè®Šé€Ÿåº¦" +#define Y_JERK_T_CN "Y軸çªè®Šé€Ÿåº¦" +#define Z_JERK_T_CN "Z軸çªè®Šé€Ÿåº¦" +#define E_JERK_T_CN "E軸çªè®Šé€Ÿåº¦" + +#define STEPS_CONF_TITLE_T_CN "機器åƒæ•¸>脈è¡è¨­ç½®" +#define X_STEPS_T_CN "X軸脈沖" +#define Y_STEPS_T_CN "Y軸脈沖" +#define Z_STEPS_T_CN "Z軸脈沖" +#define E0_STEPS_T_CN "E0軸脈沖" +#define E1_STEPS_T_CN "E1軸脈沖" + +#define TMC_CURRENT_CONF_TITLE_T_CN "機器åƒæ•¸>TMCé›»æµè¨­ç½®" +#define X_TMC_CURRENT_T_CN "X軸電æµ(毫安)" +#define Y_TMC_CURRENT_T_CN "Y軸電æµ(毫安)" +#define Z_TMC_CURRENT_T_CN "Z軸電æµ(毫安)" +#define E0_TMC_CURRENT_T_CN "E0軸電æµ(毫安)" +#define E1_TMC_CURRENT_T_CN "E1軸電æµ(毫安)" + +#define TMC_MODE_CONF_TITLE_T_CN "機器åƒæ•¸>TMC模å¼è¨­ç½®" +#define X_TMC_MODE_T_CN "X軸是å¦ä½¿èƒ½éœéŸ³æ¨¡å¼" +#define Y_TMC_MODE_T_CN "Y軸是å¦ä½¿èƒ½éœéŸ³æ¨¡å¼" +#define Z_TMC_MODE_T_CN "Z軸是å¦ä½¿èƒ½éœéŸ³æ¨¡å¼" +#define E0_TMC_MODE_T_CN "E0軸是å¦ä½¿èƒ½éœéŸ³æ¨¡å¼" +#define E1_TMC_MODE_T_CN "E1軸是å¦ä½¿èƒ½éœéŸ³æ¨¡å¼" + +#define MOTORDIR_CONF_TITLE_T_CN "機器åƒæ•¸>電機方å‘" +#define X_MOTORDIR_T_CN "X軸電機方å‘" +#define Y_MOTORDIR_T_CN "Y軸電機方å‘" +#define Z_MOTORDIR_T_CN "Z軸電機方å‘" +#define E0_MOTORDIR_T_CN "E0軸電機方å‘" +#define E1_MOTORDIR_T_CN "E1軸電機方å‘" +#define INVERT_P_T_CN "æ­£å‘" +#define INVERT_N_T_CN "åå‘" + +#define HOMEFEEDRATE_CONF_TITLE_T_CN "機器åƒæ•¸>歸零速度" +#define X_HOMESPEED_T_CN "XY軸歸零速度" +#define Y_HOMESPEED_T_CN "Y軸歸零速度" +#define Z_HOMESPEED_T_CN "Z軸歸零速度" + +#define ADVANCED_CONF_TITLE_T_CN "機器åƒæ•¸>高級設置" +#define PWROFF_DECTION_T_CN "斷電檢測模塊" +#define PWROFF_AFTER_PRINT_T_CN "啟動打完關機功能" +#define HAVE_UPS_T_CN "機器é…å‚™UPS電壓" +#define Z2_AND_Z2ENDSTOP_CONF_T_CN "é›™z軸雙é™ä½åŠŸèƒ½è¨­ç½®" +#define ENABLE_PINS_CONF_T_CN "電機使能腳電平設置" + +#define Z2_AND_Z2ENDSTOP_CONF_TITLE_T_CN "é›™z軸雙é™ä½è¨­ç½®" +#define Z2_ENABLE_T_CN "啟用Z2軸" +#define Z2_ENDSTOP_T_CN "啟用Z2é™ä½" +#define Z2_PORT_T_CN "Z2é™ä½æŽ¥å£" + +#define ENABLE_PINS_CONF_TITLE_T_CN "電機使能腳電平" +#define X_ENABLE_PINS_INVERT_T_CN "X軸電機使能電平" +#define Y_ENABLE_PINS_INVERT_T_CN "Y軸電機使能電平" +#define Z_ENABLE_PINS_INVERT_T_CN "Z軸電機使能電平" +#define E_ENABLE_PINS_INVERT_T_CN "E軸電機使能電平" + +#define PAUSE_POSITION_T_CN "打å°æš«åœä½ç½®è¨­ç½®" +#define PAUSE_POSITION_X_T_CN "X軸暫åœä½ç½®(絕å°ä½ç½®,-1無效)" +#define PAUSE_POSITION_Y_T_CN "Y軸暫åœä½ç½®(絕å°ä½ç½®,-1無效)" +#define PAUSE_POSITION_Z_T_CN "Z軸暫åœä½ç½®(相å°ä½ç½®,-1無效)" + +#define TOOL_TEXT_T_CN "工具" +#define PREHEAT_TEXT_T_CN "é ç†±" +#define MOVE_TEXT_T_CN "移動" +#define HOME_TEXT_T_CN "回零" +#define PRINT_TEXT_T_CN "打å°" +#define EXTRUDE_TEXT_T_CN "擠出" +#define LEVELING_TEXT_T_CN "調平" +#define AUTO_LEVELING_TEXT_T_CN "自動調平" +#define SET_TEXT_T_CN "設置" +#define MORE_TEXT_T_CN "更多" + +#define ADD_TEXT_T_CN "增加" +#define DEC_TEXT_T_CN "減少" +#define EXTRUDER_1_TEXT_T_CN "å™´é ­1" +#define EXTRUDER_2_TEXT_T_CN "å™´é ­2" +#define HEATBED_TEXT_T_CN "熱床" +#define TEXT_1C_T_CN "1℃" +#define TEXT_5C_T_CN "5℃" +#define TEXT_10C_T_CN "10℃" +#define CLOSE_TEXT_T_CN "關閉" + +#define BACK_TEXT_T_CN "返回" + +#define TOOL_PREHEAT_T_CN "é ç†±" +#define TOOL_EXTRUDE_T_CN "擠出" +#define TOOL_MOVE_T_CN "移動" +#define TOOL_HOME_T_CN "回零" +#define TOOL_LEVELING_T_CN "調平" +#define TOOL_AUTO_LEVELING_T_CN "自動調平" +#define TOOL_FILAMENT_T_CN "æ›æ–™" +#define TOOL_MORE_T_CN "更多" + +#define AXIS_X_ADD_TEXT_T_CN "X+" +#define AXIS_X_DEC_TEXT_T_CN "X-" +#define AXIS_Y_ADD_TEXT_T_CN "Y+" +#define AXIS_Y_DEC_TEXT_T_CN "Y-" +#define AXIS_Z_ADD_TEXT_T_CN "Z+" +#define AXIS_Z_DEC_TEXT_T_CN "Z-" +#define TEXT_01MM_T_CN "0.1mm" +#define TEXT_1MM_T_CN "1mm" +#define TEXT_10MM_T_CN "10mm" + +#define HOME_X_TEXT_T_CN "X" +#define HOME_Y_TEXT_T_CN "Y" +#define HOME_Z_TEXT_T_CN "Z" +#define HOME_ALL_TEXT_T_CN "回零" +#define HOME_STOPMOVE_T_CN "急åœ" + +#define PAGE_UP_TEXT_T_CN "上一é " +#define PAGE_DOWN_TEXT_T_CN "下一é " + +#define EXTRUDER_IN_TEXT_T_CN "進料" +#define EXTRUDER_OUT_TEXT_T_CN "退料" +#define EXTRUDE_1MM_TEXT_T_CN "1mm" +#define EXTRUDE_5MM_TEXT_T_CN "5mm" +#define EXTRUDE_10MM_TEXT_T_CN "10mm" +#define EXTRUDE_LOW_SPEED_TEXT_T_CN "低速" +#define EXTRUDE_MEDIUM_SPEED_TEXT_T_CN "常速" +#define EXTRUDE_HIGH_SPEED_TEXT_T_CN "高速" + +#define LEVELING_POINT1_TEXT_T_CN "第一點" +#define LEVELING_POINT2_TEXT_T_CN "第二點" +#define LEVELING_POINT3_TEXT_T_CN "第三點" +#define LEVELING_POINT4_TEXT_T_CN "第四點" +#define LEVELING_POINT5_TEXT_T_CN "第五點" + +#define FILESYS_TEXT_T_CN "文件系統" +#define WIFI_TEXT_T_CN "WIFI" +#define FAN_TEXT_T_CN "風扇" +#define ABOUT_TEXT_T_CN "關於" +#define BREAK_POINT_TEXT_T_CN "斷點續打" +#define FILAMENT_TEXT_T_CN "æ›æ–™" +#define LANGUAGE_TEXT_T_CN "語言" +#define MOTOR_OFF_TEXT_T_CN "關閉電機" +#define MOTOR_OFF_XY_TEXT_T_CN "關閉XY" +#define SHUTDOWN_TEXT_T_CN "關機" +#define MACHINE_PARA_T_CN "機器åƒæ•¸" +#define EEPROM_SETTINGS_T_CN "Eeprom設置" + +#define U_DISK_TEXT_T_CN "U盤" +#define SD_CARD_TEXT_T_CN "SDå¡" +#define WIFI_NAME_TEXT_T_CN "無線網絡:" +#define WIFI_KEY_TEXT_T_CN "密碼: " +#define WIFI_IP_TEXT_T_CN "IP: " +#define WIFI_AP_TEXT_T_CN "狀態: AP" +#define WIFI_STA_TEXT_T_CN "狀態: STA" +#define WIFI_CONNECTED_TEXT_T_CN "已連接" +#define WIFI_DISCONNECTED_TEXT_T_CN "未連接" +#define WIFI_EXCEPTION_TEXT_T_CN "模塊異常" +#define CLOUD_TEXT_T_CN "雲æœå‹™" +#define CLOUD_BIND_T_CN "å·²ç¶å®š" +#define CLOUD_UNBIND_T_CN "解ç¶" +#define CLOUD_UNBINDING_T_CN "解绑中" +#define CLOUD_DISCONNECTED_T_CN "未連接" +#define CLOUD_UNBINDED_T_CN "未ç¶å®š" +#define CLOUD_BINDED_T_CN "å·²ç¶å®š" +#define CLOUD_DISABLE_T_CN "å·²ç¦ç”¨" + +#define FAN_ADD_TEXT_T_CN "增加" +#define FAN_DEC_TEXT_T_CN "減少" +#define FAN_OPEN_TEXT_T_CN "100%" +#define FAN_HALF_TEXT_T_CN "50%" +#define FAN_CLOSE_TEXT_T_CN "關閉" +#define FAN_TIPS1_TEXT_T_CN "風扇" +#define FAN_TIPS2_TEXT_T_CN "FAN\nClose" + +#define FILAMENT_IN_TEXT_T_CN "進料" +#define FILAMENT_OUT_TEXT_T_CN "退料" +#define FILAMENT_EXT0_TEXT_T_CN "å™´é ­1" +#define FILAMENT_EXT1_TEXT_T_CN "å™´é ­2" +#define FILAMENT_HEAT_TEXT_T_CN "é ç†±" +#define FILAMENT_STOP_TEXT_T_CN "åœæ­¢" +//#define FILAMENT_CHANGE_TEXT_T_CN "準備æ›æ–™" +#define FILAMENT_TIPS2_TEXT_T_CN "T:" +#define FILAMENT_TIPS3_TEXT_T_CN "正在進料" +#define FILAMENT_TIPS4_TEXT_T_CN "正在退料" +#define FILAMENT_TIPS5_TEXT_T_CN "溫度太低,è«‹å…ˆé ç†±" +#define FILAMENT_TIPS6_TEXT_T_CN "æ›æ–™å®Œæˆ" + +#if 0 + #define FILAMENT_REPLAYS_IDLE_TEXT_T_CN "請按<進料>或<退料>進行æ›æ–™!" + #define FILAMENT_CHANGE_TEXT_T_CN "待打å°æ©Ÿæš«åœåŽ,請按<進料>或<退料>進行æ›æ–™!" +#endif + + #define FILAMENT_CHANGE_TEXT_T_CN "待打å°æ©Ÿæš«åœåŽ,\n請按<進料>或<退料>" + +#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_T_CN "準備進料,正在加熱,è«‹ç¨ç­‰" +#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_T_CN "準備退料,正在加熱,è«‹ç¨ç­‰" +#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_T_CN "加熱完æˆ,è«‹è£è¼‰è€—æåŽ,按<確定>開始進料" +#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_T_CN "è«‹è£è¼‰è€—,按<確定>開始進料!" +#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_T_CN "加熱完æˆ,请按<確定>開始退料!" +#define FILAMENT_DIALOG_LOADING_TIPS_T_CN "正在進料,请等待耗æ加載完æˆ!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_T_CN "正在退料,请等待耗æå¸è¼‰å®Œæˆ!" +#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_T_CN "進料完æˆ,请按<確定>返回" +#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_T_CN "退料完æˆ,请按<確定>返回" + +#define PRE_HEAT_EXT_TEXT_T_CN "å™´é ­" +#define PRE_HEAT_BED_TEXT_T_CN "熱床" + +#define FILE_LOADING_T_CN "正在載入......" +#define NO_FILE_AND_CHECK_T_CN "無文件!è«‹æ’å…¥sdå¡/u盤!" +#define NO_FILE_T_CN "無文件!" + +#define EXTRUDER_TEMP_TEXT_T_CN "溫度" +#define EXTRUDER_E_LENGTH1_TEXT_T_CN "å™´é ­" +#define EXTRUDER_E_LENGTH2_TEXT_T_CN "å™´é ­" +#define EXTRUDER_E_LENGTH3_TEXT_T_CN "å™´é ­" + +#define ABOUT_TYPE_TEXT_T_CN "Type: " +#define ABOUT_VERSION_TEXT_T_CN "Firmware: " +#define ABOUT_WIFI_TEXT_T_CN "Wifi: " + +#define PRINTING_OPERATION_T_CN "æ“作" +#define PRINTING_PAUSE_T_CN "æš«åœ" +#define PRINTING_TEMP_T_CN "溫度" +#define PRINTING_CHANGESPEED_T_CN "變速" +#define PRINTING_RESUME_T_CN "æ¢å¾©" +#define PRINTING_STOP_T_CN "åœæ­¢" +#define PRINTING_MORE_T_CN "更多" +#define PRINTING_EXTRUDER_T_CN "擠出" +#define PRINTING_MOVE_T_CN "移動" + +#define EXTRUDER_SPEED_T_CN "擠出" +#define MOVE_SPEED_T_CN "移動" +#define EXTRUDER_SPEED_STATE_T_CN "擠出速度" +#define MOVE_SPEED_STATE_T_CN "移動速度" +#define STEP_1PERCENT_T_CN "1%%" +#define STEP_5PERCENT_T_CN "5%%" +#define STEP_10PERCENT_T_CN "10%%" + +#define ZOFFSET_T_CN "Z Offset" +#define ZOFFSET_INC_T_CN "增加" +#define ZOFFSET_DEC_T_CN "減少" + +#define TITLE_READYPRINT_T_CN "準備打å°" +#define TITLE_PREHEAT_T_CN "é ç†±" +#define TITLE_MOVE_T_CN "移動" +#define TITLE_HOME_T_CN "回零" +#define TITLE_EXTRUDE_T_CN "擠出" +#define TITLE_LEVELING_T_CN "調平" +#define TITLE_SET_T_CN "設置" +#define TITLE_MORE_T_CN "更多" +#define TITLE_CHOOSEFILE_T_CN "é¸æ“‡æ–‡ä»¶" +#define TITLE_PRINTING_T_CN "正在打å°" +#define TITLE_OPERATION_T_CN "æ“作" +#define TITLE_ADJUST_T_CN "調整" +#define TITLE_WIRELESS_T_CN "無線網絡" +#define TITLE_FILAMENT_T_CN "æ›æ–™" +#define TITLE_ABOUT_T_CN "關於" +#define TITLE_FAN_T_CN "風扇" +#define TITLE_LANGUAGE_T_CN "語言" +#define TITLE_PAUSE_T_CN "æš«åœ" +#define TITLE_CHANGESPEED_T_CN "變速" +#define TITLE_CLOUD_TEXT_T_CN "雲æœå‹™" +#define TITLE_DIALOG_CONFIRM_T_CN "確èª" +#define TITLE_FILESYS_T_CN "文件系統" +#define TITLE_ZOFFSET_T_CN "Z Offset" + +#define AUTO_SHUTDOWN_T_CN "自動關機" +#define MANUAL_SHUTDOWN_T_CN "手動關機" + +#define DIALOG_CONFIRM_T_CN "確定" +#define DIALOG_CANCLE_T_CN "å–消" +#define DIALOG_OK_T_CN "確èª" +#define DIALOG_RESET_T_CN "é‡è¨­" +#define DIALOG_RETRY_T_CN "é‡è©¦" +#define DIALOG_DISABLE_T_CN "ç¦ç”¨" +#define DIALOG_PRINT_MODEL_T_CN "打å°æ¨¡åž‹?" +#define DIALOG_CANCEL_PRINT_T_CN "åœæ­¢æ‰“å°?" +#define DIALOG_RETRY_T_CN "é‡è©¦" +#define DIALOG_STOP_T_CN "åœæ­¢" +#define DIALOG_REPRINT_FROM_BREAKPOINT_T_CN "從斷點續打?" +//#define DIALOG_UNBIND_PRINTER_T_CN "解除ç¶å®š?" +#define DIALOG_ERROR_TIPS1_T_CN "錯誤:找ä¸åˆ°æ–‡ä»¶,è«‹æ’å…¥sdå¡/u盤!" +#define DIALOG_ERROR_TIPS2_T_CN "錯誤:通信失敗,請檢查波特率或主æ¿ç¡¬ä»¶!" +#define DIALOG_ERROR_TIPS3_T_CN "錯誤:文件å或文件路徑太長!" +#define DIALOG_CLOSE_MACHINE_T_CN "正在關機......" +#define DIALOG_UNBIND_PRINTER_T_CN "解除ç¶å®š?" +#define DIALOG_FILAMENT_NO_PRESS_T_CN "è«‹å…ˆè£è¼‰è€—æ!" +#define DIALOG_PRINT_FINISH_T_CN "打å°å®Œæˆ!" +#define DIALOG_PRINT_TIME_T_CN "打å°æ™‚é–“: " +#define DIALOG_REPRINT_T_CN "å†æ‰“å°å£¹æ¬¡" +#define DIALOG_WIFI_ENABLE_TIPS_T_CN "wifi模塊正在é…置中,è«‹ç¨ç­‰......" + +#define TEXT_VALUE_T_CN "%d℃/%d℃" +#define EXTRUDE_TEXT_VALUE_T_T_CN ": %d℃" +#define WIFI_RECONNECT_TEXT_T_CN "é‡æ–°é€£æŽ¥" + +#define MESSAGE_PAUSING_T_CN "æš«åœä¸­..." +#define MESSAGE_CHANGING_T_CN "等待æ›æ–™é–‹å§‹..." +#define MESSAGE_UNLOAD_T_CN "退料中,è«‹ç¨ç­‰..." +#define MESSAGE_WAITING_T_CN "點擊按鈕æ¢å¾©æ‰“å°" +#define MESSAGE_INSERT_T_CN "è£è¼‰è€—æ後,點擊按鈕開始打å°" +#define MESSAGE_LOAD_T_CN "進料中,è«‹ç¨ç­‰..." +#define MESSAGE_PURGE_T_CN "等待擠出..." +#define MESSAGE_RESUME_T_CN "等待æ¢å¾©æ‰“å°..." +#define MESSAGE_HEAT_T_CN "按下按鈕,加熱噴頭" +#define MESSAGE_HEATING_T_CN "噴頭加熱中,請等待..." +#define MESSAGE_OPTION_T_CN "擠出更多還是繼續打å°" +#define MESSAGE_PURGE_MORE_T_CN "擠出" +#define MESSAGE_CONTINUE_PRINT_T_CN "打å°" + +#define EEPROM_SETTINGS_TITLE_T_CN "EEPROM 設置" +#define EEPROM_SETTINGS_STORE_T_CN "ä¿å­˜åƒæ•¸è‡³EEPROM" +#define EEPROM_SETTINGS_READ_T_CN "讀å–EEPROMåƒæ•¸" +#define EEPROM_SETTINGS_REVERT_T_CN "æ¢å¾©é»˜èªåƒæ•¸" + +#define EEPROM_STORE_TIPS_T_CN "是å¦ä¿å­˜åƒæ•¸åˆ°EEPROM?" +#define EEPROM_READ_TIPS_T_CN "是å¦ä½¿ç”¨EEPROMåƒæ•¸?" +#define EEPROM_REVERT_TIPS_T_CN "是å¦æ¢å¾©é»˜èªåƒæ•¸?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index 5da3dd168150..e8ac3f351914 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -22,7 +22,7 @@ #include "../../../../inc/MarlinConfig.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs @@ -270,4 +270,4 @@ #endif // LCD_USE_DMA_FSMC #endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index ac69bf06697d..f24f08e98e3a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -21,25 +21,28 @@ */ /** - * @file lcd_lvgl_configuration.c + * @file tft_lvgl_configuration.cpp * @date 2020-02-21 */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" +#if ENABLED(TFT_LVGL_UI_SPI) + #include "SPI_TFT.h" +#endif #include "tft_lvgl_configuration.h" -#include "lvgl.h" -#include "../../../../feature/touch/xpt2046.h" #include "draw_ready_print.h" #include "W25Qxx.h" #include "pic_manager.h" - #include "mks_hardware_test.h" #include "draw_ui.h" +#include + +#include "../../../../MarlinCore.h" +#include "../../../../feature/touch/xpt2046.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -47,26 +50,13 @@ #include -#if ENABLED(SPI_GRAPHICAL_TFT) - #include "SPI_TFT.h" -#endif - -extern void LCD_IO_Init(uint8_t cs, uint8_t rs); -extern void LCD_IO_WriteData(uint16_t RegValue); -extern void LCD_IO_WriteReg(uint16_t Reg); -extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); -extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); - #if HAS_SPI_FLASH_FONT extern void init_gb2312_font(); #endif static lv_disp_buf_t disp_buf; #if ENABLED(SDSUPPORT) - extern void UpdatePic(); - #if HAS_SPI_FLASH_FONT - extern void UpdateFont(); - #endif + extern void UpdateAssets(); #endif uint16_t DeviceCode = 0x9488; extern uint8_t sel_id; @@ -96,6 +86,13 @@ void SysTick_Callback() { print_time_count(); } +#if DISABLED(TFT_LVGL_UI_SPI) + +extern void LCD_IO_Init(uint8_t cs, uint8_t rs); +extern void LCD_IO_WriteData(uint16_t RegValue); +extern void LCD_IO_WriteReg(uint16_t Reg); + +extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); void tft_set_cursor(uint16_t x, uint16_t y) { LCD_IO_WriteReg(0x002A); LCD_IO_WriteData(x >> 8); @@ -133,9 +130,9 @@ void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { if ((x > 480) || (y > 320)) return; //} //**if ( (x>320)||(y>240) ) return; - tft_set_cursor(x, y); /*设置光标ä½ç½®*/ + tft_set_cursor(x, y); - LCD_WriteRAM_Prepare(); /* 开始写入GRAM*/ + LCD_WriteRAM_Prepare(); //LCD_WriteRAM(point); LCD_IO_WriteData(point); } @@ -143,7 +140,7 @@ void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) { /* Write 16-bit Index, then Write Reg */ ClrCs - LCD_IO_WriteReg(LCD_Reg); + LCD_IO_WriteReg(LCD_Reg); /* Write 16-bit Reg */ LCD_IO_WriteData(LCD_RegValue); SetCs @@ -265,7 +262,6 @@ void LCD_Clear(uint16_t Color) { extern uint16_t ILI9488_ReadRAM(); -#if DISABLED(SPI_GRAPHICAL_TFT) void init_tft() { uint16_t i; @@ -356,12 +352,10 @@ void init_tft() { LCD_IO_WriteReg(0x0036); //ILI9488_WriteData(0x0068); - //if (gCfgItems.overturn_180 != 0xEE) - //{ + //if (gCfgItems.overturn_180 != 0xEE) { LCD_IO_WriteData(0x0068); //} - //else - //{ + //else { //ILI9488_WriteData(0x00A8); //} @@ -406,16 +400,22 @@ void init_tft() { } } -#endif // if DISABLED(SPI_GRAPHICAL_TFT) +#endif // !TFT_LVGL_UI_SPI extern uint8_t bmp_public_buf[17 * 1024]; + void tft_lvgl_init() { + //uint16_t test_id=0; W25QXX.init(SPI_QUARTER_SPEED); //test_id=W25QXX.W25QXX_ReadID(); + gCfgItems_init(); + ui_cfg_init(); + disp_language_init(); + //init tft first! - #if ENABLED(SPI_GRAPHICAL_TFT) + #if ENABLED(TFT_LVGL_UI_SPI) SPI_TFT.spi_init(SPI_FULL_SPEED); SPI_TFT.LCD_init(); #else @@ -423,20 +423,13 @@ void tft_lvgl_init() { #endif #if ENABLED(SDSUPPORT) - UpdatePic(); - #if HAS_SPI_FLASH_FONT - UpdateFont(); - #endif + UpdateAssets(); #endif + mks_test_get(); - gCfgItems_init(); - ui_cfg_init(); - disp_language_init(); //spi_flash_read_test(); - #if ENABLED(TOUCH_BUTTONS) - touch.init(); - #endif + TERN_(TOUCH_BUTTONS, touch.init()); lv_init(); @@ -465,33 +458,32 @@ void tft_lvgl_init() { filament_pin_setup(); #if ENABLED(POWER_LOSS_RECOVERY) - if (recovery.valid()) { - if (gCfgItems.from_flash_pic == 1) - flash_preview_begin = 1; - else - default_preview_flg = 1; + if (recovery.valid()) { + if (gCfgItems.from_flash_pic == 1) + flash_preview_begin = 1; + else + default_preview_flg = 1; - uiCfg.print_state = REPRINTING; + uiCfg.print_state = REPRINTING; - memset(public_buf_m, 0, sizeof(public_buf_m)); - strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); - card.printLongPath(public_buf_m); + ZERO(public_buf_m); + strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); + card.printLongPath(public_buf_m); - strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id])); + strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id])); - lv_draw_printing(); - } - else + lv_draw_printing(); + } + else #endif - lv_draw_ready_print(); + lv_draw_ready_print(); - #if ENABLED(MKS_TEST) - Test_GPIO(); - #endif + if (mks_test_flag == 0x1E) + mks_gpio_test(); } void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { - #if ENABLED(SPI_GRAPHICAL_TFT) + #if ENABLED(TFT_LVGL_UI_SPI) uint16_t i, width, height; uint16_t clr_temp; uint8_t tbuf[480 * 2]; @@ -525,7 +517,9 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ W25QXX.init(SPI_QUARTER_SPEED); - #else + + #else // !TFT_LVGL_UI_SPI + #if 1 uint16_t i, width, height; uint16_t clr_temp; @@ -543,7 +537,8 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ #endif - #endif // SPI_GRAPHICAL_TFT + + #endif // !TFT_LVGL_UI_SPI } #define TICK_CYCLE 1 @@ -554,7 +549,7 @@ unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { return TICK_CYCLE * (lastTick <= curTick ? (curTick - lastTick) : (0xFFFFFFFF - lastTick + curTick)); } -#if ENABLED(SPI_GRAPHICAL_TFT) +#if ENABLED(TFT_LVGL_UI_SPI) #ifndef USE_XPT2046 #define USE_XPT2046 1 @@ -564,12 +559,12 @@ unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { #endif #if USE_XPT2046 - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 201 - #define XPT2046_Y_MIN 164 - #define XPT2046_X_MAX 3919 - #define XPT2046_Y_MAX 3776 + #define XPT2046_HOR_RES 480 + #define XPT2046_VER_RES 320 + #define XPT2046_X_MIN 201 + #define XPT2046_Y_MIN 164 + #define XPT2046_X_MAX 3919 + #define XPT2046_Y_MAX 3776 #define XPT2046_AVG 4 #define XPT2046_INV 1 #endif @@ -579,34 +574,34 @@ unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { #ifndef USE_XPT2046 #define USE_XPT2046 1 #ifndef XPT2046_XY_SWAP - #define XPT2046_XY_SWAP 1 + #define XPT2046_XY_SWAP 1 #endif #ifndef XPT2046_X_INV - #define XPT2046_X_INV 0 + #define XPT2046_X_INV 0 #endif #ifndef XPT2046_Y_INV - #define XPT2046_Y_INV 1 + #define XPT2046_Y_INV 1 #endif #endif #if USE_XPT2046 #ifndef XPT2046_HOR_RES - #define XPT2046_HOR_RES 480 + #define XPT2046_HOR_RES 480 #endif #ifndef XPT2046_VER_RES - #define XPT2046_VER_RES 320 + #define XPT2046_VER_RES 320 #endif #ifndef XPT2046_X_MIN - #define XPT2046_X_MIN 201 + #define XPT2046_X_MIN 201 #endif #ifndef XPT2046_Y_MIN - #define XPT2046_Y_MIN 164 + #define XPT2046_Y_MIN 164 #endif #ifndef XPT2046_X_MAX - #define XPT2046_X_MAX 3919 + #define XPT2046_X_MAX 3919 #endif #ifndef XPT2046_Y_MAX - #define XPT2046_Y_MAX 3776 + #define XPT2046_Y_MAX 3776 #endif #ifndef XPT2046_AVG #define XPT2046_AVG 4 @@ -637,39 +632,25 @@ static void xpt2046_corr(uint16_t *x, uint16_t *y) { #endif } -#define times 4 +#define times 4 #define CHX 0x90 #define CHY 0xD0 int SPI2_ReadWrite2Bytes(void) { - volatile uint16_t ans = 0; - uint16_t temp = 0; - #if ENABLED(SPI_GRAPHICAL_TFT) - temp = SPI_TFT.spi_read_write_byte(0xFF); - ans = temp << 8; - temp = SPI_TFT.spi_read_write_byte(0xFF); - ans |= temp; - ans >>= 3; - #else - temp = W25QXX.spi_flash_read_write_byte(0xFF); - ans = temp << 8; - temp = W25QXX.spi_flash_read_write_byte(0xFF); - ans |= temp; - ans >>= 3; - #endif - return ans & 0x0FFF; + #define SPI_READ_WRITE_BYTE(B) TERN(TFT_LVGL_UI_SPI, SPI_TFT.spi_read_write_byte, W25QXX.spi_flash_read_write_byte)(B) + const uint16_t t1 = SPI_READ_WRITE_BYTE(0xFF), + t2 = SPI_READ_WRITE_BYTE(0xFF); + return (((t1 << 8) | t2) >> 3) & 0x0FFF; } uint16_t x_addata[times], y_addata[times]; void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { uint16_t i, j, k; - #if ENABLED(SPI_GRAPHICAL_TFT) - SPI_TFT.spi_init(SPI_QUARTER_SPEED); - #endif + TERN(TFT_LVGL_UI_SPI, SPI_TFT.spi_init, W25QXX.init)(SPI_SPEED_6); for (i = 0; i < times; i++) { - #if ENABLED(SPI_GRAPHICAL_TFT) + #if ENABLED(TFT_LVGL_UI_SPI) OUT_WRITE(TOUCH_CS_PIN, LOW); SPI_TFT.spi_read_write_byte(CHX); y_addata[i] = SPI2_ReadWrite2Bytes(); @@ -692,6 +673,7 @@ void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { #endif } + TERN(TFT_LVGL_UI_SPI,,W25QXX.init(SPI_QUARTER_SPEED)); for (i = 0; i < times; i++) for (j = i + 1; j < times; j++) @@ -726,8 +708,10 @@ void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { #define ADC_VALID_OFFSET 10 uint8_t TOUCH_PressValid(uint16_t _usX, uint16_t _usY) { - if ( (_usX <= ADC_VALID_OFFSET) || (_usY <= ADC_VALID_OFFSET) - || (_usX >= 4095 - ADC_VALID_OFFSET) || (_usY >= 4095 - ADC_VALID_OFFSET) + if ( (_usX <= ADC_VALID_OFFSET) + || (_usY <= ADC_VALID_OFFSET) + || (_usX >= 4095 - ADC_VALID_OFFSET) + || (_usY >= 4095 - ADC_VALID_OFFSET) ) return 0; return 1; } @@ -754,7 +738,7 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { data->state = LV_INDEV_STATE_PR; - /*Set the coordinates (if released use the last pressed coordinates)*/ + /* Set the coordinates (if released use the last pressed coordinates) */ // SERIAL_ECHOLNPAIR("antes X: ", last_x, ", y: ", last_y); xpt2046_corr((uint16_t *)&last_x, (uint16_t *)&last_y); @@ -774,4 +758,4 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { return false; /*Return `false` because we are not buffering and no more data to read*/ } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index 81ff4b1b037d..1b33d6e6bfb3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -30,7 +30,7 @@ //extern "C" { //#endif -#include "lvgl.h" +#include void tft_lvgl_init(); void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index cdee6880e210..1ea47cef2dd4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -21,53 +21,689 @@ */ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #include "../../../../MarlinCore.h" #include "draw_ui.h" #include "tft_multi_language.h" -//********************************************// - -//*********************************************// - -common_menu_def common_menu; -main_menu_def main_menu; -preheat_menu_def preheat_menu; -move_menu_def move_menu; -home_menu_def home_menu; -file_menu_def file_menu; -extrude_menu_def extrude_menu; -leveling_menu_def leveling_menu; -set_menu_def set_menu; -more_menu_def more_menu; -wifi_menu_def wifi_menu; -cloud_menu_def cloud_menu; -about_menu_def about_menu; -fan_menu_def fan_menu; -filament_menu_def filament_menu; -printing_menu_def printing_menu; -operation_menu_def operation_menu; -pause_menu_def pause_menu; -speed_menu_def speed_menu; -printing_more_menu_def printing_more_menu; -dialog_menu_def dialog_menu; -language_menu_def language_menu; -print_file_dialog_menu_def print_file_dialog_menu; -filesys_menu_def filesys_menu; -zoffset_menu_def zoffset_menu; -tool_menu_def tool_menu; -MachinePara_menu_def MachinePara_menu; -MachineSettings_menu_def MachineSettings_menu; +// ********************************************* // + +common_menu_def common_menu; +main_menu_def main_menu; +preheat_menu_def preheat_menu; +move_menu_def move_menu; +home_menu_def home_menu; +file_menu_def file_menu; +extrude_menu_def extrude_menu; +leveling_menu_def leveling_menu; +set_menu_def set_menu; +more_menu_def more_menu; +wifi_menu_def wifi_menu; +cloud_menu_def cloud_menu; +about_menu_def about_menu; +fan_menu_def fan_menu; +filament_menu_def filament_menu; +printing_menu_def printing_menu; +operation_menu_def operation_menu; +pause_menu_def pause_menu; +speed_menu_def speed_menu; +printing_more_menu_def printing_more_menu; +dialog_menu_def dialog_menu; +language_menu_def language_menu; +print_file_dialog_menu_def print_file_dialog_menu; +filesys_menu_def filesys_menu; +zoffset_menu_def zoffset_menu; +tool_menu_def tool_menu; +MachinePara_menu_def MachinePara_menu; +MachineSettings_menu_def MachineSettings_menu; TemperatureSettings_menu_def TemperatureSettings_menu; -pause_msg_def pause_msg_menu; +pause_msg_def pause_msg_menu; +eeprom_def eeprom_menu; + +machine_common_def machine_menu; +void machine_setting_disp() { + if (gCfgItems.language == LANG_SIMPLE_CHINESE) { + MachinePara_menu.title = MACHINE_PARA_TITLE_CN; + MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_CN; + MachinePara_menu.TemperatureSetting = TEMPERATURE_CONFIG_CN; + MachinePara_menu.MotorSetting = MOTOR_CONFIG_CN; + MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_CN; + + machine_menu.default_value = DEFAULT_CN; + machine_menu.next = NEXT_CN; + machine_menu.previous = PREVIOUS_CN; + + machine_menu.MachineConfigTitle = MACHINE_CONFIG_TITLE_CN; + machine_menu.MachineType = MACHINE_TYPE_CN; + machine_menu.Stroke = MACHINE_STROKE_CN; + machine_menu.HomeDir = MACHINE_HOMEDIR_CN; + machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_CN; + machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_CN; + machine_menu.LevelingConf = MACHINE_LEVELING_CONFIG_CN; + + machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_CN; + machine_menu.xyz = MACHINE_TYPE_XYZ_CN; + machine_menu.delta = MACHINE_TYPE_DELTA_CN; + machine_menu.corexy = MACHINE_TYPE_COREXY_CN; + + machine_menu.StrokeConfTitle = MACHINE_STROKE_CONF_TITLE_CN; + machine_menu.xStroke = X_MAX_LENGTH_CN; + machine_menu.yStroke = Y_MAX_LENGTH_CN; + machine_menu.zStroke = Z_MAX_LENGTH_CN; + + machine_menu.xmin = X_MIN_LENGTH_CN; + machine_menu.ymin = Y_MIN_LENGTH_CN; + machine_menu.zmin = Z_MIN_LENGTH_CN; + + machine_menu.HomeDirConfTitle = HOME_DIR_CONF_TITLE_CN; + machine_menu.xHomeDir = HOME_DIR_X_CN; + machine_menu.yHomeDir = HOME_DIR_Y_CN; + machine_menu.zHomeDir = HOME_DIR_Z_CN; + machine_menu.min = HOME_MIN_CN; + machine_menu.max = HOME_MAX_CN; + + machine_menu.EndstopConfTitle = ENDSTOP_CONF_TITLE_CN; + machine_menu.xEndstop_min = MIN_ENDSTOP_X_CN; + machine_menu.yEndstop_min = MIN_ENDSTOP_Y_CN; + machine_menu.zEndstop_min = MIN_ENDSTOP_Z_CN; + machine_menu.xEndstop_max = MAX_ENDSTOP_X_CN; + machine_menu.yEndstop_max = MAX_ENDSTOP_Y_CN; + machine_menu.zEndstop_max = MAX_ENDSTOP_Z_CN; + machine_menu.FilamentEndstop = ENDSTOP_FIL_CN; + machine_menu.LevelingEndstop = ENDSTOP_LEVEL_CN; + machine_menu.opened = ENDSTOP_OPENED_CN; + machine_menu.closed = ENDSTOP_CLOSED_CN; + + machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_CN; + machine_menu.InTemperature = FILAMENT_IN_TEMPERATURE_CN; + machine_menu.InLength = FILAMENT_IN_LENGTH_CN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_CN; + machine_menu.OutTemperature = FILAMENT_OUT_TEMPERATURE_CN; + machine_menu.OutLength = FILAMENT_OUT_LENGTH_CN; + machine_menu.OutSpeed = FILAMENT_OUT_SPEED_CN; + + machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_CN; + machine_menu.LevelingParaConf = LEVELING_PARA_CONF_CN; + machine_menu.DeltaLevelConf = LEVELING_DELTA_CN; + machine_menu.XYZLevelconf = LEVELING_XYZ_CN; + + machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_CN; + machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_CN; + machine_menu.BLtouchEnable = BLTOUCH_LEVELING_ENABLE_CN; + machine_menu.ProbePort = PROBE_PORT_CN; + machine_menu.ProbeXoffset = PROBE_X_OFFSET_CN; + machine_menu.ProbeYoffset = PROBE_Y_OFFSET_CN; + machine_menu.ProbeZoffset = PROBE_Z_OFFSET_CN; + machine_menu.ProbeXYspeed = PROBE_XY_SPEED_CN; + machine_menu.ProbeZspeed = PROBE_Z_SPEED_CN; + machine_menu.enable = ENABLE_CN; + machine_menu.disable = DISABLE_CN; + machine_menu.z_min = Z_MIN_CN; + machine_menu.z_max = Z_MAX_CN; + + machine_menu.LevelingSubDeltaConfTitle = DELTA_LEVEL_CONF_TITLE_CN; + machine_menu.MachineRadius = DELTA_MACHINE_RADIUS_CN; + machine_menu.DiagonalRod = DELTA_DIAGONAL_ROD_CN; + machine_menu.PrintableRadius = DELTA_PRINT_RADIUS_CN; + machine_menu.DeltaHeight = DELTA_HEIGHT_CN; + machine_menu.SmoothRodOffset = SMOOTH_ROD_OFFSET_CN; + machine_menu.EffectorOffset = EFFECTOR_OFFSET_CN; + machine_menu.CalibrationRadius = CALIBRATION_RADIUS_CN; + + machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_CN; + // machine_menu.ProbeMaxLeft=PROBE_REACH_MAX_LEFT_CN; + // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_CN; + // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_CN; + // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_CN; + + machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_CN; + machine_menu.NozzleConf = NOZZLE_CONF_CN; + machine_menu.HotBedConf = HOTBED_CONF_CN; + machine_menu.PreheatTemperConf = PREHEAT_TEMPER_CN; + + machine_menu.NozzleConfTitle = NOZZLE_CONF_TITLE_CN; + machine_menu.NozzleCnt = NOZZLECNT_CN; + machine_menu.NozzleType = NOZZLE_TYPE_CN; + machine_menu.NozzleAdjustType = NOZZLE_ADJUST_TYPE_CN; + machine_menu.NozzleMinTemperature = NOZZLE_MIN_TEMPERATURE_CN; + machine_menu.NozzleMaxTemperature = NOZZLE_MAX_TEMPERATURE_CN; + machine_menu.Extrude_Min_Temper = EXTRUD_MIN_TEMPER_CN; + + // machine_menu.HotbedEnable=HOTBED_ENABLE_CN; + machine_menu.HotbedConfTitle = HOTBED_CONF_TITLE_CN; + machine_menu.HotbedAjustType = HOTBED_ADJUST_CN; + machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_CN; + machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_CN; + + machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_CN; + machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_CN; + machine_menu.AccelerationConf = ACCELERATION_CONF_CN; + machine_menu.JerkConf = JERKCONF_CN; + machine_menu.StepsConf = STEPSCONF_CN; + machine_menu.TMCcurrentConf = TMC_CURRENT_CN; + machine_menu.TMCStepModeConf = TMC_STEP_MODE_CN; + machine_menu.MotorDirConf = MOTORDIRCONF_CN; + machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_CN; + machine_menu.PausePosition = PAUSE_POSITION_CN; + + machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_CN; + machine_menu.XMaxFeedRate = X_MAXFEEDRATE_CN; + machine_menu.YMaxFeedRate = Y_MAXFEEDRATE_CN; + machine_menu.ZMaxFeedRate = Z_MAXFEEDRATE_CN; + machine_menu.E0MaxFeedRate = E0_MAXFEEDRATE_CN; + machine_menu.E1MaxFeedRate = E1_MAXFEEDRATE_CN; + + machine_menu.AccelerationConfTitle = ACCELERATION_CONF_TITLE_CN; + machine_menu.PrintAcceleration = PRINT_ACCELERATION_CN; + machine_menu.RetractAcceleration = RETRACT_ACCELERATION_CN; + machine_menu.TravelAcceleration = TRAVEL_ACCELERATION_CN; + machine_menu.X_Acceleration = X_ACCELERATION_CN; + machine_menu.Y_Acceleration = Y_ACCELERATION_CN; + machine_menu.Z_Acceleration = Z_ACCELERATION_CN; + machine_menu.E0_Acceleration = E0_ACCELERATION_CN; + machine_menu.E1_Acceleration = E1_ACCELERATION_CN; + + machine_menu.JerkConfTitle = JERK_CONF_TITLE_CN; + machine_menu.X_Jerk = X_JERK_CN; + machine_menu.Y_Jerk = Y_JERK_CN; + machine_menu.Z_Jerk = Z_JERK_CN; + machine_menu.E_Jerk = E_JERK_CN; + + machine_menu.StepsConfTitle = STEPS_CONF_TITLE_CN; + machine_menu.X_Steps = X_STEPS_CN; + machine_menu.Y_Steps = Y_STEPS_CN; + machine_menu.Z_Steps = Z_STEPS_CN; + machine_menu.E0_Steps = E0_STEPS_CN; + machine_menu.E1_Steps = E1_STEPS_CN; + + machine_menu.TmcCurrentConfTitle = TMC_CURRENT_CONF_TITLE_CN; + machine_menu.X_Current = X_TMC_CURRENT_CN; + machine_menu.Y_Current = Y_TMC_CURRENT_CN; + machine_menu.Z_Current = Z_TMC_CURRENT_CN; + machine_menu.E0_Current = E0_TMC_CURRENT_CN; + machine_menu.E1_Current = E1_TMC_CURRENT_CN; + + machine_menu.TmcStepModeConfTitle = TMC_MODE_CONF_TITLE_CN; + machine_menu.X_StepMode = X_TMC_MODE_CN; + machine_menu.Y_StepMode = Y_TMC_MODE_CN; + machine_menu.Z_StepMode = Z_TMC_MODE_CN; + machine_menu.E0_StepMode = E0_TMC_MODE_CN; + machine_menu.E1_StepMode = E1_TMC_MODE_CN; + + machine_menu.MotorDirConfTitle = MOTORDIR_CONF_TITLE_CN; + machine_menu.X_MotorDir = X_MOTORDIR_CN; + machine_menu.Y_MotorDir = Y_MOTORDIR_CN; + machine_menu.Z_MotorDir = Z_MOTORDIR_CN; + machine_menu.E0_MotorDir = E0_MOTORDIR_CN; + machine_menu.E1_MotorDir = E1_MOTORDIR_CN; + machine_menu.Invert_0 = INVERT_P_CN; + machine_menu.Invert_1 = INVERT_N_CN; + + machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_CN; + machine_menu.XY_HomeFeedRate = X_HOMESPEED_CN; + // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_CN; + machine_menu.Z_HomeFeedRate = Z_HOMESPEED_CN; + + machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_CN; + machine_menu.PwrOffDection = PWROFF_DECTION_CN; + machine_menu.PwrOffAfterPrint = PWROFF_AFTER_PRINT_CN; + machine_menu.HaveUps = HAVE_UPS_CN; + machine_menu.Z2andZ2Endstop = Z2_AND_Z2ENDSTOP_CONF_CN; + machine_menu.EnablePinsInvert = ENABLE_PINS_CONF_CN; + + machine_menu.Z2ConfTitle = Z2_AND_Z2ENDSTOP_CONF_TITLE_CN; + machine_menu.Z2Enable = Z2_ENABLE_CN; + machine_menu.Z2EndstopEnable = Z2_ENDSTOP_CN; + machine_menu.Z2Port = Z2_PORT_CN; + + machine_menu.EnablePinsInvertTitle = ENABLE_PINS_CONF_TITLE_CN; + machine_menu.XInvert = X_ENABLE_PINS_INVERT_CN; + machine_menu.YInvert = Y_ENABLE_PINS_INVERT_CN; + machine_menu.ZInvert = Z_ENABLE_PINS_INVERT_CN; + machine_menu.EInvert = E_ENABLE_PINS_INVERT_CN; + + machine_menu.key_back = KEY_BACK_CN; + machine_menu.key_reset = KEY_REST_CN; + machine_menu.key_confirm = KEY_CONFIRM_CN; + + machine_menu.PausePosText = PAUSE_POSITION_CN; + machine_menu.xPos = PAUSE_POSITION_X_CN; + machine_menu.yPos = PAUSE_POSITION_Y_CN; + machine_menu.zPos = PAUSE_POSITION_Z_CN; + } + else if (gCfgItems.language == LANG_COMPLEX_CHINESE) { + MachinePara_menu.title = MACHINE_PARA_TITLE_T_CN; + MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_T_CN; + MachinePara_menu.TemperatureSetting = TEMPERATURE_CONFIG_T_CN; + MachinePara_menu.MotorSetting = MOTOR_CONFIG_T_CN; + MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_T_CN; + + machine_menu.default_value = DEFAULT_T_CN; + machine_menu.next = NEXT_T_CN; + machine_menu.previous = PREVIOUS_T_CN; + + machine_menu.MachineConfigTitle = MACHINE_CONFIG_TITLE_T_CN; + machine_menu.MachineType = MACHINE_TYPE_T_CN; + machine_menu.Stroke = MACHINE_STROKE_T_CN; + machine_menu.HomeDir = MACHINE_HOMEDIR_T_CN; + machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_T_CN; + machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_T_CN; + machine_menu.LevelingConf = MACHINE_LEVELING_CONFIG_T_CN; + + machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_T_CN; + machine_menu.xyz = MACHINE_TYPE_XYZ_T_CN; + machine_menu.delta = MACHINE_TYPE_DELTA_T_CN; + machine_menu.corexy = MACHINE_TYPE_COREXY_T_CN; + + machine_menu.StrokeConfTitle = MACHINE_STROKE_CONF_TITLE_T_CN; + machine_menu.xStroke = X_MAX_LENGTH_T_CN; + machine_menu.yStroke = Y_MAX_LENGTH_T_CN; + machine_menu.zStroke = Z_MAX_LENGTH_T_CN; + + machine_menu.xmin = X_MIN_LENGTH_T_CN; + machine_menu.ymin = Y_MIN_LENGTH_T_CN; + machine_menu.zmin = Z_MIN_LENGTH_T_CN; + + machine_menu.HomeDirConfTitle = HOME_DIR_CONF_TITLE_T_CN; + machine_menu.xHomeDir = HOME_DIR_X_T_CN; + machine_menu.yHomeDir = HOME_DIR_Y_T_CN; + machine_menu.zHomeDir = HOME_DIR_Z_T_CN; + machine_menu.min = HOME_MIN_T_CN; + machine_menu.max = HOME_MAX_T_CN; + + machine_menu.EndstopConfTitle = ENDSTOP_CONF_TITLE_T_CN; + machine_menu.xEndstop_min = MIN_ENDSTOP_X_T_CN; + machine_menu.yEndstop_min = MIN_ENDSTOP_Y_T_CN; + machine_menu.zEndstop_min = MIN_ENDSTOP_Z_T_CN; + machine_menu.xEndstop_max = MAX_ENDSTOP_X_T_CN; + machine_menu.yEndstop_max = MAX_ENDSTOP_Y_T_CN; + machine_menu.zEndstop_max = MAX_ENDSTOP_Z_T_CN; + machine_menu.FilamentEndstop = ENDSTOP_FIL_T_CN; + machine_menu.LevelingEndstop = ENDSTOP_LEVEL_T_CN; + machine_menu.opened = ENDSTOP_OPENED_T_CN; + machine_menu.closed = ENDSTOP_CLOSED_T_CN; + + machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_T_CN; + machine_menu.InTemperature = FILAMENT_IN_TEMPERATURE_T_CN; + machine_menu.InLength = FILAMENT_IN_LENGTH_T_CN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_T_CN; + machine_menu.OutTemperature = FILAMENT_OUT_TEMPERATURE_T_CN; + machine_menu.OutLength = FILAMENT_OUT_LENGTH_T_CN; + machine_menu.OutSpeed = FILAMENT_OUT_SPEED_T_CN; + + machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_T_CN; + machine_menu.LevelingParaConf = LEVELING_PARA_CONF_T_CN; + machine_menu.DeltaLevelConf = LEVELING_DELTA_T_CN; + machine_menu.XYZLevelconf = LEVELING_XYZ_T_CN; + + machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_T_CN; + machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_T_CN; + machine_menu.BLtouchEnable = BLTOUCH_LEVELING_ENABLE_T_CN; + machine_menu.ProbePort = PROBE_PORT_T_CN; + machine_menu.ProbeXoffset = PROBE_X_OFFSET_T_CN; + machine_menu.ProbeYoffset = PROBE_Y_OFFSET_T_CN; + machine_menu.ProbeZoffset = PROBE_Z_OFFSET_T_CN; + machine_menu.ProbeXYspeed = PROBE_XY_SPEED_T_CN; + machine_menu.ProbeZspeed = PROBE_Z_SPEED_T_CN; + machine_menu.enable = ENABLE_T_CN; + machine_menu.disable = DISABLE_T_CN; + machine_menu.z_min = Z_MIN_T_CN; + machine_menu.z_max = Z_MAX_T_CN; + + machine_menu.LevelingSubDeltaConfTitle = DELTA_LEVEL_CONF_TITLE_T_CN; + machine_menu.MachineRadius = DELTA_MACHINE_RADIUS_T_CN; + machine_menu.DiagonalRod = DELTA_DIAGONAL_ROD_T_CN; + machine_menu.PrintableRadius = DELTA_PRINT_RADIUS_T_CN; + machine_menu.DeltaHeight = DELTA_HEIGHT_T_CN; + machine_menu.SmoothRodOffset = SMOOTH_ROD_OFFSET_T_CN; + machine_menu.EffectorOffset = EFFECTOR_OFFSET_T_CN; + machine_menu.CalibrationRadius = CALIBRATION_RADIUS_T_CN; + + machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_T_CN; + // machine_menu.ProbeMaxLeft=PROBE_REACH_MAX_LEFT_T_CN; + // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_T_CN; + // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_T_CN; + // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_T_CN; + + machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_T_CN; + machine_menu.NozzleConf = NOZZLE_CONF_T_CN; + machine_menu.HotBedConf = HOTBED_CONF_T_CN; + machine_menu.PreheatTemperConf = PREHEAT_TEMPER_T_CN; + + machine_menu.NozzleConfTitle = NOZZLE_CONF_TITLE_T_CN; + machine_menu.NozzleCnt = NOZZLECNT_T_CN; + machine_menu.NozzleType = NOZZLE_TYPE_T_CN; + machine_menu.NozzleAdjustType = NOZZLE_ADJUST_TYPE_T_CN; + machine_menu.NozzleMinTemperature = NOZZLE_MIN_TEMPERATURE_T_CN; + machine_menu.NozzleMaxTemperature = NOZZLE_MAX_TEMPERATURE_T_CN; + machine_menu.Extrude_Min_Temper = EXTRUD_MIN_TEMPER_T_CN; + + // machine_menu.HotbedEnable=HOTBED_ENABLE_T_CN; + machine_menu.HotbedConfTitle = HOTBED_CONF_TITLE_T_CN; + machine_menu.HotbedAjustType = HOTBED_ADJUST_T_CN; + machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_T_CN; + machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_T_CN; + + machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_T_CN; + machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_T_CN; + machine_menu.AccelerationConf = ACCELERATION_CONF_T_CN; + machine_menu.JerkConf = JERKCONF_T_CN; + machine_menu.StepsConf = STEPSCONF_T_CN; + machine_menu.TMCcurrentConf = TMC_CURRENT_T_CN; + machine_menu.TMCStepModeConf = TMC_STEP_MODE_T_CN; + machine_menu.MotorDirConf = MOTORDIRCONF_T_CN; + machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_T_CN; + machine_menu.PausePosition = PAUSE_POSITION_T_CN; + + machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_T_CN; + machine_menu.XMaxFeedRate = X_MAXFEEDRATE_T_CN; + machine_menu.YMaxFeedRate = Y_MAXFEEDRATE_T_CN; + machine_menu.ZMaxFeedRate = Z_MAXFEEDRATE_T_CN; + machine_menu.E0MaxFeedRate = E0_MAXFEEDRATE_T_CN; + machine_menu.E1MaxFeedRate = E1_MAXFEEDRATE_T_CN; + + machine_menu.AccelerationConfTitle = ACCELERATION_CONF_TITLE_T_CN; + machine_menu.PrintAcceleration = PRINT_ACCELERATION_T_CN; + machine_menu.RetractAcceleration = RETRACT_ACCELERATION_T_CN; + machine_menu.TravelAcceleration = TRAVEL_ACCELERATION_T_CN; + machine_menu.X_Acceleration = X_ACCELERATION_T_CN; + machine_menu.Y_Acceleration = Y_ACCELERATION_T_CN; + machine_menu.Z_Acceleration = Z_ACCELERATION_T_CN; + machine_menu.E0_Acceleration = E0_ACCELERATION_T_CN; + machine_menu.E1_Acceleration = E1_ACCELERATION_T_CN; + + machine_menu.JerkConfTitle = JERK_CONF_TITLE_T_CN; + machine_menu.X_Jerk = X_JERK_T_CN; + machine_menu.Y_Jerk = Y_JERK_T_CN; + machine_menu.Z_Jerk = Z_JERK_T_CN; + machine_menu.E_Jerk = E_JERK_T_CN; + + machine_menu.StepsConfTitle = STEPS_CONF_TITLE_T_CN; + machine_menu.X_Steps = X_STEPS_T_CN; + machine_menu.Y_Steps = Y_STEPS_T_CN; + machine_menu.Z_Steps = Z_STEPS_T_CN; + machine_menu.E0_Steps = E0_STEPS_T_CN; + machine_menu.E1_Steps = E1_STEPS_T_CN; + + machine_menu.TmcCurrentConfTitle = TMC_CURRENT_CONF_TITLE_T_CN; + machine_menu.X_Current = X_TMC_CURRENT_T_CN; + machine_menu.Y_Current = Y_TMC_CURRENT_T_CN; + machine_menu.Z_Current = Z_TMC_CURRENT_T_CN; + machine_menu.E0_Current = E0_TMC_CURRENT_T_CN; + machine_menu.E1_Current = E1_TMC_CURRENT_T_CN; + + machine_menu.TmcStepModeConfTitle = TMC_MODE_CONF_TITLE_T_CN; + machine_menu.X_StepMode = X_TMC_MODE_T_CN; + machine_menu.Y_StepMode = Y_TMC_MODE_T_CN; + machine_menu.Z_StepMode = Z_TMC_MODE_T_CN; + machine_menu.E0_StepMode = E0_TMC_MODE_T_CN; + machine_menu.E1_StepMode = E1_TMC_MODE_T_CN; + + machine_menu.MotorDirConfTitle = MOTORDIR_CONF_TITLE_T_CN; + machine_menu.X_MotorDir = X_MOTORDIR_T_CN; + machine_menu.Y_MotorDir = Y_MOTORDIR_T_CN; + machine_menu.Z_MotorDir = Z_MOTORDIR_T_CN; + machine_menu.E0_MotorDir = E0_MOTORDIR_T_CN; + machine_menu.E1_MotorDir = E1_MOTORDIR_T_CN; + machine_menu.Invert_0 = INVERT_P_T_CN; + machine_menu.Invert_1 = INVERT_N_T_CN; + + machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_T_CN; + machine_menu.XY_HomeFeedRate = X_HOMESPEED_T_CN; + // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_T_CN; + machine_menu.Z_HomeFeedRate = Z_HOMESPEED_T_CN; + + machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_T_CN; + machine_menu.PwrOffDection = PWROFF_DECTION_T_CN; + machine_menu.PwrOffAfterPrint = PWROFF_AFTER_PRINT_T_CN; + machine_menu.HaveUps = HAVE_UPS_T_CN; + machine_menu.Z2andZ2Endstop = Z2_AND_Z2ENDSTOP_CONF_T_CN; + machine_menu.EnablePinsInvert = ENABLE_PINS_CONF_T_CN; + + machine_menu.Z2ConfTitle = Z2_AND_Z2ENDSTOP_CONF_TITLE_T_CN; + machine_menu.Z2Enable = Z2_ENABLE_T_CN; + machine_menu.Z2EndstopEnable = Z2_ENDSTOP_T_CN; + machine_menu.Z2Port = Z2_PORT_T_CN; + + machine_menu.EnablePinsInvertTitle = ENABLE_PINS_CONF_TITLE_T_CN; + machine_menu.XInvert = X_ENABLE_PINS_INVERT_T_CN; + machine_menu.YInvert = Y_ENABLE_PINS_INVERT_T_CN; + machine_menu.ZInvert = Z_ENABLE_PINS_INVERT_T_CN; + machine_menu.EInvert = E_ENABLE_PINS_INVERT_T_CN; + + machine_menu.key_back = KEY_BACK_T_CN; + machine_menu.key_reset = KEY_REST_T_CN; + machine_menu.key_confirm = KEY_CONFIRM_T_CN; + // machine_menu.high_level = MOTOR_EN_HIGH_LEVEL_T_CN; + // machine_menu.low_level = MOTOR_EN_LOW_LEVEL_T_CN; + + machine_menu.PausePosText = PAUSE_POSITION_T_CN; + machine_menu.xPos = PAUSE_POSITION_X_T_CN; + machine_menu.yPos = PAUSE_POSITION_Y_T_CN; + machine_menu.zPos = PAUSE_POSITION_Z_T_CN; + + } + else { + MachinePara_menu.title = MACHINE_PARA_TITLE_EN; + MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_EN; + MachinePara_menu.TemperatureSetting = TEMPERATURE_CONFIG_EN; + MachinePara_menu.MotorSetting = MOTOR_CONFIG_EN; + MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_EN; + + machine_menu.default_value = DEFAULT_EN; + machine_menu.next = NEXT_EN; + machine_menu.previous = PREVIOUS_EN; + + machine_menu.MachineConfigTitle = MACHINE_CONFIG_TITLE_EN; + machine_menu.MachineType = MACHINE_TYPE_EN; + machine_menu.Stroke = MACHINE_STROKE_EN; + machine_menu.HomeDir = MACHINE_HOMEDIR_EN; + machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_EN; + machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_EN; + machine_menu.LevelingConf = MACHINE_LEVELING_CONFIG_EN; + + machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_EN; + machine_menu.xyz = MACHINE_TYPE_XYZ_EN; + machine_menu.delta = MACHINE_TYPE_DELTA_EN; + machine_menu.corexy = MACHINE_TYPE_COREXY_EN; + + machine_menu.StrokeConfTitle = MACHINE_STROKE_CONF_TITLE_EN; + machine_menu.xStroke = X_MAX_LENGTH_EN; + machine_menu.yStroke = Y_MAX_LENGTH_EN; + machine_menu.zStroke = Z_MAX_LENGTH_EN; + + machine_menu.xmin = X_MIN_LENGTH_EN; + machine_menu.ymin = Y_MIN_LENGTH_EN; + machine_menu.zmin = Z_MIN_LENGTH_EN; + + machine_menu.HomeDirConfTitle = HOME_DIR_CONF_TITLE_EN; + machine_menu.xHomeDir = HOME_DIR_X_EN; + machine_menu.yHomeDir = HOME_DIR_Y_EN; + machine_menu.zHomeDir = HOME_DIR_Z_EN; + machine_menu.min = HOME_MIN_EN; + machine_menu.max = HOME_MAX_EN; + + machine_menu.EndstopConfTitle = ENDSTOP_CONF_TITLE_EN; + machine_menu.xEndstop_min = MIN_ENDSTOP_X_EN; + machine_menu.yEndstop_min = MIN_ENDSTOP_Y_EN; + machine_menu.zEndstop_min = MIN_ENDSTOP_Z_EN; + machine_menu.xEndstop_max = MAX_ENDSTOP_X_EN; + machine_menu.yEndstop_max = MAX_ENDSTOP_Y_EN; + machine_menu.zEndstop_max = MAX_ENDSTOP_Z_EN; + machine_menu.FilamentEndstop = ENDSTOP_FIL_EN; + machine_menu.LevelingEndstop = ENDSTOP_LEVEL_EN; + machine_menu.opened = ENDSTOP_OPENED_EN; + machine_menu.closed = ENDSTOP_CLOSED_EN; + + machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_EN; + machine_menu.InTemperature = FILAMENT_IN_TEMPERATURE_EN; + machine_menu.InLength = FILAMENT_IN_LENGTH_EN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_EN; + machine_menu.OutTemperature = FILAMENT_OUT_TEMPERATURE_EN; + machine_menu.OutLength = FILAMENT_OUT_LENGTH_EN; + machine_menu.OutSpeed = FILAMENT_OUT_SPEED_EN; + + machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_EN; + machine_menu.LevelingParaConf = LEVELING_PARA_CONF_EN; + machine_menu.DeltaLevelConf = LEVELING_DELTA_EN; + machine_menu.XYZLevelconf = LEVELING_XYZ_EN; + + machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_EN; + machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_EN; + machine_menu.BLtouchEnable = BLTOUCH_LEVELING_ENABLE_EN; + machine_menu.ProbePort = PROBE_PORT_EN; + machine_menu.ProbeXoffset = PROBE_X_OFFSET_EN; + machine_menu.ProbeYoffset = PROBE_Y_OFFSET_EN; + machine_menu.ProbeZoffset = PROBE_Z_OFFSET_EN; + machine_menu.ProbeXYspeed = PROBE_XY_SPEED_EN; + machine_menu.ProbeZspeed = PROBE_Z_SPEED_EN; + machine_menu.enable = ENABLE_EN; + machine_menu.disable = DISABLE_EN; + machine_menu.z_min = Z_MIN_EN; + machine_menu.z_max = Z_MAX_EN; + + machine_menu.LevelingSubDeltaConfTitle = DELTA_LEVEL_CONF_TITLE_EN; + machine_menu.MachineRadius = DELTA_MACHINE_RADIUS_EN; + machine_menu.DiagonalRod = DELTA_DIAGONAL_ROD_EN; + machine_menu.PrintableRadius = DELTA_PRINT_RADIUS_EN; + machine_menu.DeltaHeight = DELTA_HEIGHT_EN; + machine_menu.SmoothRodOffset = SMOOTH_ROD_OFFSET_EN; + machine_menu.EffectorOffset = EFFECTOR_OFFSET_EN; + machine_menu.CalibrationRadius = CALIBRATION_RADIUS_EN; + + machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_EN; + // machine_menu.Level_positon=PROBE_REACH_MAX_LEFT_EN; + // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_EN; + // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_EN; + // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_EN; + + machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_EN; + machine_menu.NozzleConf = NOZZLE_CONF_EN; + machine_menu.HotBedConf = HOTBED_CONF_EN; + machine_menu.PreheatTemperConf = PREHEAT_TEMPER_EN; + + machine_menu.NozzleConfTitle = NOZZLE_CONF_TITLE_EN; + machine_menu.NozzleCnt = NOZZLECNT_EN; + machine_menu.NozzleType = NOZZLE_TYPE_EN; + machine_menu.NozzleAdjustType = NOZZLE_ADJUST_TYPE_EN; + machine_menu.NozzleMinTemperature = NOZZLE_MIN_TEMPERATURE_EN; + machine_menu.NozzleMaxTemperature = NOZZLE_MAX_TEMPERATURE_EN; + machine_menu.Extrude_Min_Temper = EXTRUD_MIN_TEMPER_EN; + + machine_menu.HotbedEnable = HOTBED_ENABLE_EN; + machine_menu.HotbedConfTitle = HOTBED_CONF_TITLE_EN; + machine_menu.HotbedAjustType = HOTBED_ADJUST_EN; + machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_EN; + machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_EN; + + machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_EN; + machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_EN; + machine_menu.AccelerationConf = ACCELERATION_CONF_EN; + machine_menu.JerkConf = JERKCONF_EN; + machine_menu.StepsConf = STEPSCONF_EN; + machine_menu.TMCcurrentConf = TMC_CURRENT_EN; + machine_menu.TMCStepModeConf = TMC_STEP_MODE_EN; + machine_menu.MotorDirConf = MOTORDIRCONF_EN; + machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_EN; + machine_menu.PausePosition = PAUSE_POSITION_EN; + + machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_EN; + machine_menu.XMaxFeedRate = X_MAXFEEDRATE_EN; + machine_menu.YMaxFeedRate = Y_MAXFEEDRATE_EN; + machine_menu.ZMaxFeedRate = Z_MAXFEEDRATE_EN; + machine_menu.E0MaxFeedRate = E0_MAXFEEDRATE_EN; + machine_menu.E1MaxFeedRate = E1_MAXFEEDRATE_EN; + + machine_menu.AccelerationConfTitle = ACCELERATION_CONF_TITLE_EN; + machine_menu.PrintAcceleration = PRINT_ACCELERATION_EN; + machine_menu.RetractAcceleration = RETRACT_ACCELERATION_EN; + machine_menu.TravelAcceleration = TRAVEL_ACCELERATION_EN; + machine_menu.X_Acceleration = X_ACCELERATION_EN; + machine_menu.Y_Acceleration = Y_ACCELERATION_EN; + machine_menu.Z_Acceleration = Z_ACCELERATION_EN; + machine_menu.E0_Acceleration = E0_ACCELERATION_EN; + machine_menu.E1_Acceleration = E1_ACCELERATION_EN; + + machine_menu.JerkConfTitle = JERK_CONF_TITLE_EN; + machine_menu.X_Jerk = X_JERK_EN; + machine_menu.Y_Jerk = Y_JERK_EN; + machine_menu.Z_Jerk = Z_JERK_EN; + machine_menu.E_Jerk = E_JERK_EN; + + machine_menu.StepsConfTitle = STEPS_CONF_TITLE_EN; + machine_menu.X_Steps = X_STEPS_EN; + machine_menu.Y_Steps = Y_STEPS_EN; + machine_menu.Z_Steps = Z_STEPS_EN; + machine_menu.E0_Steps = E0_STEPS_EN; + machine_menu.E1_Steps = E1_STEPS_EN; + + machine_menu.TmcCurrentConfTitle = TMC_CURRENT_CONF_TITLE_EN; + machine_menu.X_Current = X_TMC_CURRENT_EN; + machine_menu.Y_Current = Y_TMC_CURRENT_EN; + machine_menu.Z_Current = Z_TMC_CURRENT_EN; + machine_menu.E0_Current = E0_TMC_CURRENT_EN; + machine_menu.E1_Current = E1_TMC_CURRENT_EN; + + machine_menu.TmcStepModeConfTitle = TMC_MODE_CONF_TITLE_EN; + machine_menu.X_StepMode = X_TMC_MODE_EN; + machine_menu.Y_StepMode = Y_TMC_MODE_EN; + machine_menu.Z_StepMode = Z_TMC_MODE_EN; + machine_menu.E0_StepMode = E0_TMC_MODE_EN; + machine_menu.E1_StepMode = E1_TMC_MODE_EN; + + machine_menu.MotorDirConfTitle = MOTORDIR_CONF_TITLE_EN; + machine_menu.X_MotorDir = X_MOTORDIR_EN; + machine_menu.Y_MotorDir = Y_MOTORDIR_EN; + machine_menu.Z_MotorDir = Z_MOTORDIR_EN; + machine_menu.E0_MotorDir = E0_MOTORDIR_EN; + machine_menu.E1_MotorDir = E1_MOTORDIR_EN; + machine_menu.Invert_0 = INVERT_P_EN; + machine_menu.Invert_1 = INVERT_N_EN; + + machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_EN; + machine_menu.XY_HomeFeedRate = X_HOMESPEED_EN; + // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_EN; + machine_menu.Z_HomeFeedRate = Z_HOMESPEED_EN; + + machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_EN; + machine_menu.PwrOffDection = PWROFF_DECTION_EN; + machine_menu.PwrOffAfterPrint = PWROFF_AFTER_PRINT_EN; + machine_menu.HaveUps = HAVE_UPS_EN; + machine_menu.Z2andZ2Endstop = Z2_AND_Z2ENDSTOP_CONF_EN; + machine_menu.EnablePinsInvert = ENABLE_PINS_CONF_EN; + + machine_menu.Z2ConfTitle = Z2_AND_Z2ENDSTOP_CONF_TITLE_EN; + machine_menu.Z2Enable = Z2_ENABLE_EN; + machine_menu.Z2EndstopEnable = Z2_ENDSTOP_EN; + machine_menu.Z2Port = Z2_PORT_EN; + + machine_menu.EnablePinsInvertTitle = ENABLE_PINS_CONF_TITLE_EN; + machine_menu.XInvert = X_ENABLE_PINS_INVERT_EN; + machine_menu.YInvert = Y_ENABLE_PINS_INVERT_EN; + machine_menu.ZInvert = Z_ENABLE_PINS_INVERT_EN; + machine_menu.EInvert = E_ENABLE_PINS_INVERT_EN; + + machine_menu.key_back = KEY_BACK_EN; + machine_menu.key_reset = KEY_REST_EN; + machine_menu.key_confirm = KEY_CONFIRM_EN; + // + machine_menu.high_level = MOTOR_EN_HIGH_LEVEL_EN; + machine_menu.low_level = MOTOR_EN_LOW_LEVEL_EN; + + machine_menu.PausePosText = PAUSE_POSITION_EN; + machine_menu.xPos = PAUSE_POSITION_X_EN; + machine_menu.yPos = PAUSE_POSITION_Y_EN; + machine_menu.zPos = PAUSE_POSITION_Z_EN; + } +} void disp_language_init() { preheat_menu.value_state = TEXT_VALUE; - preheat_menu.step_1c = TEXT_1C; - preheat_menu.step_5c = TEXT_5C; - preheat_menu.step_10c = TEXT_10C; + preheat_menu.step_1c = TEXT_1C; + preheat_menu.step_5c = TEXT_5C; + preheat_menu.step_10c = TEXT_10C; move_menu.x_add = AXIS_X_ADD_TEXT; move_menu.x_dec = AXIS_X_DEC_TEXT; @@ -78,1826 +714,1901 @@ void disp_language_init() { move_menu.step_001mm = TEXT_001MM; move_menu.step_005mm = TEXT_005MM; - move_menu.step_01mm = TEXT_01MM; - move_menu.step_1mm = TEXT_1MM; - move_menu.step_10mm = TEXT_10MM; + move_menu.step_01mm = TEXT_01MM; + move_menu.step_1mm = TEXT_1MM; + move_menu.step_10mm = TEXT_10MM; - home_menu.home_x = HOME_X_TEXT; - home_menu.home_y = HOME_Y_TEXT; - home_menu.home_z = HOME_Z_TEXT; + home_menu.home_x = HOME_X_TEXT; + home_menu.home_y = HOME_Y_TEXT; + home_menu.home_z = HOME_Z_TEXT; home_menu.home_all = HOME_ALL_TEXT; - extrude_menu.temp_value = TEXT_VALUE_T; + extrude_menu.temp_value = TEXT_VALUE_T; extrude_menu.count_value_mm = TEXT_VALUE_mm; extrude_menu.count_value_cm = TEXT_VALUE_cm; - extrude_menu.count_value_m = TEXT_VALUE_m; - extrude_menu.step_1mm = EXTRUDE_1MM_TEXT; - extrude_menu.step_5mm = EXTRUDE_5MM_TEXT; - extrude_menu.step_10mm = EXTRUDE_10MM_TEXT; + extrude_menu.count_value_m = TEXT_VALUE_m; + extrude_menu.step_1mm = EXTRUDE_1MM_TEXT; + extrude_menu.step_5mm = EXTRUDE_5MM_TEXT; + extrude_menu.step_10mm = EXTRUDE_10MM_TEXT; fan_menu.full = FAN_OPEN_TEXT; fan_menu.half = FAN_HALF_TEXT; - fan_menu.off = FAN_CLOSE_TEXT; + fan_menu.off = FAN_CLOSE_TEXT; - speed_menu.step_1percent = STEP_1PERCENT; - speed_menu.step_5percent = STEP_5PERCENT; + speed_menu.step_1percent = STEP_1PERCENT; + speed_menu.step_5percent = STEP_5PERCENT; speed_menu.step_10percent = STEP_10PERCENT; - language_menu.chinese_s = LANGUAGE_S_CN; - language_menu.chinese_t = LANGUAGE_T_CN; - language_menu.english = LANGUAGE_EN; - language_menu.russian = LANGUAGE_RU; - language_menu.spanish = LANGUAGE_SP; - language_menu.german = LANGUAGE_GE; - language_menu.japan = LANGUAGE_JP; - language_menu.korean = LANGUAGE_KR; + language_menu.chinese_s = LANGUAGE_S_CN; + language_menu.chinese_t = LANGUAGE_T_CN; + language_menu.english = LANGUAGE_EN; + language_menu.russian = LANGUAGE_RU; + language_menu.spanish = LANGUAGE_SP; + language_menu.german = LANGUAGE_GE; + language_menu.japan = LANGUAGE_JP; + language_menu.korean = LANGUAGE_KR; language_menu.portuguese = LANGUAGE_PR; - language_menu.italy = LANGUAGE_IT; - language_menu.brazil = LANGUAGE_BR; - language_menu.french = LANGUAGE_FR; + language_menu.italy = LANGUAGE_IT; + language_menu.brazil = LANGUAGE_BR; + language_menu.french = LANGUAGE_FR; - about_menu.type_name = ABOUT_TYPE_TEXT; + about_menu.type_name = ABOUT_TYPE_TEXT; about_menu.firmware_v = ABOUT_VERSION_TEXT; - //about_menu.wifi = ABOUT_WIFI_TEXT; - - wifi_menu.ip = WIFI_IP_TEXT; - wifi_menu.wifi = WIFI_NAME_TEXT; - wifi_menu.key = WIFI_KEY_TEXT; - wifi_menu.state_ap = WIFI_STATE_AP_TEXT; - wifi_menu.state_sta = WIFI_STATE_STA_TEXT; - wifi_menu.connected = WIFI_CONNECTED_TEXT; + // about_menu.wifi = ABOUT_WIFI_TEXT; + + wifi_menu.ip = WIFI_IP_TEXT; + wifi_menu.wifi = WIFI_NAME_TEXT; + wifi_menu.key = WIFI_KEY_TEXT; + wifi_menu.state_ap = WIFI_STATE_AP_TEXT; + wifi_menu.state_sta = WIFI_STATE_STA_TEXT; + wifi_menu.connected = WIFI_CONNECTED_TEXT; wifi_menu.disconnected = WIFI_DISCONNECTED_TEXT; - wifi_menu.exception = WIFI_EXCEPTION_TEXT; + wifi_menu.exception = WIFI_EXCEPTION_TEXT; - printing_menu.temp1 = TEXT_VALUE; - printing_menu.temp2 = TEXT_VALUE; + printing_menu.temp1 = TEXT_VALUE; + printing_menu.temp2 = TEXT_VALUE; printing_menu.bed_temp = TEXT_VALUE; filament_menu.stat_temp = TEXT_VALUE; zoffset_menu.step001 = ZOFFSET_STEP001; - zoffset_menu.step01 = ZOFFSET_STEP01; - zoffset_menu.step1 = ZOFFSET_STEP1; - - //wifi-list + zoffset_menu.step01 = ZOFFSET_STEP01; + zoffset_menu.step1 = ZOFFSET_STEP1; + + machine_menu.key_0 = KEYBOARD_KEY0_EN; + machine_menu.key_1 = KEYBOARD_KEY1_EN; + machine_menu.key_2 = KEYBOARD_KEY2_EN; + machine_menu.key_3 = KEYBOARD_KEY3_EN; + machine_menu.key_4 = KEYBOARD_KEY4_EN; + machine_menu.key_5 = KEYBOARD_KEY5_EN; + machine_menu.key_6 = KEYBOARD_KEY6_EN; + machine_menu.key_7 = KEYBOARD_KEY7_EN; + machine_menu.key_8 = KEYBOARD_KEY8_EN; + machine_menu.key_9 = KEYBOARD_KEY9_EN; + machine_menu.key_point = KEYBOARD_KEY_POINT_EN; + machine_menu.negative = KEYBOARD_KEY_NEGATIVE_EN; + // wifi-list #if 0 - list_menu.title = TEXT_WIFI_MENU_TITLE_EN; + list_menu.title = TEXT_WIFI_MENU_TITLE_EN; list_menu.file_pages = FILE_PAGES_EN; - //keyboard - keyboard_menu.apply = MANUAL_IP_APPLY_EN; + // keyboard + keyboard_menu.apply = MANUAL_IP_APPLY_EN; keyboard_menu.password = TEXT_WIFI_PASSWORD_EN; - keyboard_menu.space = TEXT_WIFI_SAPCE_EN; - keyboard_menu.letter = TEXT_WIFI_LETTER_EN; - keyboard_menu.digital = TEXT_WIFI_DIGITAL_EN; - keyboard_menu.symbol = TEXT_WIFI_SYMBOL_EN; - //tips - tips_menu.pointBold = TEXT_WIFI_POINT_BOLD_EN; - tips_menu.joining = TEXT_WIFI_JOINING_EN; - tips_menu.failedJoin = TEXT_WIFI_FAILED_JOIN_EN; + keyboard_menu.space = TEXT_WIFI_SAPCE_EN; + keyboard_menu.letter = TEXT_WIFI_LETTER_EN; + keyboard_menu.digital = TEXT_WIFI_DIGITAL_EN; + keyboard_menu.symbol = TEXT_WIFI_SYMBOL_EN; + // tips + tips_menu.pointBold = TEXT_WIFI_POINT_BOLD_EN; + tips_menu.joining = TEXT_WIFI_JOINING_EN; + tips_menu.failedJoin = TEXT_WIFI_FAILED_JOIN_EN; tips_menu.wifiConected = TEXT_WIFI_WIFI_CONECTED_EN; #endif + machine_setting_disp(); + operation_menu.babystep = TEXT_BABY_STEP_EN; switch (gCfgItems.language) { case LANG_SIMPLE_CHINESE: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_CN; - common_menu.text_back = BACK_TEXT_CN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_CN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_CN; - common_menu.print_special_title = PRINTING_GBK; - common_menu.pause_special_title = PRINTING_PAUSE_GBK; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_CN; + common_menu.text_back = BACK_TEXT_CN; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_CN; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_CN; + common_menu.print_special_title = PRINTING_GBK; + common_menu.pause_special_title = PRINTING_PAUSE_GBK; common_menu.operate_special_title = PRINTING_OPERATION_GBK; // - main_menu.title = TITLE_READYPRINT_CN; - main_menu.preheat = PREHEAT_TEXT_CN; - main_menu.move = MOVE_TEXT_CN; - main_menu.home = HOME_TEXT_CN; - main_menu.print = PRINT_TEXT_CN; - main_menu.extrude = EXTRUDE_TEXT_CN; - main_menu.leveling = LEVELING_TEXT_CN; + main_menu.title = TITLE_READYPRINT_CN; + main_menu.preheat = PREHEAT_TEXT_CN; + main_menu.move = MOVE_TEXT_CN; + main_menu.home = HOME_TEXT_CN; + main_menu.print = PRINT_TEXT_CN; + main_menu.extrude = EXTRUDE_TEXT_CN; + main_menu.leveling = LEVELING_TEXT_CN; main_menu.autoleveling = AUTO_LEVELING_TEXT_CN; - main_menu.fan = FAN_TEXT_CN; - main_menu.set = SET_TEXT_CN; - main_menu.more = MORE_TEXT_CN; - main_menu.tool = TOOL_TEXT_CN; - //TOOL - tool_menu.title = TOOL_TEXT_CN; - tool_menu.preheat = TOOL_PREHEAT_CN; - tool_menu.extrude = TOOL_EXTRUDE_CN; - tool_menu.move = TOOL_MOVE_CN; - tool_menu.home = TOOL_HOME_CN; - tool_menu.leveling = TOOL_LEVELING_CN; + main_menu.fan = FAN_TEXT_CN; + main_menu.set = SET_TEXT_CN; + main_menu.more = MORE_TEXT_CN; + main_menu.tool = TOOL_TEXT_CN; + // TOOL + tool_menu.title = TOOL_TEXT_CN; + tool_menu.preheat = TOOL_PREHEAT_CN; + tool_menu.extrude = TOOL_EXTRUDE_CN; + tool_menu.move = TOOL_MOVE_CN; + tool_menu.home = TOOL_HOME_CN; + tool_menu.leveling = TOOL_LEVELING_CN; tool_menu.autoleveling = TOOL_AUTO_LEVELING_CN; - tool_menu.filament = TOOL_FILAMENT_CN; - tool_menu.more = TOOL_MORE_CN; + tool_menu.filament = TOOL_FILAMENT_CN; + tool_menu.more = TOOL_MORE_CN; // preheat_menu.adjust_title = TITLE_ADJUST_CN; - preheat_menu.title = TITLE_PREHEAT_CN; - preheat_menu.add = ADD_TEXT_CN; - preheat_menu.dec = DEC_TEXT_CN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_CN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_CN; - preheat_menu.hotbed = HEATBED_TEXT_CN; - preheat_menu.off = CLOSE_TEXT_CN; + preheat_menu.title = TITLE_PREHEAT_CN; + preheat_menu.add = ADD_TEXT_CN; + preheat_menu.dec = DEC_TEXT_CN; + preheat_menu.ext1 = EXTRUDER_1_TEXT_CN; + preheat_menu.ext2 = EXTRUDER_2_TEXT_CN; + preheat_menu.hotbed = HEATBED_TEXT_CN; + preheat_menu.off = CLOSE_TEXT_CN; preheat_menu.value_state = TEXT_VALUE_CN; - preheat_menu.step_1c = TEXT_1C_CN; - preheat_menu.step_5c = TEXT_5C_CN; - preheat_menu.step_10c = TEXT_10C_CN; + preheat_menu.step_1c = TEXT_1C_CN; + preheat_menu.step_5c = TEXT_5C_CN; + preheat_menu.step_10c = TEXT_10C_CN; // move_menu.title = MOVE_TEXT_CN; // - home_menu.title = TITLE_HOME_CN; + home_menu.title = TITLE_HOME_CN; home_menu.stopmove = HOME_STOPMOVE_CN; // - file_menu.title = TITLE_CHOOSEFILE_CN; - file_menu.page_up = PAGE_UP_TEXT_CN; - file_menu.page_down = PAGE_DOWN_TEXT_CN; - file_menu.file_loading = FILE_LOADING_CN; - file_menu.no_file = NO_FILE_CN; - file_menu.no_file_and_check = NO_FILE_CN;//NO_FILE_AND_CHECK_CN; + file_menu.title = TITLE_CHOOSEFILE_CN; + file_menu.page_up = PAGE_UP_TEXT_CN; + file_menu.page_down = PAGE_DOWN_TEXT_CN; + file_menu.file_loading = FILE_LOADING_CN; + file_menu.no_file = NO_FILE_CN; + file_menu.no_file_and_check = NO_FILE_CN;// NO_FILE_AND_CHECK_CN; // - extrude_menu.title = TITLE_EXTRUDE_CN; - extrude_menu.in = EXTRUDER_IN_TEXT_CN; - extrude_menu.out = EXTRUDER_OUT_TEXT_CN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_CN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_CN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_CN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_CN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_CN; + extrude_menu.title = TITLE_EXTRUDE_CN; + extrude_menu.in = EXTRUDER_IN_TEXT_CN; + extrude_menu.out = EXTRUDER_OUT_TEXT_CN; + extrude_menu.ext1 = EXTRUDER_1_TEXT_CN; + extrude_menu.ext2 = EXTRUDER_2_TEXT_CN; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_CN; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_CN; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_CN; extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_CN; - extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_CN; + extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_CN; // - leveling_menu.title = TITLE_LEVELING_CN; + leveling_menu.title = TITLE_LEVELING_CN; leveling_menu.position1 = LEVELING_POINT1_TEXT_CN; leveling_menu.position2 = LEVELING_POINT2_TEXT_CN; leveling_menu.position3 = LEVELING_POINT3_TEXT_CN; leveling_menu.position4 = LEVELING_POINT4_TEXT_CN; leveling_menu.position5 = LEVELING_POINT5_TEXT_CN; // - set_menu.title = TITLE_SET_CN; - set_menu.filesys = FILESYS_TEXT_CN; - set_menu.wifi = WIFI_TEXT_CN; - set_menu.about = ABOUT_TEXT_CN; - set_menu.fan = FAN_TEXT_CN; - set_menu.filament = FILAMENT_TEXT_CN; - set_menu.breakpoint = BREAK_POINT_TEXT_CN; - set_menu.motoroff = MOTOR_OFF_TEXT_CN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_CN; - set_menu.language = LANGUAGE_TEXT_CN; - set_menu.shutdown = SHUTDOWN_TEXT_CN; - //set_menu.machine_para = MACHINE_PARA_CN; - + set_menu.title = TITLE_SET_CN; + set_menu.filesys = FILESYS_TEXT_CN; + set_menu.wifi = WIFI_TEXT_CN; + set_menu.about = ABOUT_TEXT_CN; + set_menu.fan = FAN_TEXT_CN; + set_menu.filament = FILAMENT_TEXT_CN; + set_menu.breakpoint = BREAK_POINT_TEXT_CN; + set_menu.motoroff = MOTOR_OFF_TEXT_CN; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_CN; + set_menu.language = LANGUAGE_TEXT_CN; + set_menu.shutdown = SHUTDOWN_TEXT_CN; + set_menu.machine_para = MACHINE_PARA_CN; + set_menu.eepromSet = EEPROM_SETTINGS_CN; // - filesys_menu.title = TITLE_FILESYS_CN; - filesys_menu.sd_sys = SD_CARD_TEXT_CN; + filesys_menu.title = TITLE_FILESYS_CN; + filesys_menu.sd_sys = SD_CARD_TEXT_CN; filesys_menu.usb_sys = U_DISK_TEXT_CN; // - more_menu.title = TITLE_MORE_CN; + more_menu.title = TITLE_MORE_CN; more_menu.zoffset = ZOFFSET_CN; - //WIFI + // WIFI wifi_menu.title = WIFI_TEXT; - //wifi_menu.key = WIFI_KEY_TEXT_CN; - //wifi_menu.ip = WIFI_IP_TEXT_CN; - //wifi_menu.state = WIFI_STA_TEXT_CN; - wifi_menu.cloud = CLOUD_TEXT_CN; + // wifi_menu.key = WIFI_KEY_TEXT_CN; + // wifi_menu.ip = WIFI_IP_TEXT_CN; + // wifi_menu.state = WIFI_STA_TEXT_CN; + wifi_menu.cloud = CLOUD_TEXT_CN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_CN; - //CLOUD - cloud_menu.title = TITLE_CLOUD_TEXT_CN; - cloud_menu.bind = CLOUD_BINDED_CN; - cloud_menu.binded = CLOUD_BINDED_CN; - cloud_menu.unbind = CLOUD_UNBIND_CN; - cloud_menu.unbinding = CLOUD_UNBINDED_CN; + // CLOUD + cloud_menu.title = TITLE_CLOUD_TEXT_CN; + cloud_menu.bind = CLOUD_BINDED_CN; + cloud_menu.binded = CLOUD_BINDED_CN; + cloud_menu.unbind = CLOUD_UNBIND_CN; + cloud_menu.unbinding = CLOUD_UNBINDED_CN; cloud_menu.disconnected = CLOUD_DISCONNECTED_CN; - cloud_menu.disable = CLOUD_DISABLE_CN; + cloud_menu.disable = CLOUD_DISABLE_CN; // - about_menu.title = ABOUT_TEXT_CN; - about_menu.type = ABOUT_TYPE_TEXT_CN; + about_menu.title = ABOUT_TEXT_CN; + about_menu.type = ABOUT_TYPE_TEXT_CN; about_menu.version = ABOUT_VERSION_TEXT_CN; - about_menu.wifi = ABOUT_WIFI_TEXT_CN; + about_menu.wifi = ABOUT_WIFI_TEXT_CN; // fan_menu.title = FAN_TEXT_CN; - fan_menu.add = FAN_ADD_TEXT_CN; - fan_menu.dec = FAN_DEC_TEXT_CN; + fan_menu.add = FAN_ADD_TEXT_CN; + fan_menu.dec = FAN_DEC_TEXT_CN; fan_menu.state = FAN_TIPS1_TEXT_CN; // - filament_menu.title = TITLE_FILAMENT_CN; - filament_menu.in = FILAMENT_IN_TEXT_CN; - filament_menu.out = FILAMENT_OUT_TEXT_CN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_CN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_CN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_CN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_CN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN; + filament_menu.title = TITLE_FILAMENT_CN; + filament_menu.in = FILAMENT_IN_TEXT_CN; + filament_menu.out = FILAMENT_OUT_TEXT_CN; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_CN; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_CN; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_CN; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_CN; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN; filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_CN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_CN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_CN; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN; // language_menu.title = TITLE_LANGUAGE_CN; - language_menu.next = PAGE_DOWN_TEXT_CN; - language_menu.up = PAGE_UP_TEXT_CN; + language_menu.next = PAGE_DOWN_TEXT_CN; + language_menu.up = PAGE_UP_TEXT_CN; // - printing_menu.title = TITLE_PRINTING_CN; + printing_menu.title = TITLE_PRINTING_CN; printing_menu.option = PRINTING_OPERATION_CN; - printing_menu.stop = PRINTING_STOP_CN; - printing_menu.pause = PRINTING_PAUSE_CN; + printing_menu.stop = PRINTING_STOP_CN; + printing_menu.pause = PRINTING_PAUSE_CN; printing_menu.resume = PRINTING_RESUME_CN; // - operation_menu.title = TITLE_OPERATION_CN; - operation_menu.pause = PRINTING_PAUSE_CN; - operation_menu.stop = PRINTING_STOP_CN; - operation_menu.temp = PRINTING_TEMP_CN; - operation_menu.fan = FAN_TEXT_CN; - operation_menu.filament = FILAMENT_TEXT_CN; - operation_menu.extr = PRINTING_EXTRUDER_CN; - operation_menu.speed = PRINTING_CHANGESPEED_CN; - operation_menu.more = PRINTING_MORE_CN; - operation_menu.move = PRINTING_MOVE_CN; - operation_menu.auto_off = AUTO_SHUTDOWN_CN; + operation_menu.title = TITLE_OPERATION_CN; + operation_menu.pause = PRINTING_PAUSE_CN; + operation_menu.stop = PRINTING_STOP_CN; + operation_menu.temp = PRINTING_TEMP_CN; + operation_menu.fan = FAN_TEXT_CN; + operation_menu.filament = FILAMENT_TEXT_CN; + operation_menu.extr = PRINTING_EXTRUDER_CN; + operation_menu.speed = PRINTING_CHANGESPEED_CN; + operation_menu.more = PRINTING_MORE_CN; + operation_menu.move = PRINTING_MOVE_CN; + operation_menu.auto_off = AUTO_SHUTDOWN_CN; operation_menu.manual_off = MANUAL_SHUTDOWN_CN; // - pause_menu.title = TITLE_PAUSE_CN; - pause_menu.resume = PRINTING_RESUME_CN; - pause_menu.stop = PRINTING_STOP_CN; - pause_menu.extrude = PRINTING_EXTRUDER_CN; - pause_menu.move = PRINTING_MOVE_CN; + pause_menu.title = TITLE_PAUSE_CN; + pause_menu.resume = PRINTING_RESUME_CN; + pause_menu.stop = PRINTING_STOP_CN; + pause_menu.extrude = PRINTING_EXTRUDER_CN; + pause_menu.move = PRINTING_MOVE_CN; pause_menu.filament = FILAMENT_TEXT_CN; - pause_menu.more = PRINTING_MORE_CN; + pause_menu.more = PRINTING_MORE_CN; // - speed_menu.title = PRINTING_CHANGESPEED_CN; - speed_menu.add = ADD_TEXT_CN; - speed_menu.dec = DEC_TEXT_CN; - speed_menu.move = MOVE_SPEED_CN; - speed_menu.extrude = EXTRUDER_SPEED_CN; + speed_menu.title = PRINTING_CHANGESPEED_CN; + speed_menu.add = ADD_TEXT_CN; + speed_menu.dec = DEC_TEXT_CN; + speed_menu.move = MOVE_SPEED_CN; + speed_menu.extrude = EXTRUDER_SPEED_CN; speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_CN; - speed_menu.move_speed = MOVE_SPEED_STATE_CN; + speed_menu.move_speed = MOVE_SPEED_STATE_CN; // - printing_more_menu.title = TITLE_MORE_CN; - printing_more_menu.fan = FAN_TEXT_CN; + printing_more_menu.title = TITLE_MORE_CN; + printing_more_menu.fan = FAN_TEXT_CN; printing_more_menu.auto_close = AUTO_SHUTDOWN_CN; - printing_more_menu.manual = MANUAL_SHUTDOWN_CN; - printing_more_menu.speed = PRINTING_CHANGESPEED_CN; - printing_more_menu.temp = PRINTING_TEMP_CN; - - //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_CN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_CN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_CN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_CN; - print_file_dialog_menu.retry = DIALOG_RETRY_CN; - print_file_dialog_menu.stop = DIALOG_STOP_CN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_CN; + printing_more_menu.manual = MANUAL_SHUTDOWN_CN; + printing_more_menu.speed = PRINTING_CHANGESPEED_CN; + printing_more_menu.temp = PRINTING_TEMP_CN; + + // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_CN; + print_file_dialog_menu.cancle = DIALOG_CANCLE_CN; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_CN; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_CN; + print_file_dialog_menu.retry = DIALOG_RETRY_CN; + print_file_dialog_menu.stop = DIALOG_STOP_CN; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_CN; print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_CN; print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_CN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_CN; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_CN; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_CN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_CN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_CN; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_CN; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_CN; + print_file_dialog_menu.reprint = DIALOG_REPRINT_CN; print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_CN; - //ZOFFSET + // ZOFFSET zoffset_menu.title = TITLE_ZOFFSET_CN; - zoffset_menu.inc = ZOFFSET_INC_CN; - zoffset_menu.dec = ZOFFSET_DEC_CN; - - pause_msg_menu.pausing = MESSEGE_PAUSING_CN; - pause_msg_menu.changing = MESSEGE_CHANGING_CN; - pause_msg_menu.unload = MESSEGE_UNLOAD_CN; - pause_msg_menu.waiting = MESSEGE_WAITING_CN; - pause_msg_menu.insert = MESSEGE_INSERT_CN; - pause_msg_menu.load = MESSEGE_LOAD_CN; - pause_msg_menu.purge = MESSEGE_PURGE_CN; - pause_msg_menu.resume = MESSEGE_RESUME_CN; - pause_msg_menu.heat = MESSEGE_HEAT_CN; - pause_msg_menu.heating = MESSEGE_HEATING_CN; - pause_msg_menu.option = MESSEGE_OPTION_CN; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_CN; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_CN; + zoffset_menu.inc = ZOFFSET_INC_CN; + zoffset_menu.dec = ZOFFSET_DEC_CN; + + pause_msg_menu.pausing = MESSAGE_PAUSING_CN; + pause_msg_menu.changing = MESSAGE_CHANGING_CN; + pause_msg_menu.unload = MESSAGE_UNLOAD_CN; + pause_msg_menu.waiting = MESSAGE_WAITING_CN; + pause_msg_menu.insert = MESSAGE_INSERT_CN; + pause_msg_menu.load = MESSAGE_LOAD_CN; + pause_msg_menu.purge = MESSAGE_PURGE_CN; + pause_msg_menu.resume = MESSAGE_RESUME_CN; + pause_msg_menu.heat = MESSAGE_HEAT_CN; + pause_msg_menu.heating = MESSAGE_HEATING_CN; + pause_msg_menu.option = MESSAGE_OPTION_CN; + pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_CN; + pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_CN; + eeprom_menu.title = EEPROM_SETTINGS_TITLE_CN; + eeprom_menu.store = EEPROM_SETTINGS_STORE_CN; + eeprom_menu.read = EEPROM_SETTINGS_READ_CN; + eeprom_menu.revert = EEPROM_SETTINGS_REVERT_CN; + eeprom_menu.storeTips = EEPROM_STORE_TIPS_CN; + eeprom_menu.readTips = EEPROM_READ_TIPS_CN; + eeprom_menu.revertTips = EEPROM_REVERT_TIPS_CN; break; #if 1 #if 1 case LANG_COMPLEX_CHINESE: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_CN; - common_menu.text_back = BACK_TEXT_CN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_CN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_CN; - common_menu.print_special_title = PRINTING_GBK; - common_menu.pause_special_title = PRINTING_PAUSE_GBK; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_T_CN; + common_menu.text_back = BACK_TEXT_T_CN; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_T_CN; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_T_CN; + common_menu.print_special_title = PRINTING_GBK; + common_menu.pause_special_title = PRINTING_PAUSE_GBK; common_menu.operate_special_title = PRINTING_OPERATION_GBK; // - main_menu.title = TITLE_READYPRINT_CN; - main_menu.preheat = PREHEAT_TEXT_CN; - main_menu.move = MOVE_TEXT_CN; - main_menu.home = HOME_TEXT_CN; - main_menu.print = PRINT_TEXT_CN; - main_menu.extrude = EXTRUDE_TEXT_CN; - main_menu.leveling = LEVELING_TEXT_CN; - main_menu.autoleveling = AUTO_LEVELING_TEXT_CN; - main_menu.fan = FAN_TEXT_CN; - main_menu.set = SET_TEXT_CN; - main_menu.more = MORE_TEXT_CN; - main_menu.tool = TOOL_TEXT_CN; - //TOOL - tool_menu.title = TOOL_TEXT_CN; - tool_menu.preheat = TOOL_PREHEAT_CN; - tool_menu.extrude = TOOL_EXTRUDE_CN; - tool_menu.move = TOOL_MOVE_CN; - tool_menu.home = TOOL_HOME_CN; - tool_menu.leveling = TOOL_LEVELING_CN; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_CN; - tool_menu.filament = TOOL_FILAMENT_CN; - tool_menu.more = TOOL_MORE_CN; - // - preheat_menu.adjust_title = TITLE_ADJUST_CN; - preheat_menu.title = TITLE_PREHEAT_CN; - preheat_menu.add = ADD_TEXT_CN; - preheat_menu.dec = DEC_TEXT_CN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_CN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_CN; - preheat_menu.hotbed = HEATBED_TEXT_CN; - preheat_menu.off = CLOSE_TEXT_CN; - preheat_menu.value_state = TEXT_VALUE_CN; - preheat_menu.step_1c = TEXT_1C_CN; - preheat_menu.step_5c = TEXT_5C_CN; - preheat_menu.step_10c = TEXT_10C_CN; - // - move_menu.title = MOVE_TEXT_CN; - more_menu.zoffset = ZOFFSET_CN; - // - home_menu.title = TITLE_HOME_CN; - home_menu.stopmove = HOME_STOPMOVE_CN; - // - file_menu.title = TITLE_CHOOSEFILE_CN; - file_menu.page_up = PAGE_UP_TEXT_CN; - file_menu.page_down = PAGE_DOWN_TEXT_CN; - file_menu.file_loading = FILE_LOADING_CN; - file_menu.no_file = NO_FILE_CN; - file_menu.no_file_and_check = NO_FILE_CN;//NO_FILE_AND_CHECK_T_CN; - // - extrude_menu.title = TITLE_EXTRUDE_CN; - extrude_menu.in = EXTRUDER_IN_TEXT_CN; - extrude_menu.out = EXTRUDER_OUT_TEXT_CN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_CN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_CN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_CN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_CN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_CN; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_CN; - extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_CN; - // - leveling_menu.title = TITLE_LEVELING_CN; - leveling_menu.position1 = LEVELING_POINT1_TEXT_CN; - leveling_menu.position2 = LEVELING_POINT2_TEXT_CN; - leveling_menu.position3 = LEVELING_POINT3_TEXT_CN; - leveling_menu.position4 = LEVELING_POINT4_TEXT_CN; - leveling_menu.position5 = LEVELING_POINT5_TEXT_CN; - // - set_menu.title = TITLE_SET_CN; - set_menu.filesys = FILESYS_TEXT_CN; - set_menu.wifi = WIFI_TEXT_CN; - set_menu.about = ABOUT_TEXT_CN; - set_menu.fan = FAN_TEXT_CN; - set_menu.filament = FILAMENT_TEXT_CN; - set_menu.breakpoint = BREAK_POINT_TEXT_CN; - set_menu.motoroff = MOTOR_OFF_TEXT_CN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_CN; - set_menu.language = LANGUAGE_TEXT_CN; - set_menu.shutdown = SHUTDOWN_TEXT_CN; - //set_menu.machine_para = MACHINE_PARA_CN; - // - filesys_menu.title = TITLE_FILESYS_CN; - filesys_menu.sd_sys = SD_CARD_TEXT_CN; - filesys_menu.usb_sys = U_DISK_TEXT_CN; - // - more_menu.title = TITLE_MORE_CN; - //WIFI + main_menu.title = TITLE_READYPRINT_T_CN; + main_menu.preheat = PREHEAT_TEXT_T_CN; + main_menu.move = MOVE_TEXT_T_CN; + main_menu.home = HOME_TEXT_T_CN; + main_menu.print = PRINT_TEXT_T_CN; + main_menu.extrude = EXTRUDE_TEXT_T_CN; + main_menu.leveling = LEVELING_TEXT_T_CN; + main_menu.autoleveling = AUTO_LEVELING_TEXT_T_CN; + main_menu.fan = FAN_TEXT_T_CN; + main_menu.set = SET_TEXT_T_CN; + main_menu.more = MORE_TEXT_T_CN; + main_menu.tool = TOOL_TEXT_T_CN; + // TOOL + tool_menu.title = TOOL_TEXT_T_CN; + tool_menu.preheat = TOOL_PREHEAT_T_CN; + tool_menu.extrude = TOOL_EXTRUDE_T_CN; + tool_menu.move = TOOL_MOVE_T_CN; + tool_menu.home = TOOL_HOME_T_CN; + tool_menu.leveling = TOOL_LEVELING_T_CN; + tool_menu.autoleveling = TOOL_AUTO_LEVELING_T_CN; + tool_menu.filament = TOOL_FILAMENT_T_CN; + tool_menu.more = TOOL_MORE_T_CN; + // + preheat_menu.adjust_title = TITLE_ADJUST_T_CN; + preheat_menu.title = TITLE_PREHEAT_T_CN; + preheat_menu.add = ADD_TEXT_T_CN; + preheat_menu.dec = DEC_TEXT_T_CN; + preheat_menu.ext1 = EXTRUDER_1_TEXT_T_CN; + preheat_menu.ext2 = EXTRUDER_2_TEXT_T_CN; + preheat_menu.hotbed = HEATBED_TEXT_T_CN; + preheat_menu.off = CLOSE_TEXT_T_CN; + preheat_menu.value_state = TEXT_VALUE_T_CN; + preheat_menu.step_1c = TEXT_1C_T_CN; + preheat_menu.step_5c = TEXT_5C_T_CN; + preheat_menu.step_10c = TEXT_10C_T_CN; + // + move_menu.title = MOVE_TEXT_T_CN; + more_menu.zoffset = ZOFFSET_T_CN; + // + home_menu.title = TITLE_HOME_T_CN; + home_menu.stopmove = HOME_STOPMOVE_T_CN; + // + file_menu.title = TITLE_CHOOSEFILE_T_CN; + file_menu.page_up = PAGE_UP_TEXT_T_CN; + file_menu.page_down = PAGE_DOWN_TEXT_T_CN; + file_menu.file_loading = FILE_LOADING_T_CN; + file_menu.no_file = NO_FILE_T_CN; + file_menu.no_file_and_check = NO_FILE_T_CN;// NO_FILE_AND_CHECK_T_CN; + // + extrude_menu.title = TITLE_EXTRUDE_T_CN; + extrude_menu.in = EXTRUDER_IN_TEXT_T_CN; + extrude_menu.out = EXTRUDER_OUT_TEXT_T_CN; + extrude_menu.ext1 = EXTRUDER_1_TEXT_T_CN; + extrude_menu.ext2 = EXTRUDER_2_TEXT_T_CN; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_T_CN; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_T_CN; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_T_CN; + extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_T_CN; + extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_T_CN; + // + leveling_menu.title = TITLE_LEVELING_CN; + leveling_menu.position1 = LEVELING_POINT1_TEXT_T_CN; + leveling_menu.position2 = LEVELING_POINT2_TEXT_T_CN; + leveling_menu.position3 = LEVELING_POINT3_TEXT_T_CN; + leveling_menu.position4 = LEVELING_POINT4_TEXT_T_CN; + leveling_menu.position5 = LEVELING_POINT5_TEXT_T_CN; + // + set_menu.title = TITLE_SET_T_CN; + set_menu.filesys = FILESYS_TEXT_T_CN; + set_menu.wifi = WIFI_TEXT_T_CN; + set_menu.about = ABOUT_TEXT_T_CN; + set_menu.fan = FAN_TEXT_T_CN; + set_menu.filament = FILAMENT_TEXT_T_CN; + set_menu.breakpoint = BREAK_POINT_TEXT_T_CN; + set_menu.motoroff = MOTOR_OFF_TEXT_T_CN; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_T_CN; + set_menu.language = LANGUAGE_TEXT_T_CN; + set_menu.shutdown = SHUTDOWN_TEXT_T_CN; + set_menu.machine_para = MACHINE_PARA_T_CN; + set_menu.eepromSet = EEPROM_SETTINGS_T_CN; + filesys_menu.title = TITLE_FILESYS_T_CN; + filesys_menu.sd_sys = SD_CARD_TEXT_T_CN; + filesys_menu.usb_sys = U_DISK_TEXT_T_CN; + // + more_menu.title = TITLE_MORE_T_CN; + // WIFI wifi_menu.title = WIFI_TEXT; - //wifi_menu.key = WIFI_KEY_TEXT_CN; - //wifi_menu.ip = WIFI_IP_TEXT_CN; - //wifi_menu.state = WIFI_STA_TEXT_CN; - wifi_menu.cloud = CLOUD_TEXT_CN; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_CN; - //CLOUD - cloud_menu.title = TITLE_CLOUD_TEXT_CN; - cloud_menu.bind = CLOUD_BINDED_CN; - cloud_menu.binded = CLOUD_BINDED_CN; - cloud_menu.unbind = CLOUD_UNBIND_CN; - cloud_menu.unbinding = CLOUD_UNBINDED_CN; - cloud_menu.disconnected = CLOUD_DISCONNECTED_CN; - cloud_menu.disable = CLOUD_DISABLE_CN; - // - about_menu.title = ABOUT_TEXT_CN; - about_menu.type = ABOUT_TYPE_TEXT_CN; - about_menu.version = ABOUT_VERSION_TEXT_CN; - about_menu.wifi = ABOUT_WIFI_TEXT_CN; - - // - fan_menu.title = FAN_TEXT_CN; - fan_menu.add = FAN_ADD_TEXT_CN; - fan_menu.dec = FAN_DEC_TEXT_CN; - fan_menu.state = FAN_TIPS1_TEXT_CN; - // - filament_menu.title = TITLE_FILAMENT_CN; - filament_menu.in = FILAMENT_IN_TEXT_CN; - filament_menu.out = FILAMENT_OUT_TEXT_CN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_CN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_CN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_CN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_CN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_CN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_CN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN; - - - // - language_menu.title = TITLE_LANGUAGE_CN; - language_menu.next = PAGE_DOWN_TEXT_CN; - language_menu.up = PAGE_UP_TEXT_CN; - - // - printing_menu.title = TITLE_PRINTING_CN; - printing_menu.option = PRINTING_OPERATION_CN; - printing_menu.stop = PRINTING_STOP_CN; - printing_menu.pause = PRINTING_PAUSE_CN; - printing_menu.resume = PRINTING_RESUME_CN; - - // - operation_menu.title = TITLE_OPERATION_CN; - operation_menu.pause = PRINTING_PAUSE_CN; - operation_menu.stop = PRINTING_STOP_CN; - operation_menu.temp = PRINTING_TEMP_CN; - operation_menu.fan = FAN_TEXT_CN; - operation_menu.extr = PRINTING_EXTRUDER_CN; - operation_menu.speed = PRINTING_CHANGESPEED_CN; - operation_menu.filament = FILAMENT_TEXT_CN; - operation_menu.more = PRINTING_MORE_CN; - operation_menu.move = PRINTING_MOVE_CN; - operation_menu.auto_off = AUTO_SHUTDOWN_CN; - operation_menu.manual_off = MANUAL_SHUTDOWN_CN; - // - pause_menu.title = TITLE_PAUSE_CN; - pause_menu.resume = PRINTING_RESUME_CN; - pause_menu.stop = PRINTING_STOP_CN; - pause_menu.extrude = PRINTING_EXTRUDER_CN; - pause_menu.move = PRINTING_MOVE_CN; - pause_menu.filament = FILAMENT_TEXT_CN; - pause_menu.more = PRINTING_MORE_CN; - - // - speed_menu.title = PRINTING_CHANGESPEED_CN; - speed_menu.add = ADD_TEXT_CN; - speed_menu.dec = DEC_TEXT_CN; - speed_menu.move = MOVE_SPEED_CN; - speed_menu.extrude = EXTRUDER_SPEED_CN; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_CN; - speed_menu.move_speed = MOVE_SPEED_STATE_CN; - // - printing_more_menu.title = TITLE_MORE_CN; - printing_more_menu.fan = FAN_TEXT_CN; - printing_more_menu.auto_close = AUTO_SHUTDOWN_CN; - printing_more_menu.manual = MANUAL_SHUTDOWN_CN; - printing_more_menu.speed = PRINTING_CHANGESPEED_CN; - printing_more_menu.temp = PRINTING_TEMP_CN; - - //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_CN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_CN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_CN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_CN; - print_file_dialog_menu.retry = DIALOG_RETRY_CN; - print_file_dialog_menu.stop = DIALOG_STOP_CN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_CN; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_CN; - - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_CN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_CN; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_CN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_CN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_CN; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_CN; - //ZOFFSET - zoffset_menu.title = TITLE_ZOFFSET_CN; - zoffset_menu.inc = ZOFFSET_INC_CN; - zoffset_menu.dec = ZOFFSET_DEC_CN; - - pause_msg_menu.pausing = MESSEGE_PAUSING_CN; - pause_msg_menu.changing = MESSEGE_CHANGING_CN; - pause_msg_menu.unload = MESSEGE_UNLOAD_CN; - pause_msg_menu.waiting = MESSEGE_WAITING_CN; - pause_msg_menu.insert = MESSEGE_INSERT_CN; - pause_msg_menu.load = MESSEGE_LOAD_CN; - pause_msg_menu.purge = MESSEGE_PURGE_CN; - pause_msg_menu.resume = MESSEGE_RESUME_CN; - pause_msg_menu.heat = MESSEGE_HEAT_CN; - pause_msg_menu.heating = MESSEGE_HEATING_CN; - pause_msg_menu.option = MESSEGE_OPTION_CN; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_CN; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_CN; + // wifi_menu.key = WIFI_KEY_TEXT_CN; + // wifi_menu.ip = WIFI_IP_TEXT_CN; + // wifi_menu.state= WIFI_STA_TEXT_CN; + wifi_menu.cloud = CLOUD_TEXT_T_CN; + wifi_menu.reconnect = WIFI_RECONNECT_TEXT_T_CN; + // CLOUD + cloud_menu.title = TITLE_CLOUD_TEXT_T_CN; + cloud_menu.bind = CLOUD_BINDED_T_CN; + cloud_menu.binded = CLOUD_BINDED_T_CN; + cloud_menu.unbind = CLOUD_UNBIND_T_CN; + cloud_menu.unbinding = CLOUD_UNBINDED_T_CN; + cloud_menu.disconnected = CLOUD_DISCONNECTED_T_CN; + cloud_menu.disable = CLOUD_DISABLE_T_CN; + // + about_menu.title = ABOUT_TEXT_T_CN; + about_menu.type = ABOUT_TYPE_TEXT_T_CN; + about_menu.version = ABOUT_VERSION_TEXT_T_CN; + about_menu.wifi = ABOUT_WIFI_TEXT_T_CN; + + // + fan_menu.title = FAN_TEXT_T_CN; + fan_menu.add = FAN_ADD_TEXT_T_CN; + fan_menu.dec = FAN_DEC_TEXT_T_CN; + fan_menu.state = FAN_TIPS1_TEXT_T_CN; + // + filament_menu.title = TITLE_FILAMENT_T_CN; + filament_menu.in = FILAMENT_IN_TEXT_T_CN; + filament_menu.out = FILAMENT_OUT_TEXT_T_CN; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_T_CN; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_T_CN; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_T_CN; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_T_CN; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_T_CN; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_T_CN; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_T_CN; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_T_CN; + filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_T_CN; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_T_CN; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_T_CN; + + + // + language_menu.title = TITLE_LANGUAGE_T_CN; + language_menu.next = PAGE_DOWN_TEXT_T_CN; + language_menu.up = PAGE_UP_TEXT_T_CN; + + // + printing_menu.title = TITLE_PRINTING_T_CN; + printing_menu.option = PRINTING_OPERATION_T_CN; + printing_menu.stop = PRINTING_STOP_T_CN; + printing_menu.pause = PRINTING_PAUSE_T_CN; + printing_menu.resume = PRINTING_RESUME_T_CN; + + // + operation_menu.title = TITLE_OPERATION_T_CN; + operation_menu.pause = PRINTING_PAUSE_T_CN; + operation_menu.stop = PRINTING_STOP_T_CN; + operation_menu.temp = PRINTING_TEMP_T_CN; + operation_menu.fan = FAN_TEXT_T_CN; + operation_menu.extr = PRINTING_EXTRUDER_T_CN; + operation_menu.speed = PRINTING_CHANGESPEED_T_CN; + operation_menu.filament = FILAMENT_TEXT_T_CN; + operation_menu.more = PRINTING_MORE_T_CN; + operation_menu.move = PRINTING_MOVE_T_CN; + operation_menu.auto_off = AUTO_SHUTDOWN_T_CN; + operation_menu.manual_off = MANUAL_SHUTDOWN_T_CN; + // + pause_menu.title = TITLE_PAUSE_T_CN; + pause_menu.resume = PRINTING_RESUME_T_CN; + pause_menu.stop = PRINTING_STOP_T_CN; + pause_menu.extrude = PRINTING_EXTRUDER_T_CN; + pause_menu.move = PRINTING_MOVE_T_CN; + pause_menu.filament = FILAMENT_TEXT_T_CN; + pause_menu.more = PRINTING_MORE_T_CN; + + // + speed_menu.title = PRINTING_CHANGESPEED_T_CN; + speed_menu.add = ADD_TEXT_T_CN; + speed_menu.dec = DEC_TEXT_T_CN; + speed_menu.move = MOVE_SPEED_T_CN; + speed_menu.extrude = EXTRUDER_SPEED_T_CN; + speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_T_CN; + speed_menu.move_speed = MOVE_SPEED_STATE_T_CN; + // + printing_more_menu.title = TITLE_MORE_T_CN; + printing_more_menu.fan = FAN_TEXT_T_CN; + printing_more_menu.auto_close = AUTO_SHUTDOWN_T_CN; + printing_more_menu.manual = MANUAL_SHUTDOWN_T_CN; + printing_more_menu.speed = PRINTING_CHANGESPEED_T_CN; + printing_more_menu.temp = PRINTING_TEMP_T_CN; + + // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_T_CN; + print_file_dialog_menu.cancle = DIALOG_CANCLE_T_CN; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_T_CN; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_T_CN; + print_file_dialog_menu.retry = DIALOG_RETRY_T_CN; + print_file_dialog_menu.stop = DIALOG_STOP_T_CN; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_T_CN; + print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_T_CN; + + print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_T_CN; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_T_CN; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_T_CN; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_T_CN; + print_file_dialog_menu.reprint = DIALOG_REPRINT_T_CN; + print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_T_CN; + // ZOFFSET + zoffset_menu.title = TITLE_ZOFFSET_T_CN; + zoffset_menu.inc = ZOFFSET_INC_T_CN; + zoffset_menu.dec = ZOFFSET_DEC_T_CN; + + pause_msg_menu.pausing = MESSAGE_PAUSING_T_CN; + pause_msg_menu.changing = MESSAGE_CHANGING_T_CN; + pause_msg_menu.unload = MESSAGE_UNLOAD_T_CN; + pause_msg_menu.waiting = MESSAGE_WAITING_T_CN; + pause_msg_menu.insert = MESSAGE_INSERT_T_CN; + pause_msg_menu.load = MESSAGE_LOAD_T_CN; + pause_msg_menu.purge = MESSAGE_PURGE_T_CN; + pause_msg_menu.resume = MESSAGE_RESUME_T_CN; + pause_msg_menu.heat = MESSAGE_HEAT_T_CN; + pause_msg_menu.heating = MESSAGE_HEATING_T_CN; + pause_msg_menu.option = MESSAGE_OPTION_T_CN; + pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_T_CN; + pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_T_CN; + eeprom_menu.title = EEPROM_SETTINGS_TITLE_T_CN; + eeprom_menu.store = EEPROM_SETTINGS_STORE_T_CN; + eeprom_menu.read = EEPROM_SETTINGS_READ_T_CN; + eeprom_menu.revert = EEPROM_SETTINGS_REVERT_T_CN; + eeprom_menu.storeTips = EEPROM_STORE_TIPS_T_CN; + eeprom_menu.readTips = EEPROM_READ_TIPS_T_CN; + eeprom_menu.revertTips = EEPROM_REVERT_TIPS_T_CN; break; case LANG_ENGLISH: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN; - common_menu.text_back = BACK_TEXT_EN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_EN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_EN; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN; + common_menu.text_back = BACK_TEXT_EN; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_EN; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_EN; + common_menu.print_special_title = PRINTING_OTHER_LANGUGE; + common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; // - main_menu.title = TITLE_READYPRINT_EN; - main_menu.preheat = PREHEAT_TEXT_EN; - main_menu.move = MOVE_TEXT_EN; - main_menu.home = HOME_TEXT_EN; - main_menu.print = PRINT_TEXT_EN; - main_menu.extrude = EXTRUDE_TEXT_EN; - main_menu.leveling = LEVELING_TEXT_EN; + main_menu.title = TITLE_READYPRINT_EN; + main_menu.preheat = PREHEAT_TEXT_EN; + main_menu.move = MOVE_TEXT_EN; + main_menu.home = HOME_TEXT_EN; + main_menu.print = PRINT_TEXT_EN; + main_menu.extrude = EXTRUDE_TEXT_EN; + main_menu.leveling = LEVELING_TEXT_EN; main_menu.autoleveling = AUTO_LEVELING_TEXT_EN; - main_menu.fan = FAN_TEXT_EN; - main_menu.set = SET_TEXT_EN; - main_menu.more = MORE_TEXT_EN; - main_menu.tool = TOOL_TEXT_EN; - //TOOL - tool_menu.title = TOOL_TEXT_EN; - tool_menu.preheat = TOOL_PREHEAT_EN; - tool_menu.extrude = TOOL_EXTRUDE_EN; - tool_menu.move = TOOL_MOVE_EN; - tool_menu.home = TOOL_HOME_EN; - tool_menu.leveling = TOOL_LEVELING_EN; + main_menu.fan = FAN_TEXT_EN; + main_menu.set = SET_TEXT_EN; + main_menu.more = MORE_TEXT_EN; + main_menu.tool = TOOL_TEXT_EN; + // TOOL + tool_menu.title = TOOL_TEXT_EN; + tool_menu.preheat = TOOL_PREHEAT_EN; + tool_menu.extrude = TOOL_EXTRUDE_EN; + tool_menu.move = TOOL_MOVE_EN; + tool_menu.home = TOOL_HOME_EN; + tool_menu.leveling = TOOL_LEVELING_EN; tool_menu.autoleveling = TOOL_AUTO_LEVELING_EN; - tool_menu.filament = TOOL_FILAMENT_EN; - tool_menu.more = TOOL_MORE_EN; + tool_menu.filament = TOOL_FILAMENT_EN; + tool_menu.more = TOOL_MORE_EN; // preheat_menu.adjust_title = TITLE_ADJUST_EN; - preheat_menu.title = TITLE_PREHEAT_EN; - preheat_menu.add = ADD_TEXT_EN; - preheat_menu.dec = DEC_TEXT_EN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_EN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_EN; - preheat_menu.hotbed = HEATBED_TEXT_EN; - preheat_menu.off = CLOSE_TEXT_EN; + preheat_menu.title = TITLE_PREHEAT_EN; + preheat_menu.add = ADD_TEXT_EN; + preheat_menu.dec = DEC_TEXT_EN; + preheat_menu.ext1 = EXTRUDER_1_TEXT_EN; + preheat_menu.ext2 = EXTRUDER_2_TEXT_EN; + preheat_menu.hotbed = HEATBED_TEXT_EN; + preheat_menu.off = CLOSE_TEXT_EN; // move_menu.title = TITLE_MOVE_EN; // - home_menu.title = TITLE_HOME_EN; + home_menu.title = TITLE_HOME_EN; home_menu.stopmove = HOME_STOPMOVE_EN; // - file_menu.title = TITLE_CHOOSEFILE_EN; - file_menu.page_up = PAGE_UP_TEXT_EN; - file_menu.page_down = PAGE_DOWN_TEXT_EN; - file_menu.file_loading = FILE_LOADING_EN; - file_menu.no_file = NO_FILE_EN; - file_menu.no_file_and_check = NO_FILE_EN;//NO_FILE_AND_CHECK_EN; - // - extrude_menu.title = TITLE_EXTRUDE_EN; - extrude_menu.in = EXTRUDER_IN_TEXT_EN; - extrude_menu.out = EXTRUDER_OUT_TEXT_EN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_EN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_EN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_EN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_EN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_EN; + file_menu.title = TITLE_CHOOSEFILE_EN; + file_menu.page_up = PAGE_UP_TEXT_EN; + file_menu.page_down = PAGE_DOWN_TEXT_EN; + file_menu.file_loading = FILE_LOADING_EN; + file_menu.no_file = NO_FILE_EN; + file_menu.no_file_and_check = NO_FILE_EN;// NO_FILE_AND_CHECK_EN; + // + extrude_menu.title = TITLE_EXTRUDE_EN; + extrude_menu.in = EXTRUDER_IN_TEXT_EN; + extrude_menu.out = EXTRUDER_OUT_TEXT_EN; + extrude_menu.ext1 = EXTRUDER_1_TEXT_EN; + extrude_menu.ext2 = EXTRUDER_2_TEXT_EN; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_EN; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_EN; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_EN; extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_EN; // - leveling_menu.title = TITLE_LEVELING_EN; + leveling_menu.title = TITLE_LEVELING_EN; leveling_menu.position1 = LEVELING_POINT1_TEXT_EN; leveling_menu.position2 = LEVELING_POINT2_TEXT_EN; leveling_menu.position3 = LEVELING_POINT3_TEXT_EN; leveling_menu.position4 = LEVELING_POINT4_TEXT_EN; leveling_menu.position5 = LEVELING_POINT5_TEXT_EN; // - set_menu.title = TITLE_SET_EN; - set_menu.filesys = FILESYS_TEXT_EN; - set_menu.wifi = WIFI_TEXT_EN; - set_menu.about = ABOUT_TEXT_EN; - set_menu.fan = FAN_TEXT_EN; - set_menu.filament = FILAMENT_TEXT_EN; - set_menu.breakpoint = BREAK_POINT_TEXT_EN; - set_menu.motoroff = MOTOR_OFF_TEXT_EN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_EN; - set_menu.language = LANGUAGE_TEXT_EN; - set_menu.shutdown = SHUTDOWN_TEXT_EN; - //set_menu.machine_para = MACHINE_PARA_EN; - // - more_menu.title = TITLE_MORE_EN; - more_menu.zoffset = ZOFFSET_EN; - // - filesys_menu.title = TITLE_FILESYS_EN; - filesys_menu.sd_sys = SD_CARD_TEXT_EN; + set_menu.title = TITLE_SET_EN; + set_menu.filesys = FILESYS_TEXT_EN; + set_menu.wifi = WIFI_TEXT_EN; + set_menu.about = ABOUT_TEXT_EN; + set_menu.fan = FAN_TEXT_EN; + set_menu.filament = FILAMENT_TEXT_EN; + set_menu.breakpoint = BREAK_POINT_TEXT_EN; + set_menu.motoroff = MOTOR_OFF_TEXT_EN; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_EN; + set_menu.language = LANGUAGE_TEXT_EN; + set_menu.shutdown = SHUTDOWN_TEXT_EN; + set_menu.machine_para = MACHINE_PARA_EN; + set_menu.eepromSet = EEPROM_SETTINGS_EN; + more_menu.title = TITLE_MORE_EN; + more_menu.zoffset = ZOFFSET_EN; + // + filesys_menu.title = TITLE_FILESYS_EN; + filesys_menu.sd_sys = SD_CARD_TEXT_EN; filesys_menu.usb_sys = U_DISK_TEXT_EN; - //WIFI + // WIFI wifi_menu.title = WIFI_TEXT; - //wifi_menu.key = WIFI_KEY_TEXT_EN; - //wifi_menu.ip = WIFI_IP_TEXT_EN; - //wifi_menu.state = WIFI_STA_TEXT_EN; - wifi_menu.cloud = CLOUD_TEXT_EN; + // wifi_menu.key = WIFI_KEY_TEXT_EN; + // wifi_menu.ip = WIFI_IP_TEXT_EN; + // wifi_menu.state = WIFI_STA_TEXT_EN; + wifi_menu.cloud = CLOUD_TEXT_EN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; - cloud_menu.title = TITLE_CLOUD_TEXT_EN; - cloud_menu.bind = CLOUD_BINDED_EN; - cloud_menu.binded = CLOUD_BINDED_EN; - cloud_menu.unbind = CLOUD_UNBIND_EN; - cloud_menu.unbinding = CLOUD_UNBINDED_EN; + cloud_menu.title = TITLE_CLOUD_TEXT_EN; + cloud_menu.bind = CLOUD_BINDED_EN; + cloud_menu.binded = CLOUD_BINDED_EN; + cloud_menu.unbind = CLOUD_UNBIND_EN; + cloud_menu.unbinding = CLOUD_UNBINDED_EN; cloud_menu.disconnected = CLOUD_DISCONNECTED_EN; - cloud_menu.disable = CLOUD_DISABLE_EN; + cloud_menu.disable = CLOUD_DISABLE_EN; // - about_menu.title = TITLE_ABOUT_EN; - about_menu.type = ABOUT_TYPE_TEXT_EN; + about_menu.title = TITLE_ABOUT_EN; + about_menu.type = ABOUT_TYPE_TEXT_EN; about_menu.version = ABOUT_VERSION_TEXT_EN; - about_menu.wifi = ABOUT_WIFI_TEXT_EN; + about_menu.wifi = ABOUT_WIFI_TEXT_EN; // fan_menu.title = TITLE_FAN_EN; - fan_menu.add = FAN_ADD_TEXT_EN; - fan_menu.dec = FAN_DEC_TEXT_EN; + fan_menu.add = FAN_ADD_TEXT_EN; + fan_menu.dec = FAN_DEC_TEXT_EN; fan_menu.state = FAN_TIPS1_TEXT_EN; // - filament_menu.title = TITLE_FILAMENT_EN; - filament_menu.in = FILAMENT_IN_TEXT_EN; - filament_menu.out = FILAMENT_OUT_TEXT_EN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_EN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_EN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_EN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_EN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN; + filament_menu.title = TITLE_FILAMENT_EN; + filament_menu.in = FILAMENT_IN_TEXT_EN; + filament_menu.out = FILAMENT_OUT_TEXT_EN; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_EN; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_EN; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_EN; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_EN; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN; filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_EN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_EN; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN; // language_menu.title = TITLE_LANGUAGE_EN; - language_menu.next = PAGE_DOWN_TEXT_EN; - language_menu.up = PAGE_UP_TEXT_EN; + language_menu.next = PAGE_DOWN_TEXT_EN; + language_menu.up = PAGE_UP_TEXT_EN; // - printing_menu.title = TITLE_PRINTING_EN; + printing_menu.title = TITLE_PRINTING_EN; printing_menu.option = PRINTING_OPERATION_EN; - printing_menu.stop = PRINTING_STOP_EN; - printing_menu.pause = PRINTING_PAUSE_EN; + printing_menu.stop = PRINTING_STOP_EN; + printing_menu.pause = PRINTING_PAUSE_EN; printing_menu.resume = PRINTING_RESUME_EN; // - operation_menu.title = TITLE_OPERATION_EN; - operation_menu.pause = PRINTING_PAUSE_EN; - operation_menu.stop = PRINTING_STOP_EN; - operation_menu.temp = PRINTING_TEMP_EN; - operation_menu.fan = FAN_TEXT_EN; - operation_menu.extr = PRINTING_EXTRUDER_EN; - operation_menu.speed = PRINTING_CHANGESPEED_EN; - operation_menu.filament = FILAMENT_TEXT_EN; - operation_menu.more = PRINTING_MORE_EN; - operation_menu.move = PRINTING_MOVE_EN; - operation_menu.auto_off = AUTO_SHUTDOWN_EN; + operation_menu.title = TITLE_OPERATION_EN; + operation_menu.pause = PRINTING_PAUSE_EN; + operation_menu.stop = PRINTING_STOP_EN; + operation_menu.temp = PRINTING_TEMP_EN; + operation_menu.fan = FAN_TEXT_EN; + operation_menu.extr = PRINTING_EXTRUDER_EN; + operation_menu.speed = PRINTING_CHANGESPEED_EN; + operation_menu.filament = FILAMENT_TEXT_EN; + operation_menu.more = PRINTING_MORE_EN; + operation_menu.move = PRINTING_MOVE_EN; + operation_menu.auto_off = AUTO_SHUTDOWN_EN; operation_menu.manual_off = MANUAL_SHUTDOWN_EN; // - pause_menu.title = TITLE_PAUSE_EN; - pause_menu.resume = PRINTING_RESUME_EN; - pause_menu.stop = PRINTING_STOP_EN; - pause_menu.extrude = PRINTING_EXTRUDER_EN; - pause_menu.move = PRINTING_MOVE_EN; + pause_menu.title = TITLE_PAUSE_EN; + pause_menu.resume = PRINTING_RESUME_EN; + pause_menu.stop = PRINTING_STOP_EN; + pause_menu.extrude = PRINTING_EXTRUDER_EN; + pause_menu.move = PRINTING_MOVE_EN; pause_menu.filament = FILAMENT_TEXT_EN; - pause_menu.more = PRINTING_MORE_EN; + pause_menu.more = PRINTING_MORE_EN; // - speed_menu.title = TITLE_CHANGESPEED_EN; - speed_menu.add = ADD_TEXT_EN; - speed_menu.dec = DEC_TEXT_EN; - speed_menu.move = MOVE_SPEED_EN; - speed_menu.extrude = EXTRUDER_SPEED_EN; + speed_menu.title = TITLE_CHANGESPEED_EN; + speed_menu.add = ADD_TEXT_EN; + speed_menu.dec = DEC_TEXT_EN; + speed_menu.move = MOVE_SPEED_EN; + speed_menu.extrude = EXTRUDER_SPEED_EN; speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_EN; - speed_menu.move_speed = MOVE_SPEED_STATE_EN; + speed_menu.move_speed = MOVE_SPEED_STATE_EN; // - printing_more_menu.title = TITLE_MORE_EN; - printing_more_menu.fan = FAN_TEXT_EN; + printing_more_menu.title = TITLE_MORE_EN; + printing_more_menu.fan = FAN_TEXT_EN; printing_more_menu.auto_close = AUTO_SHUTDOWN_EN; - printing_more_menu.manual = MANUAL_SHUTDOWN_EN; - printing_more_menu.speed = PRINTING_CHANGESPEED_EN; - printing_more_menu.temp = PRINTING_TEMP_EN; - - //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_EN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN; - print_file_dialog_menu.retry = DIALOG_RETRY_EN; - print_file_dialog_menu.stop = DIALOG_STOP_EN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN; + printing_more_menu.manual = MANUAL_SHUTDOWN_EN; + printing_more_menu.speed = PRINTING_CHANGESPEED_EN; + printing_more_menu.temp = PRINTING_TEMP_EN; + + // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN; + print_file_dialog_menu.cancle = DIALOG_CANCLE_EN; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN; + print_file_dialog_menu.retry = DIALOG_RETRY_EN; + print_file_dialog_menu.stop = DIALOG_STOP_EN; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN; print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_EN; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_EN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_EN; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_EN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_EN; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN; - //ZOFFSET + print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_EN; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_EN; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_EN; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN; + print_file_dialog_menu.reprint = DIALOG_REPRINT_EN; + print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN; + // ZOFFSET zoffset_menu.title = TITLE_ZOFFSET_EN; - zoffset_menu.inc = ZOFFSET_INC_EN; - zoffset_menu.dec = ZOFFSET_DEC_EN; - - pause_msg_menu.pausing = MESSEGE_PAUSING_EN; - pause_msg_menu.changing = MESSEGE_CHANGING_EN; - pause_msg_menu.unload = MESSEGE_UNLOAD_EN; - pause_msg_menu.waiting = MESSEGE_WAITING_EN; - pause_msg_menu.insert = MESSEGE_INSERT_EN; - pause_msg_menu.load = MESSEGE_LOAD_EN; - pause_msg_menu.purge = MESSEGE_PURGE_EN; - pause_msg_menu.resume = MESSEGE_RESUME_EN; - pause_msg_menu.heat = MESSEGE_HEAT_EN; - pause_msg_menu.heating = MESSEGE_HEATING_EN; - pause_msg_menu.option = MESSEGE_OPTION_EN; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_EN; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_EN; + zoffset_menu.inc = ZOFFSET_INC_EN; + zoffset_menu.dec = ZOFFSET_DEC_EN; + + pause_msg_menu.pausing = MESSAGE_PAUSING_EN; + pause_msg_menu.changing = MESSAGE_CHANGING_EN; + pause_msg_menu.unload = MESSAGE_UNLOAD_EN; + pause_msg_menu.waiting = MESSAGE_WAITING_EN; + pause_msg_menu.insert = MESSAGE_INSERT_EN; + pause_msg_menu.load = MESSAGE_LOAD_EN; + pause_msg_menu.purge = MESSAGE_PURGE_EN; + pause_msg_menu.resume = MESSAGE_RESUME_EN; + pause_msg_menu.heat = MESSAGE_HEAT_EN; + pause_msg_menu.heating = MESSAGE_HEATING_EN; + pause_msg_menu.option = MESSAGE_OPTION_EN; + pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_EN; + pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_EN; + eeprom_menu.title = EEPROM_SETTINGS_TITLE_EN; + eeprom_menu.store = EEPROM_SETTINGS_STORE_EN; + eeprom_menu.read = EEPROM_SETTINGS_READ_EN; + eeprom_menu.revert = EEPROM_SETTINGS_REVERT_EN; + eeprom_menu.storeTips = EEPROM_STORE_TIPS_EN; + eeprom_menu.readTips = EEPROM_READ_TIPS_EN; + eeprom_menu.revertTips = EEPROM_REVERT_TIPS_EN; break; case LANG_RUSSIAN: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_RU; - common_menu.text_back = BACK_TEXT_RU; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_RU; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_RU; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_RU; + common_menu.text_back = BACK_TEXT_RU; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_RU; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_RU; + common_menu.print_special_title = PRINTING_OTHER_LANGUGE; + common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; // - main_menu.title = TITLE_READYPRINT_RU; - main_menu.preheat = PREHEAT_TEXT_RU; - main_menu.move = MOVE_TEXT_RU; - main_menu.home = HOME_TEXT_RU; - main_menu.print = PRINT_TEXT_RU; - main_menu.extrude = EXTRUDE_TEXT_RU; - main_menu.leveling = LEVELING_TEXT_RU; + main_menu.title = TITLE_READYPRINT_RU; + main_menu.preheat = PREHEAT_TEXT_RU; + main_menu.move = MOVE_TEXT_RU; + main_menu.home = HOME_TEXT_RU; + main_menu.print = PRINT_TEXT_RU; + main_menu.extrude = EXTRUDE_TEXT_RU; + main_menu.leveling = LEVELING_TEXT_RU; main_menu.autoleveling = AUTO_LEVELING_TEXT_RU; - main_menu.fan = FAN_TEXT_RU; - main_menu.set = SET_TEXT_RU; - main_menu.more = MORE_TEXT_RU; - main_menu.tool = TOOL_TEXT_RU; - //TOOL - tool_menu.title = TOOL_TEXT_RU; - tool_menu.preheat = TOOL_PREHEAT_RU; - tool_menu.extrude = TOOL_EXTRUDE_RU; - tool_menu.move = TOOL_MOVE_RU; - tool_menu.home = TOOL_HOME_RU; - tool_menu.leveling = TOOL_LEVELING_RU; + main_menu.fan = FAN_TEXT_RU; + main_menu.set = SET_TEXT_RU; + main_menu.more = MORE_TEXT_RU; + main_menu.tool = TOOL_TEXT_RU; + // TOOL + tool_menu.title = TOOL_TEXT_RU; + tool_menu.preheat = TOOL_PREHEAT_RU; + tool_menu.extrude = TOOL_EXTRUDE_RU; + tool_menu.move = TOOL_MOVE_RU; + tool_menu.home = TOOL_HOME_RU; + tool_menu.leveling = TOOL_LEVELING_RU; tool_menu.autoleveling = TOOL_AUTO_LEVELING_RU; - tool_menu.filament = TOOL_FILAMENT_RU; - tool_menu.more = TOOL_MORE_RU; + tool_menu.filament = TOOL_FILAMENT_RU; + tool_menu.more = TOOL_MORE_RU; // preheat_menu.adjust_title = TITLE_ADJUST_RU; - preheat_menu.title = TITLE_PREHEAT_RU; - preheat_menu.add = ADD_TEXT_RU; - preheat_menu.dec = DEC_TEXT_RU; - preheat_menu.ext1 = EXTRUDER_1_TEXT_RU; - preheat_menu.ext2 = EXTRUDER_2_TEXT_RU; - preheat_menu.hotbed = HEATBED_TEXT_RU; - preheat_menu.off = CLOSE_TEXT_RU; + preheat_menu.title = TITLE_PREHEAT_RU; + preheat_menu.add = ADD_TEXT_RU; + preheat_menu.dec = DEC_TEXT_RU; + preheat_menu.ext1 = EXTRUDER_1_TEXT_RU; + preheat_menu.ext2 = EXTRUDER_2_TEXT_RU; + preheat_menu.hotbed = HEATBED_TEXT_RU; + preheat_menu.off = CLOSE_TEXT_RU; // move_menu.title = MOVE_TEXT_RU; // - home_menu.title = TITLE_HOME_RU; + home_menu.title = TITLE_HOME_RU; home_menu.stopmove = HOME_STOPMOVE_RU; // - file_menu.title = TITLE_CHOOSEFILE_RU; - file_menu.page_up = PAGE_UP_TEXT_RU; - file_menu.page_down = PAGE_DOWN_TEXT_RU; - file_menu.file_loading = FILE_LOADING_RU; - file_menu.no_file = NO_FILE_RU; - file_menu.no_file_and_check = NO_FILE_RU;//NO_FILE_AND_CHECK_RU; - // - extrude_menu.title = TITLE_EXTRUDE_RU; - extrude_menu.in = EXTRUDER_IN_TEXT_RU; - extrude_menu.out = EXTRUDER_OUT_TEXT_RU; - extrude_menu.ext1 = EXTRUDER_1_TEXT_RU; - extrude_menu.ext2 = EXTRUDER_2_TEXT_RU; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_RU; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_RU; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_RU; + file_menu.title = TITLE_CHOOSEFILE_RU; + file_menu.page_up = PAGE_UP_TEXT_RU; + file_menu.page_down = PAGE_DOWN_TEXT_RU; + file_menu.file_loading = FILE_LOADING_RU; + file_menu.no_file = NO_FILE_RU; + file_menu.no_file_and_check = NO_FILE_RU;// NO_FILE_AND_CHECK_RU; + // + extrude_menu.title = TITLE_EXTRUDE_RU; + extrude_menu.in = EXTRUDER_IN_TEXT_RU; + extrude_menu.out = EXTRUDER_OUT_TEXT_RU; + extrude_menu.ext1 = EXTRUDER_1_TEXT_RU; + extrude_menu.ext2 = EXTRUDER_2_TEXT_RU; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_RU; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_RU; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_RU; extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_RU; // - leveling_menu.title = TITLE_LEVELING_RU; + leveling_menu.title = TITLE_LEVELING_RU; leveling_menu.position1 = LEVELING_POINT1_TEXT_RU; leveling_menu.position2 = LEVELING_POINT2_TEXT_RU; leveling_menu.position3 = LEVELING_POINT3_TEXT_RU; leveling_menu.position4 = LEVELING_POINT4_TEXT_RU; leveling_menu.position5 = LEVELING_POINT5_TEXT_RU; // - set_menu.title = TITLE_SET_RU; - set_menu.filesys = FILESYS_TEXT_RU; - set_menu.wifi = WIFI_TEXT_RU; - set_menu.about = ABOUT_TEXT_RU; - set_menu.fan = FAN_TEXT_RU; - set_menu.filament = FILAMENT_TEXT_RU; - set_menu.breakpoint = BREAK_POINT_TEXT_RU; - set_menu.motoroff = MOTOR_OFF_TEXT_RU; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_RU; - set_menu.language = LANGUAGE_TEXT_RU; - set_menu.shutdown = SHUTDOWN_TEXT_RU; - // - more_menu.title = TITLE_MORE_RU; - more_menu.zoffset = ZOFFSET_RU; - // - filesys_menu.title = TITLE_FILESYS_RU; - filesys_menu.sd_sys = SD_CARD_TEXT_RU; + set_menu.title = TITLE_SET_RU; + set_menu.filesys = FILESYS_TEXT_RU; + set_menu.wifi = WIFI_TEXT_RU; + set_menu.about = ABOUT_TEXT_RU; + set_menu.fan = FAN_TEXT_RU; + set_menu.filament = FILAMENT_TEXT_RU; + set_menu.breakpoint = BREAK_POINT_TEXT_RU; + set_menu.motoroff = MOTOR_OFF_TEXT_RU; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_RU; + set_menu.language = LANGUAGE_TEXT_RU; + set_menu.shutdown = SHUTDOWN_TEXT_RU; + set_menu.machine_para = MACHINE_PARA_RU; + set_menu.eepromSet = EEPROM_SETTINGS_RU; + more_menu.title = TITLE_MORE_RU; + more_menu.zoffset = ZOFFSET_RU; + // + filesys_menu.title = TITLE_FILESYS_RU; + filesys_menu.sd_sys = SD_CARD_TEXT_RU; filesys_menu.usb_sys = U_DISK_TEXT_RU; - //WIFI + // WIFI wifi_menu.title = WIFI_TEXT; - //wifi_menu.key = WIFI_KEY_TEXT_RU; - //wifi_menu.ip = WIFI_IP_TEXT_RU; - //wifi_menu.state = WIFI_STA_TEXT_RU; - wifi_menu.cloud = CLOUD_TEXT_RU; + // wifi_menu.key = WIFI_KEY_TEXT_RU; + // wifi_menu.ip = WIFI_IP_TEXT_RU; + // wifi_menu.state = WIFI_STA_TEXT_RU; + wifi_menu.cloud = CLOUD_TEXT_RU; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_RU; - cloud_menu.title = TITLE_CLOUD_TEXT_RU; - cloud_menu.bind = CLOUD_BINDED_RU; - cloud_menu.binded = CLOUD_BINDED_RU; - cloud_menu.unbind = CLOUD_UNBIND_RU; - cloud_menu.unbinding = CLOUD_UNBINDED_RU; + cloud_menu.title = TITLE_CLOUD_TEXT_RU; + cloud_menu.bind = CLOUD_BINDED_RU; + cloud_menu.binded = CLOUD_BINDED_RU; + cloud_menu.unbind = CLOUD_UNBIND_RU; + cloud_menu.unbinding = CLOUD_UNBINDED_RU; cloud_menu.disconnected = CLOUD_DISCONNECTED_RU; - cloud_menu.disable = CLOUD_DISABLE_RU; + cloud_menu.disable = CLOUD_DISABLE_RU; // - about_menu.title = ABOUT_TEXT_RU; - about_menu.type = ABOUT_TYPE_TEXT_RU; + about_menu.title = ABOUT_TEXT_RU; + about_menu.type = ABOUT_TYPE_TEXT_RU; about_menu.version = ABOUT_VERSION_TEXT_RU; - about_menu.wifi = ABOUT_WIFI_TEXT_RU; + about_menu.wifi = ABOUT_WIFI_TEXT_RU; // fan_menu.title = FAN_TEXT_RU; - fan_menu.add = FAN_ADD_TEXT_RU; - fan_menu.dec = FAN_DEC_TEXT_RU; + fan_menu.add = FAN_ADD_TEXT_RU; + fan_menu.dec = FAN_DEC_TEXT_RU; fan_menu.state = FAN_TIPS1_TEXT_RU; // - filament_menu.title = TITLE_FILAMENT_RU; - filament_menu.in = FILAMENT_IN_TEXT_RU; - filament_menu.out = FILAMENT_OUT_TEXT_RU; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_RU; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_RU; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_RU; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_RU; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU; + filament_menu.title = TITLE_FILAMENT_RU; + filament_menu.in = FILAMENT_IN_TEXT_RU; + filament_menu.out = FILAMENT_OUT_TEXT_RU; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_RU; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_RU; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_RU; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_RU; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU; filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_RU; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_RU; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU; // language_menu.title = LANGUAGE_TEXT_RU; - language_menu.next = PAGE_DOWN_TEXT_RU; - language_menu.up = PAGE_UP_TEXT_RU; + language_menu.next = PAGE_DOWN_TEXT_RU; + language_menu.up = PAGE_UP_TEXT_RU; // - printing_menu.title = TITLE_PRINTING_RU; + printing_menu.title = TITLE_PRINTING_RU; printing_menu.option = PRINTING_OPERATION_RU; - printing_menu.stop = PRINTING_STOP_RU; - printing_menu.pause = PRINTING_PAUSE_RU; + printing_menu.stop = PRINTING_STOP_RU; + printing_menu.pause = PRINTING_PAUSE_RU; printing_menu.resume = PRINTING_RESUME_RU; // - operation_menu.title = TITLE_OPERATION_RU; - operation_menu.pause = PRINTING_PAUSE_RU; - operation_menu.stop = PRINTING_STOP_RU; - operation_menu.temp = PRINTING_TEMP_RU; - operation_menu.fan = FAN_TEXT_RU; - operation_menu.extr = PRINTING_EXTRUDER_RU; - operation_menu.speed = PRINTING_CHANGESPEED_RU; - operation_menu.filament = FILAMENT_TEXT_RU; - operation_menu.more = PRINTING_MORE_RU; - operation_menu.move = PRINTING_MOVE_RU; - operation_menu.auto_off = AUTO_SHUTDOWN_RU; + operation_menu.title = TITLE_OPERATION_RU; + operation_menu.pause = PRINTING_PAUSE_RU; + operation_menu.stop = PRINTING_STOP_RU; + operation_menu.temp = PRINTING_TEMP_RU; + operation_menu.fan = FAN_TEXT_RU; + operation_menu.extr = PRINTING_EXTRUDER_RU; + operation_menu.speed = PRINTING_CHANGESPEED_RU; + operation_menu.filament = FILAMENT_TEXT_RU; + operation_menu.more = PRINTING_MORE_RU; + operation_menu.move = PRINTING_MOVE_RU; + operation_menu.auto_off = AUTO_SHUTDOWN_RU; operation_menu.manual_off = MANUAL_SHUTDOWN_RU; // - pause_menu.title = TITLE_PAUSE_RU; - pause_menu.resume = PRINTING_RESUME_RU; - pause_menu.stop = PRINTING_STOP_RU; - pause_menu.extrude = PRINTING_EXTRUDER_RU; - pause_menu.move = PRINTING_MOVE_RU; + pause_menu.title = TITLE_PAUSE_RU; + pause_menu.resume = PRINTING_RESUME_RU; + pause_menu.stop = PRINTING_STOP_RU; + pause_menu.extrude = PRINTING_EXTRUDER_RU; + pause_menu.move = PRINTING_MOVE_RU; pause_menu.filament = FILAMENT_TEXT_RU; - pause_menu.more = PRINTING_MORE_RU; + pause_menu.more = PRINTING_MORE_RU; // - speed_menu.title = PRINTING_CHANGESPEED_RU; - speed_menu.add = ADD_TEXT_RU; - speed_menu.dec = DEC_TEXT_RU; - speed_menu.move = MOVE_SPEED_RU; - speed_menu.extrude = EXTRUDER_SPEED_RU; + speed_menu.title = PRINTING_CHANGESPEED_RU; + speed_menu.add = ADD_TEXT_RU; + speed_menu.dec = DEC_TEXT_RU; + speed_menu.move = MOVE_SPEED_RU; + speed_menu.extrude = EXTRUDER_SPEED_RU; speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_RU; - speed_menu.move_speed = MOVE_SPEED_STATE_RU; + speed_menu.move_speed = MOVE_SPEED_STATE_RU; // - printing_more_menu.title = TITLE_MORE_RU; - printing_more_menu.fan = FAN_TEXT_RU; + printing_more_menu.title = TITLE_MORE_RU; + printing_more_menu.fan = FAN_TEXT_RU; printing_more_menu.auto_close = AUTO_SHUTDOWN_RU; - printing_more_menu.manual = MANUAL_SHUTDOWN_RU; - printing_more_menu.speed = PRINTING_CHANGESPEED_RU; - printing_more_menu.temp = PRINTING_TEMP_RU; - //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_RU; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_RU; - print_file_dialog_menu.cancle = DIALOG_CANCLE_RU; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_RU; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_RU; - print_file_dialog_menu.retry = DIALOG_RETRY_RU; - print_file_dialog_menu.stop = DIALOG_STOP_RU; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_RU; + printing_more_menu.manual = MANUAL_SHUTDOWN_RU; + printing_more_menu.speed = PRINTING_CHANGESPEED_RU; + printing_more_menu.temp = PRINTING_TEMP_RU; + // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_RU; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_RU; + print_file_dialog_menu.cancle = DIALOG_CANCLE_RU; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_RU; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_RU; + print_file_dialog_menu.retry = DIALOG_RETRY_RU; + print_file_dialog_menu.stop = DIALOG_STOP_RU; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_RU; print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_RU; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_RU; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_RU; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_RU; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_RU; - print_file_dialog_menu.reprint = DIALOG_REPRINT_RU; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_RU; - //ZOFFSET + print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_RU; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_RU; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_RU; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_RU; + print_file_dialog_menu.reprint = DIALOG_REPRINT_RU; + print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_RU; + // ZOFFSET zoffset_menu.title = TITLE_ZOFFSET_RU; - zoffset_menu.inc = ZOFFSET_INC_RU; - zoffset_menu.dec = ZOFFSET_DEC_RU; - - pause_msg_menu.pausing = MESSEGE_PAUSING_RU; - pause_msg_menu.changing = MESSEGE_CHANGING_RU; - pause_msg_menu.unload = MESSEGE_UNLOAD_RU; - pause_msg_menu.waiting = MESSEGE_WAITING_RU; - pause_msg_menu.insert = MESSEGE_INSERT_RU; - pause_msg_menu.load = MESSEGE_LOAD_RU; - pause_msg_menu.purge = MESSEGE_PURGE_RU; - pause_msg_menu.resume = MESSEGE_RESUME_RU; - pause_msg_menu.heat = MESSEGE_HEAT_RU; - pause_msg_menu.heating = MESSEGE_HEATING_RU; - pause_msg_menu.option = MESSEGE_OPTION_RU; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_RU; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_RU; + zoffset_menu.inc = ZOFFSET_INC_RU; + zoffset_menu.dec = ZOFFSET_DEC_RU; + + pause_msg_menu.pausing = MESSAGE_PAUSING_RU; + pause_msg_menu.changing = MESSAGE_CHANGING_RU; + pause_msg_menu.unload = MESSAGE_UNLOAD_RU; + pause_msg_menu.waiting = MESSAGE_WAITING_RU; + pause_msg_menu.insert = MESSAGE_INSERT_RU; + pause_msg_menu.load = MESSAGE_LOAD_RU; + pause_msg_menu.purge = MESSAGE_PURGE_RU; + pause_msg_menu.resume = MESSAGE_RESUME_RU; + pause_msg_menu.heat = MESSAGE_HEAT_RU; + pause_msg_menu.heating = MESSAGE_HEATING_RU; + pause_msg_menu.option = MESSAGE_OPTION_RU; + pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_RU; + pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_RU; + eeprom_menu.title = EEPROM_SETTINGS_TITLE_RU; + eeprom_menu.store = EEPROM_SETTINGS_STORE_RU; + eeprom_menu.read = EEPROM_SETTINGS_READ_RU; + eeprom_menu.revert = EEPROM_SETTINGS_REVERT_RU; + eeprom_menu.storeTips = EEPROM_STORE_TIPS_RU; + eeprom_menu.readTips = EEPROM_READ_TIPS_RU; + eeprom_menu.revertTips = EEPROM_REVERT_TIPS_RU; break; case LANG_SPANISH: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_SP; - common_menu.text_back = BACK_TEXT_SP; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_SP; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_SP; - common_menu.print_special_title = PRINTING_SP; - common_menu.pause_special_title = PRINTING_PAUSAR_SP; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_SP; + common_menu.text_back = BACK_TEXT_SP; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_SP; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_SP; + common_menu.print_special_title = PRINTING_SP; + common_menu.pause_special_title = PRINTING_PAUSAR_SP; common_menu.operate_special_title = PRINTING_AJUSTES_SP; // - main_menu.title = TITLE_READYPRINT_SP; - main_menu.preheat = PREHEAT_TEXT_SP; - main_menu.move = MOVE_TEXT_SP; - main_menu.home = HOME_TEXT_SP; - main_menu.print = PRINT_TEXT_SP; - main_menu.extrude = EXTRUDE_TEXT_SP; - main_menu.leveling = LEVELING_TEXT_SP; + main_menu.title = TITLE_READYPRINT_SP; + main_menu.preheat = PREHEAT_TEXT_SP; + main_menu.move = MOVE_TEXT_SP; + main_menu.home = HOME_TEXT_SP; + main_menu.print = PRINT_TEXT_SP; + main_menu.extrude = EXTRUDE_TEXT_SP; + main_menu.leveling = LEVELING_TEXT_SP; main_menu.autoleveling = AUTO_LEVELING_TEXT_SP; - main_menu.fan = FAN_TEXT_SP; - main_menu.set = SET_TEXT_SP; - main_menu.more = MORE_TEXT_SP; - main_menu.tool = TOOL_TEXT_SP; - //TOOL - tool_menu.title = TOOL_TEXT_SP; - tool_menu.preheat = TOOL_PREHEAT_SP; - tool_menu.extrude = TOOL_EXTRUDE_SP; - tool_menu.move = TOOL_MOVE_SP; - tool_menu.home = TOOL_HOME_SP; - tool_menu.leveling = TOOL_LEVELING_SP; + main_menu.fan = FAN_TEXT_SP; + main_menu.set = SET_TEXT_SP; + main_menu.more = MORE_TEXT_SP; + main_menu.tool = TOOL_TEXT_SP; + // TOOL + tool_menu.title = TOOL_TEXT_SP; + tool_menu.preheat = TOOL_PREHEAT_SP; + tool_menu.extrude = TOOL_EXTRUDE_SP; + tool_menu.move = TOOL_MOVE_SP; + tool_menu.home = TOOL_HOME_SP; + tool_menu.leveling = TOOL_LEVELING_SP; tool_menu.autoleveling = TOOL_AUTO_LEVELING_SP; - tool_menu.filament = TOOL_FILAMENT_SP; - tool_menu.more = TOOL_MORE_SP; + tool_menu.filament = TOOL_FILAMENT_SP; + tool_menu.more = TOOL_MORE_SP; // preheat_menu.adjust_title = TITLE_ADJUST_SP; - preheat_menu.title = TITLE_PREHEAT_SP; - preheat_menu.add = ADD_TEXT_SP; - preheat_menu.dec = DEC_TEXT_SP; - preheat_menu.ext1 = EXTRUDER_1_TEXT_SP; - preheat_menu.ext2 = EXTRUDER_2_TEXT_SP; - preheat_menu.hotbed = HEATBED_TEXT_SP; - preheat_menu.off = CLOSE_TEXT_SP; + preheat_menu.title = TITLE_PREHEAT_SP; + preheat_menu.add = ADD_TEXT_SP; + preheat_menu.dec = DEC_TEXT_SP; + preheat_menu.ext1 = EXTRUDER_1_TEXT_SP; + preheat_menu.ext2 = EXTRUDER_2_TEXT_SP; + preheat_menu.hotbed = HEATBED_TEXT_SP; + preheat_menu.off = CLOSE_TEXT_SP; // move_menu.title = MOVE_TEXT_SP; // - home_menu.title = TITLE_HOME_SP; - home_menu.home_x = HOME_X_TEXT_SP; - home_menu.home_y = HOME_Y_TEXT_SP; - home_menu.home_z = HOME_Z_TEXT_SP; + home_menu.title = TITLE_HOME_SP; + home_menu.home_x = HOME_X_TEXT_SP; + home_menu.home_y = HOME_Y_TEXT_SP; + home_menu.home_z = HOME_Z_TEXT_SP; home_menu.home_all = HOME_ALL_TEXT_SP; home_menu.stopmove = HOME_STOPMOVE_SP; // - file_menu.title = TITLE_CHOOSEFILE_SP; - file_menu.page_up = PAGE_UP_TEXT_SP; - file_menu.page_down = PAGE_DOWN_TEXT_SP; - file_menu.file_loading = FILE_LOADING_SP; - file_menu.no_file = NO_FILE_SP; - file_menu.no_file_and_check = NO_FILE_SP;//NO_FILE_AND_CHECK_SP; - // - extrude_menu.title = TITLE_EXTRUDE_SP; - extrude_menu.in = EXTRUDER_IN_TEXT_SP; - extrude_menu.out = EXTRUDER_OUT_TEXT_SP; - extrude_menu.ext1 = EXTRUDER_1_TEXT_SP; - extrude_menu.ext2 = EXTRUDER_2_TEXT_SP; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_SP; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_SP; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_SP; + file_menu.title = TITLE_CHOOSEFILE_SP; + file_menu.page_up = PAGE_UP_TEXT_SP; + file_menu.page_down = PAGE_DOWN_TEXT_SP; + file_menu.file_loading = FILE_LOADING_SP; + file_menu.no_file = NO_FILE_SP; + file_menu.no_file_and_check = NO_FILE_SP;// NO_FILE_AND_CHECK_SP; + // + extrude_menu.title = TITLE_EXTRUDE_SP; + extrude_menu.in = EXTRUDER_IN_TEXT_SP; + extrude_menu.out = EXTRUDER_OUT_TEXT_SP; + extrude_menu.ext1 = EXTRUDER_1_TEXT_SP; + extrude_menu.ext2 = EXTRUDER_2_TEXT_SP; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_SP; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_SP; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_SP; extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_SP; // - leveling_menu.title = TITLE_LEVELING_SP; + leveling_menu.title = TITLE_LEVELING_SP; leveling_menu.position1 = LEVELING_POINT1_TEXT_SP; leveling_menu.position2 = LEVELING_POINT2_TEXT_SP; leveling_menu.position3 = LEVELING_POINT3_TEXT_SP; leveling_menu.position4 = LEVELING_POINT4_TEXT_SP; leveling_menu.position5 = LEVELING_POINT5_TEXT_SP; // - set_menu.title = TITLE_SET_SP; - set_menu.filesys = FILESYS_TEXT_SP; - set_menu.wifi = WIFI_TEXT_SP; - set_menu.about = ABOUT_TEXT_SP; - set_menu.fan = FAN_TEXT_SP; - set_menu.filament = FILAMENT_TEXT_SP; - set_menu.breakpoint = BREAK_POINT_TEXT_SP; - set_menu.motoroff = MOTOR_OFF_TEXT_SP; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_SP; - set_menu.language = LANGUAGE_TEXT_SP; - set_menu.shutdown = SHUTDOWN_TEXT_SP; - // - more_menu.title = TITLE_MORE_SP; - more_menu.zoffset = ZOFFSET_SP; - // - filesys_menu.title = TITLE_FILESYS_SP; - filesys_menu.sd_sys = SD_CARD_TEXT_SP; + set_menu.title = TITLE_SET_SP; + set_menu.filesys = FILESYS_TEXT_SP; + set_menu.wifi = WIFI_TEXT_SP; + set_menu.about = ABOUT_TEXT_SP; + set_menu.fan = FAN_TEXT_SP; + set_menu.filament = FILAMENT_TEXT_SP; + set_menu.breakpoint = BREAK_POINT_TEXT_SP; + set_menu.motoroff = MOTOR_OFF_TEXT_SP; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_SP; + set_menu.language = LANGUAGE_TEXT_SP; + set_menu.shutdown = SHUTDOWN_TEXT_SP; + set_menu.machine_para = MACHINE_PARA_SP; + set_menu.eepromSet = EEPROM_SETTINGS_SP; + more_menu.title = TITLE_MORE_SP; + more_menu.zoffset = ZOFFSET_SP; + // + filesys_menu.title = TITLE_FILESYS_SP; + filesys_menu.sd_sys = SD_CARD_TEXT_SP; filesys_menu.usb_sys = U_DISK_TEXT_SP; - //WIFI + // WIFI wifi_menu.title = WIFI_TEXT; - //wifi_menu.key = WIFI_KEY_TEXT_SP; - //wifi_menu.ip = WIFI_IP_TEXT_SP; - //wifi_menu.state = WIFI_STA_TEXT_SP; - wifi_menu.cloud = CLOUD_TEXT_SP; + // wifi_menu.key = WIFI_KEY_TEXT_SP; + // wifi_menu.ip = WIFI_IP_TEXT_SP; + // wifi_menu.state = WIFI_STA_TEXT_SP; + wifi_menu.cloud = CLOUD_TEXT_SP; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_SP; - cloud_menu.title = TITLE_CLOUD_TEXT_SP; - cloud_menu.bind = CLOUD_BINDED_SP; - cloud_menu.binded = CLOUD_BINDED_SP; - cloud_menu.unbind = CLOUD_UNBIND_SP; - cloud_menu.unbinding = CLOUD_UNBINDED_SP; + cloud_menu.title = TITLE_CLOUD_TEXT_SP; + cloud_menu.bind = CLOUD_BINDED_SP; + cloud_menu.binded = CLOUD_BINDED_SP; + cloud_menu.unbind = CLOUD_UNBIND_SP; + cloud_menu.unbinding = CLOUD_UNBINDED_SP; cloud_menu.disconnected = CLOUD_DISCONNECTED_SP; - cloud_menu.disable = CLOUD_DISABLE_SP; + cloud_menu.disable = CLOUD_DISABLE_SP; // - about_menu.title = ABOUT_TEXT_SP; - about_menu.type = ABOUT_TYPE_TEXT_SP; + about_menu.title = ABOUT_TEXT_SP; + about_menu.type = ABOUT_TYPE_TEXT_SP; about_menu.version = ABOUT_VERSION_TEXT_SP; - about_menu.wifi = ABOUT_WIFI_TEXT_SP; + about_menu.wifi = ABOUT_WIFI_TEXT_SP; // fan_menu.title = FAN_TEXT_SP; - fan_menu.add = FAN_ADD_TEXT_SP; - fan_menu.dec = FAN_DEC_TEXT_SP; + fan_menu.add = FAN_ADD_TEXT_SP; + fan_menu.dec = FAN_DEC_TEXT_SP; fan_menu.state = FAN_TIPS1_TEXT_SP; // - filament_menu.title = TITLE_FILAMENT_SP; - filament_menu.in = FILAMENT_IN_TEXT_SP; - filament_menu.out = FILAMENT_OUT_TEXT_SP; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_SP; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_SP; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_SP; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_SP; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP; + filament_menu.title = TITLE_FILAMENT_SP; + filament_menu.in = FILAMENT_IN_TEXT_SP; + filament_menu.out = FILAMENT_OUT_TEXT_SP; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_SP; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_SP; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_SP; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_SP; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP; filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_SP; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_SP; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP; // language_menu.title = LANGUAGE_TEXT_SP; - language_menu.next = PAGE_DOWN_TEXT_SP; - language_menu.up = PAGE_UP_TEXT_SP; + language_menu.next = PAGE_DOWN_TEXT_SP; + language_menu.up = PAGE_UP_TEXT_SP; // - printing_menu.title = TITLE_PRINTING_SP; + printing_menu.title = TITLE_PRINTING_SP; printing_menu.option = PRINTING_OPERATION_SP; - printing_menu.stop = PRINTING_STOP_SP; - printing_menu.pause = PRINTING_PAUSE_SP; + printing_menu.stop = PRINTING_STOP_SP; + printing_menu.pause = PRINTING_PAUSE_SP; printing_menu.resume = PRINTING_RESUME_SP; // - operation_menu.title = TITLE_OPERATION_SP; - operation_menu.pause = PRINTING_PAUSE_SP; - operation_menu.stop = PRINTING_STOP_SP; - operation_menu.temp = PRINTING_TEMP_SP; - operation_menu.fan = FAN_TEXT_SP; - operation_menu.extr = PRINTING_EXTRUDER_SP; - operation_menu.speed = PRINTING_CHANGESPEED_SP; - operation_menu.filament = FILAMENT_TEXT_SP; - operation_menu.more = PRINTING_MORE_SP; - operation_menu.move = PRINTING_MOVE_SP; - operation_menu.auto_off = AUTO_SHUTDOWN_SP; + operation_menu.title = TITLE_OPERATION_SP; + operation_menu.pause = PRINTING_PAUSE_SP; + operation_menu.stop = PRINTING_STOP_SP; + operation_menu.temp = PRINTING_TEMP_SP; + operation_menu.fan = FAN_TEXT_SP; + operation_menu.extr = PRINTING_EXTRUDER_SP; + operation_menu.speed = PRINTING_CHANGESPEED_SP; + operation_menu.filament = FILAMENT_TEXT_SP; + operation_menu.more = PRINTING_MORE_SP; + operation_menu.move = PRINTING_MOVE_SP; + operation_menu.auto_off = AUTO_SHUTDOWN_SP; operation_menu.manual_off = MANUAL_SHUTDOWN_SP; // - pause_menu.title = TITLE_PAUSE_RU; - pause_menu.resume = PRINTING_RESUME_SP; - pause_menu.stop = PRINTING_STOP_SP; - pause_menu.extrude = PRINTING_EXTRUDER_SP; - pause_menu.move = PRINTING_MOVE_SP; + pause_menu.title = TITLE_PAUSE_RU; + pause_menu.resume = PRINTING_RESUME_SP; + pause_menu.stop = PRINTING_STOP_SP; + pause_menu.extrude = PRINTING_EXTRUDER_SP; + pause_menu.move = PRINTING_MOVE_SP; pause_menu.filament = FILAMENT_TEXT_SP; - pause_menu.more = PRINTING_MORE_SP; + pause_menu.more = PRINTING_MORE_SP; // - speed_menu.title = PRINTING_CHANGESPEED_SP; - speed_menu.add = ADD_TEXT_SP; - speed_menu.dec = DEC_TEXT_SP; - speed_menu.move = MOVE_SPEED_SP; - speed_menu.extrude = EXTRUDER_SPEED_SP; + speed_menu.title = PRINTING_CHANGESPEED_SP; + speed_menu.add = ADD_TEXT_SP; + speed_menu.dec = DEC_TEXT_SP; + speed_menu.move = MOVE_SPEED_SP; + speed_menu.extrude = EXTRUDER_SPEED_SP; speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_SP; - speed_menu.move_speed = MOVE_SPEED_STATE_SP; + speed_menu.move_speed = MOVE_SPEED_STATE_SP; // - printing_more_menu.title = TITLE_MORE_SP; - printing_more_menu.fan = FAN_TEXT_SP; + printing_more_menu.title = TITLE_MORE_SP; + printing_more_menu.fan = FAN_TEXT_SP; printing_more_menu.auto_close = AUTO_SHUTDOWN_SP; - printing_more_menu.manual = MANUAL_SHUTDOWN_SP; - printing_more_menu.speed = PRINTING_CHANGESPEED_SP; - printing_more_menu.temp = PRINTING_TEMP_SP; - - //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_SP; - print_file_dialog_menu.cancle = DIALOG_CANCLE_SP; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_SP; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_SP; - print_file_dialog_menu.retry = DIALOG_RETRY_SP; - print_file_dialog_menu.stop = DIALOG_STOP_SP; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_SP; + printing_more_menu.manual = MANUAL_SHUTDOWN_SP; + printing_more_menu.speed = PRINTING_CHANGESPEED_SP; + printing_more_menu.temp = PRINTING_TEMP_SP; + + // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_SP; + print_file_dialog_menu.cancle = DIALOG_CANCLE_SP; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_SP; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_SP; + print_file_dialog_menu.retry = DIALOG_RETRY_SP; + print_file_dialog_menu.stop = DIALOG_STOP_SP; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_SP; print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_SP; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_SP; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_SP; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_SP; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_SP; - print_file_dialog_menu.reprint = DIALOG_REPRINT_SP; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_SP; - //ZOFFSET + print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_SP; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_SP; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_SP; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_SP; + print_file_dialog_menu.reprint = DIALOG_REPRINT_SP; + print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_SP; + // ZOFFSET zoffset_menu.title = TITLE_ZOFFSET_SP; - zoffset_menu.inc = ZOFFSET_INC_SP; - zoffset_menu.dec = ZOFFSET_DEC_SP; - - pause_msg_menu.pausing = MESSEGE_PAUSING_SP; - pause_msg_menu.changing = MESSEGE_CHANGING_SP; - pause_msg_menu.unload = MESSEGE_UNLOAD_SP; - pause_msg_menu.waiting = MESSEGE_WAITING_SP; - pause_msg_menu.insert = MESSEGE_INSERT_SP; - pause_msg_menu.load = MESSEGE_LOAD_SP; - pause_msg_menu.purge = MESSEGE_PURGE_SP; - pause_msg_menu.resume = MESSEGE_RESUME_SP; - pause_msg_menu.heat = MESSEGE_HEAT_SP; - pause_msg_menu.heating = MESSEGE_HEATING_SP; - pause_msg_menu.option = MESSEGE_OPTION_SP; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_SP; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_SP; + zoffset_menu.inc = ZOFFSET_INC_SP; + zoffset_menu.dec = ZOFFSET_DEC_SP; + + pause_msg_menu.pausing = MESSAGE_PAUSING_SP; + pause_msg_menu.changing = MESSAGE_CHANGING_SP; + pause_msg_menu.unload = MESSAGE_UNLOAD_SP; + pause_msg_menu.waiting = MESSAGE_WAITING_SP; + pause_msg_menu.insert = MESSAGE_INSERT_SP; + pause_msg_menu.load = MESSAGE_LOAD_SP; + pause_msg_menu.purge = MESSAGE_PURGE_SP; + pause_msg_menu.resume = MESSAGE_RESUME_SP; + pause_msg_menu.heat = MESSAGE_HEAT_SP; + pause_msg_menu.heating = MESSAGE_HEATING_SP; + pause_msg_menu.option = MESSAGE_OPTION_SP; + pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_SP; + pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_SP; + eeprom_menu.title = EEPROM_SETTINGS_TITLE_SP; + eeprom_menu.store = EEPROM_SETTINGS_STORE_SP; + eeprom_menu.read = EEPROM_SETTINGS_READ_SP; + eeprom_menu.revert = EEPROM_SETTINGS_REVERT_SP; + eeprom_menu.storeTips = EEPROM_STORE_TIPS_SP; + eeprom_menu.readTips = EEPROM_READ_TIPS_SP; + eeprom_menu.revertTips = EEPROM_REVERT_TIPS_SP; break; - #endif + #endif // if 1 case LANG_FRENCH: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_FR; - common_menu.text_back = BACK_TEXT_FR; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_FR; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_FR; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_FR; + common_menu.text_back = BACK_TEXT_FR; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_FR; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_FR; + common_menu.print_special_title = PRINTING_OTHER_LANGUGE; + common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; // - main_menu.title = TITLE_READYPRINT_FR; - main_menu.preheat = PREHEAT_TEXT_FR; - main_menu.move = MOVE_TEXT_FR; - main_menu.home = HOME_TEXT_FR; - main_menu.print = PRINT_TEXT_FR; - main_menu.extrude = EXTRUDE_TEXT_FR; - main_menu.leveling = LEVELING_TEXT_FR; + main_menu.title = TITLE_READYPRINT_FR; + main_menu.preheat = PREHEAT_TEXT_FR; + main_menu.move = MOVE_TEXT_FR; + main_menu.home = HOME_TEXT_FR; + main_menu.print = PRINT_TEXT_FR; + main_menu.extrude = EXTRUDE_TEXT_FR; + main_menu.leveling = LEVELING_TEXT_FR; main_menu.autoleveling = AUTO_LEVELING_TEXT_FR; - main_menu.fan = FAN_TEXT_FR; - main_menu.set = SET_TEXT_FR; - main_menu.more = MORE_TEXT_FR; - main_menu.tool = TOOL_TEXT_FR; - //TOOL - tool_menu.title = TOOL_TEXT_FR; - tool_menu.preheat = TOOL_PREHEAT_FR; - tool_menu.extrude = TOOL_EXTRUDE_FR; - tool_menu.move = TOOL_MOVE_FR; - tool_menu.home = TOOL_HOME_FR; - tool_menu.leveling = TOOL_LEVELING_FR; + main_menu.fan = FAN_TEXT_FR; + main_menu.set = SET_TEXT_FR; + main_menu.more = MORE_TEXT_FR; + main_menu.tool = TOOL_TEXT_FR; + // TOOL + tool_menu.title = TOOL_TEXT_FR; + tool_menu.preheat = TOOL_PREHEAT_FR; + tool_menu.extrude = TOOL_EXTRUDE_FR; + tool_menu.move = TOOL_MOVE_FR; + tool_menu.home = TOOL_HOME_FR; + tool_menu.leveling = TOOL_LEVELING_FR; tool_menu.autoleveling = TOOL_AUTO_LEVELING_FR; - tool_menu.filament = TOOL_FILAMENT_FR; - tool_menu.more = TOOL_MORE_FR; + tool_menu.filament = TOOL_FILAMENT_FR; + tool_menu.more = TOOL_MORE_FR; // preheat_menu.adjust_title = TITLE_ADJUST_FR; - preheat_menu.title = TITLE_PREHEAT_FR; - preheat_menu.add = ADD_TEXT_FR; - preheat_menu.dec = DEC_TEXT_FR; - preheat_menu.ext1 = EXTRUDER_1_TEXT_FR; - preheat_menu.ext2 = EXTRUDER_2_TEXT_FR; - preheat_menu.hotbed = HEATBED_TEXT_FR; - preheat_menu.off = CLOSE_TEXT_FR; + preheat_menu.title = TITLE_PREHEAT_FR; + preheat_menu.add = ADD_TEXT_FR; + preheat_menu.dec = DEC_TEXT_FR; + preheat_menu.ext1 = EXTRUDER_1_TEXT_FR; + preheat_menu.ext2 = EXTRUDER_2_TEXT_FR; + preheat_menu.hotbed = HEATBED_TEXT_FR; + preheat_menu.off = CLOSE_TEXT_FR; // move_menu.title = MOVE_TEXT_FR; // - home_menu.title = TITLE_HOME_FR; + home_menu.title = TITLE_HOME_FR; home_menu.stopmove = HOME_STOPMOVE_FR; // - file_menu.title = TITLE_CHOOSEFILE_FR; - file_menu.page_up = PAGE_UP_TEXT_FR; + file_menu.title = TITLE_CHOOSEFILE_FR; + file_menu.page_up = PAGE_UP_TEXT_FR; file_menu.page_down = PAGE_DOWN_TEXT_FR; // - extrude_menu.title = TITLE_EXTRUDE_FR; - extrude_menu.in = EXTRUDER_IN_TEXT_FR; - extrude_menu.out = EXTRUDER_OUT_TEXT_FR; - extrude_menu.ext1 = EXTRUDER_1_TEXT_FR; - extrude_menu.ext2 = EXTRUDER_2_TEXT_FR; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_FR; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_FR; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_FR; + extrude_menu.title = TITLE_EXTRUDE_FR; + extrude_menu.in = EXTRUDER_IN_TEXT_FR; + extrude_menu.out = EXTRUDER_OUT_TEXT_FR; + extrude_menu.ext1 = EXTRUDER_1_TEXT_FR; + extrude_menu.ext2 = EXTRUDER_2_TEXT_FR; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_FR; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_FR; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_FR; extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_FR; // - leveling_menu.title = TITLE_LEVELING_FR; + leveling_menu.title = TITLE_LEVELING_FR; leveling_menu.position1 = LEVELING_POINT1_TEXT_FR; leveling_menu.position2 = LEVELING_POINT2_TEXT_FR; leveling_menu.position3 = LEVELING_POINT3_TEXT_FR; leveling_menu.position4 = LEVELING_POINT4_TEXT_FR; leveling_menu.position5 = LEVELING_POINT5_TEXT_FR; // - set_menu.title = TITLE_SET_FR; - set_menu.filesys = FILESYS_TEXT_FR; - set_menu.wifi = WIFI_TEXT_FR; - set_menu.about = ABOUT_TEXT_FR; - set_menu.fan = FAN_TEXT_FR; - set_menu.filament = FILAMENT_TEXT_FR; - set_menu.breakpoint = BREAK_POINT_TEXT_FR; - set_menu.motoroff = MOTOR_OFF_TEXT_FR; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_FR; - set_menu.language = LANGUAGE_TEXT_FR; - set_menu.shutdown = SHUTDOWN_TEXT_FR; + set_menu.title = TITLE_SET_FR; + set_menu.filesys = FILESYS_TEXT_FR; + set_menu.wifi = WIFI_TEXT_FR; + set_menu.about = ABOUT_TEXT_FR; + set_menu.fan = FAN_TEXT_FR; + set_menu.filament = FILAMENT_TEXT_FR; + set_menu.breakpoint = BREAK_POINT_TEXT_FR; + set_menu.motoroff = MOTOR_OFF_TEXT_FR; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_FR; + set_menu.language = LANGUAGE_TEXT_FR; + set_menu.shutdown = SHUTDOWN_TEXT_FR; + set_menu.machine_para = MACHINE_PARA_FR; + set_menu.eepromSet = EEPROM_SETTINGS_FR; + more_menu.title = TITLE_MORE_FR; + more_menu.zoffset = ZOFFSET_FR; // - more_menu.title = TITLE_MORE_FR; - more_menu.zoffset = ZOFFSET_FR; - // - filesys_menu.title = TITLE_FILESYS_FR; - filesys_menu.sd_sys = SD_CARD_TEXT_FR; - filesys_menu.usb_sys = U_DISK_TEXT_FR; - file_menu.file_loading = FILE_LOADING_FR; - file_menu.no_file = NO_FILE_FR; - file_menu.no_file_and_check = NO_FILE_FR;//NO_FILE_AND_CHECK_FR; - //WIFI + filesys_menu.title = TITLE_FILESYS_FR; + filesys_menu.sd_sys = SD_CARD_TEXT_FR; + filesys_menu.usb_sys = U_DISK_TEXT_FR; + file_menu.file_loading = FILE_LOADING_FR; + file_menu.no_file = NO_FILE_FR; + file_menu.no_file_and_check = NO_FILE_FR;// NO_FILE_AND_CHECK_FR; + // WIFI wifi_menu.title = WIFI_NAME_TEXT_FR; - //wifi_menu.key = WIFI_KEY_TEXT_FR; - //wifi_menu.ip = WIFI_IP_TEXT_FR; - //wifi_menu.state = WIFI_STA_TEXT_FR; - //wifi_menu.cloud = CLOSE_TEXT_FR; - wifi_menu.cloud = CLOUD_TEXT_FR; + // wifi_menu.key = WIFI_KEY_TEXT_FR; + // wifi_menu.ip = WIFI_IP_TEXT_FR; + // wifi_menu.state = WIFI_STA_TEXT_FR; + // wifi_menu.cloud = CLOSE_TEXT_FR; + wifi_menu.cloud = CLOUD_TEXT_FR; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_FR; - cloud_menu.title = TITLE_CLOUD_TEXT_FR; - cloud_menu.bind = CLOUD_BINDED_FR; - cloud_menu.binded = CLOUD_BINDED_FR; - cloud_menu.unbind = CLOUD_UNBIND_FR; - cloud_menu.unbinding = CLOUD_UNBINDED_FR; + cloud_menu.title = TITLE_CLOUD_TEXT_FR; + cloud_menu.bind = CLOUD_BINDED_FR; + cloud_menu.binded = CLOUD_BINDED_FR; + cloud_menu.unbind = CLOUD_UNBIND_FR; + cloud_menu.unbinding = CLOUD_UNBINDED_FR; cloud_menu.disconnected = CLOUD_DISCONNECTED_FR; - cloud_menu.disable = CLOUD_DISABLE_FR; + cloud_menu.disable = CLOUD_DISABLE_FR; // - about_menu.title = ABOUT_TEXT_FR; - about_menu.type = ABOUT_TYPE_TEXT_FR; + about_menu.title = ABOUT_TEXT_FR; + about_menu.type = ABOUT_TYPE_TEXT_FR; about_menu.version = ABOUT_VERSION_TEXT_FR; - about_menu.wifi = ABOUT_WIFI_TEXT_FR; + about_menu.wifi = ABOUT_WIFI_TEXT_FR; // fan_menu.title = FAN_TEXT_FR; - fan_menu.add = FAN_ADD_TEXT_FR; - fan_menu.dec = FAN_DEC_TEXT_FR; + fan_menu.add = FAN_ADD_TEXT_FR; + fan_menu.dec = FAN_DEC_TEXT_FR; fan_menu.state = FAN_TIPS1_TEXT_FR; // - filament_menu.title = TITLE_FILAMENT_FR; - filament_menu.in = FILAMENT_IN_TEXT_FR; - filament_menu.out = FILAMENT_OUT_TEXT_FR; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_FR; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_FR; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_FR; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_FR; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR; + filament_menu.title = TITLE_FILAMENT_FR; + filament_menu.in = FILAMENT_IN_TEXT_FR; + filament_menu.out = FILAMENT_OUT_TEXT_FR; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_FR; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_FR; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_FR; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_FR; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR; filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_FR; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_FR; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR; // language_menu.title = LANGUAGE_TEXT_FR; // - printing_menu.title = TITLE_PRINTING_FR; + printing_menu.title = TITLE_PRINTING_FR; printing_menu.option = PRINTING_OPERATION_FR; - printing_menu.stop = PRINTING_STOP_FR; - printing_menu.pause = PRINTING_PAUSE_FR; + printing_menu.stop = PRINTING_STOP_FR; + printing_menu.pause = PRINTING_PAUSE_FR; printing_menu.resume = PRINTING_RESUME_FR; // - operation_menu.title = TITLE_OPERATION_FR; - operation_menu.pause = PRINTING_PAUSE_FR; - operation_menu.stop = PRINTING_STOP_FR; - operation_menu.temp = PRINTING_TEMP_FR; - operation_menu.fan = FAN_TEXT_FR; - operation_menu.extr = PRINTING_EXTRUDER_FR; - operation_menu.speed = PRINTING_CHANGESPEED_FR; - operation_menu.filament = FILAMENT_TEXT_FR; - operation_menu.more = PRINTING_MORE_FR; - operation_menu.move = PRINTING_MOVE_FR; - operation_menu.auto_off = AUTO_SHUTDOWN_FR; + operation_menu.title = TITLE_OPERATION_FR; + operation_menu.pause = PRINTING_PAUSE_FR; + operation_menu.stop = PRINTING_STOP_FR; + operation_menu.temp = PRINTING_TEMP_FR; + operation_menu.fan = FAN_TEXT_FR; + operation_menu.extr = PRINTING_EXTRUDER_FR; + operation_menu.speed = PRINTING_CHANGESPEED_FR; + operation_menu.filament = FILAMENT_TEXT_FR; + operation_menu.more = PRINTING_MORE_FR; + operation_menu.move = PRINTING_MOVE_FR; + operation_menu.auto_off = AUTO_SHUTDOWN_FR; operation_menu.manual_off = MANUAL_SHUTDOWN_FR; // - pause_menu.title = TITLE_PAUSE_FR; - pause_menu.resume = PRINTING_RESUME_FR; - pause_menu.stop = PRINTING_STOP_FR; - pause_menu.extrude = PRINTING_EXTRUDER_FR; - pause_menu.move = PRINTING_MOVE_FR; + pause_menu.title = TITLE_PAUSE_FR; + pause_menu.resume = PRINTING_RESUME_FR; + pause_menu.stop = PRINTING_STOP_FR; + pause_menu.extrude = PRINTING_EXTRUDER_FR; + pause_menu.move = PRINTING_MOVE_FR; pause_menu.filament = FILAMENT_TEXT_FR; - pause_menu.more = PRINTING_MORE_FR; + pause_menu.more = PRINTING_MORE_FR; // - speed_menu.title = PRINTING_CHANGESPEED_FR; - speed_menu.add = ADD_TEXT_FR; - speed_menu.dec = DEC_TEXT_FR; - speed_menu.move = MOVE_SPEED_FR; - speed_menu.extrude = EXTRUDER_SPEED_FR; + speed_menu.title = PRINTING_CHANGESPEED_FR; + speed_menu.add = ADD_TEXT_FR; + speed_menu.dec = DEC_TEXT_FR; + speed_menu.move = MOVE_SPEED_FR; + speed_menu.extrude = EXTRUDER_SPEED_FR; speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_FR; - speed_menu.move_speed = MOVE_SPEED_STATE_FR; + speed_menu.move_speed = MOVE_SPEED_STATE_FR; // - printing_more_menu.fan = FAN_TEXT_FR; + printing_more_menu.fan = FAN_TEXT_FR; printing_more_menu.auto_close = AUTO_SHUTDOWN_FR; - printing_more_menu.manual = MANUAL_SHUTDOWN_FR; - printing_more_menu.speed = PRINTING_CHANGESPEED_FR; - printing_more_menu.temp = PRINTING_TEMP_FR; - - //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_FR; - print_file_dialog_menu.cancle = DIALOG_CANCLE_FR; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_FR; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_FR; - print_file_dialog_menu.retry = DIALOG_RETRY_FR; - print_file_dialog_menu.stop = DIALOG_STOP_FR; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_FR; + printing_more_menu.manual = MANUAL_SHUTDOWN_FR; + printing_more_menu.speed = PRINTING_CHANGESPEED_FR; + printing_more_menu.temp = PRINTING_TEMP_FR; + + // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_FR; + print_file_dialog_menu.cancle = DIALOG_CANCLE_FR; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_FR; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_FR; + print_file_dialog_menu.retry = DIALOG_RETRY_FR; + print_file_dialog_menu.stop = DIALOG_STOP_FR; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_FR; print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_FR; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_FR; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_FR; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_FR; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_FR; - print_file_dialog_menu.reprint = DIALOG_REPRINT_FR; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_FR; - //ZOFFSET + print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_FR; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_FR; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_FR; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_FR; + print_file_dialog_menu.reprint = DIALOG_REPRINT_FR; + print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_FR; + // ZOFFSET zoffset_menu.title = TITLE_ZOFFSET_FR; - zoffset_menu.inc = ZOFFSET_INC_FR; - zoffset_menu.dec = ZOFFSET_DEC_FR; - - pause_msg_menu.pausing = MESSEGE_PAUSING_FR; - pause_msg_menu.changing = MESSEGE_CHANGING_FR; - pause_msg_menu.unload = MESSEGE_UNLOAD_FR; - pause_msg_menu.waiting = MESSEGE_WAITING_FR; - pause_msg_menu.insert = MESSEGE_INSERT_FR; - pause_msg_menu.load = MESSEGE_LOAD_FR; - pause_msg_menu.purge = MESSEGE_PURGE_FR; - pause_msg_menu.resume = MESSEGE_RESUME_FR; - pause_msg_menu.heat = MESSEGE_HEAT_FR; - pause_msg_menu.heating = MESSEGE_HEATING_FR; - pause_msg_menu.option = MESSEGE_OPTION_FR; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_FR; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_FR; + zoffset_menu.inc = ZOFFSET_INC_FR; + zoffset_menu.dec = ZOFFSET_DEC_FR; + + pause_msg_menu.pausing = MESSAGE_PAUSING_FR; + pause_msg_menu.changing = MESSAGE_CHANGING_FR; + pause_msg_menu.unload = MESSAGE_UNLOAD_FR; + pause_msg_menu.waiting = MESSAGE_WAITING_FR; + pause_msg_menu.insert = MESSAGE_INSERT_FR; + pause_msg_menu.load = MESSAGE_LOAD_FR; + pause_msg_menu.purge = MESSAGE_PURGE_FR; + pause_msg_menu.resume = MESSAGE_RESUME_FR; + pause_msg_menu.heat = MESSAGE_HEAT_FR; + pause_msg_menu.heating = MESSAGE_HEATING_FR; + pause_msg_menu.option = MESSAGE_OPTION_FR; + pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_FR; + pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_FR; + eeprom_menu.title = EEPROM_SETTINGS_TITLE_FR; + eeprom_menu.store = EEPROM_SETTINGS_STORE_FR; + eeprom_menu.read = EEPROM_SETTINGS_READ_FR; + eeprom_menu.revert = EEPROM_SETTINGS_REVERT_FR; + eeprom_menu.storeTips = EEPROM_STORE_TIPS_FR; + eeprom_menu.readTips = EEPROM_READ_TIPS_FR; + eeprom_menu.revertTips = EEPROM_REVERT_TIPS_FR; break; case LANG_ITALY: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_IT; - common_menu.text_back = BACK_TEXT_IT; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_IT; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_IT; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_IT; + common_menu.text_back = BACK_TEXT_IT; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_IT; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_IT; + common_menu.print_special_title = PRINTING_OTHER_LANGUGE; + common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; // - main_menu.title = TITLE_READYPRINT_IT; - main_menu.preheat = PREHEAT_TEXT_IT; - main_menu.move = MOVE_TEXT_IT; - main_menu.home = HOME_TEXT_IT; - main_menu.print = PRINT_TEXT_IT; - main_menu.extrude = EXTRUDE_TEXT_IT; - main_menu.leveling = LEVELING_TEXT_IT; + main_menu.title = TITLE_READYPRINT_IT; + main_menu.preheat = PREHEAT_TEXT_IT; + main_menu.move = MOVE_TEXT_IT; + main_menu.home = HOME_TEXT_IT; + main_menu.print = PRINT_TEXT_IT; + main_menu.extrude = EXTRUDE_TEXT_IT; + main_menu.leveling = LEVELING_TEXT_IT; main_menu.autoleveling = AUTO_LEVELING_TEXT_IT; - main_menu.fan = FAN_TEXT_IT; - main_menu.set = SET_TEXT_IT; - main_menu.more = MORE_TEXT_IT; - main_menu.tool = TOOL_TEXT_IT; - //TOOL - tool_menu.title = TOOL_TEXT_IT; - tool_menu.preheat = TOOL_PREHEAT_IT; - tool_menu.extrude = TOOL_EXTRUDE_IT; - tool_menu.move = TOOL_MOVE_IT; - tool_menu.home = TOOL_HOME_IT; - tool_menu.leveling = TOOL_LEVELING_IT; + main_menu.fan = FAN_TEXT_IT; + main_menu.set = SET_TEXT_IT; + main_menu.more = MORE_TEXT_IT; + main_menu.tool = TOOL_TEXT_IT; + // TOOL + tool_menu.title = TOOL_TEXT_IT; + tool_menu.preheat = TOOL_PREHEAT_IT; + tool_menu.extrude = TOOL_EXTRUDE_IT; + tool_menu.move = TOOL_MOVE_IT; + tool_menu.home = TOOL_HOME_IT; + tool_menu.leveling = TOOL_LEVELING_IT; tool_menu.autoleveling = TOOL_AUTO_LEVELING_IT; - tool_menu.filament = TOOL_FILAMENT_IT; - tool_menu.more = TOOL_MORE_IT; + tool_menu.filament = TOOL_FILAMENT_IT; + tool_menu.more = TOOL_MORE_IT; // preheat_menu.adjust_title = TITLE_ADJUST_IT; - preheat_menu.title = TITLE_PREHEAT_IT; - preheat_menu.add = ADD_TEXT_IT; - preheat_menu.dec = DEC_TEXT_IT; - preheat_menu.ext1 = EXTRUDER_1_TEXT_IT; - preheat_menu.ext2 = EXTRUDER_2_TEXT_IT; - preheat_menu.hotbed = HEATBED_TEXT_IT; - preheat_menu.off = CLOSE_TEXT_IT; + preheat_menu.title = TITLE_PREHEAT_IT; + preheat_menu.add = ADD_TEXT_IT; + preheat_menu.dec = DEC_TEXT_IT; + preheat_menu.ext1 = EXTRUDER_1_TEXT_IT; + preheat_menu.ext2 = EXTRUDER_2_TEXT_IT; + preheat_menu.hotbed = HEATBED_TEXT_IT; + preheat_menu.off = CLOSE_TEXT_IT; // move_menu.title = MOVE_TEXT_IT; // - home_menu.title = TITLE_HOME_IT; + home_menu.title = TITLE_HOME_IT; home_menu.stopmove = HOME_STOPMOVE_IT; // - file_menu.title = TITLE_CHOOSEFILE_IT; - file_menu.page_up = PAGE_UP_TEXT_IT; - file_menu.page_down = PAGE_DOWN_TEXT_IT; - file_menu.file_loading = FILE_LOADING_IT; - file_menu.no_file = NO_FILE_IT; - file_menu.no_file_and_check = NO_FILE_IT;//NO_FILE_AND_CHECK_IT; + file_menu.title = TITLE_CHOOSEFILE_IT; + file_menu.page_up = PAGE_UP_TEXT_IT; + file_menu.page_down = PAGE_DOWN_TEXT_IT; + file_menu.file_loading = FILE_LOADING_IT; + file_menu.no_file = NO_FILE_IT; + file_menu.no_file_and_check = NO_FILE_IT;// NO_FILE_AND_CHECK_IT; // - extrude_menu.title = TITLE_EXTRUDE_IT; - extrude_menu.in = EXTRUDER_IN_TEXT_IT; - extrude_menu.out = EXTRUDER_OUT_TEXT_IT; - extrude_menu.ext1 = EXTRUDER_1_TEXT_IT; - extrude_menu.ext2 = EXTRUDER_2_TEXT_IT; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_IT; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_IT; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_IT; + extrude_menu.title = TITLE_EXTRUDE_IT; + extrude_menu.in = EXTRUDER_IN_TEXT_IT; + extrude_menu.out = EXTRUDER_OUT_TEXT_IT; + extrude_menu.ext1 = EXTRUDER_1_TEXT_IT; + extrude_menu.ext2 = EXTRUDER_2_TEXT_IT; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_IT; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_IT; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_IT; extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_IT; // - leveling_menu.title = TITLE_LEVELING_IT; + leveling_menu.title = TITLE_LEVELING_IT; leveling_menu.position1 = LEVELING_POINT1_TEXT_IT; leveling_menu.position2 = LEVELING_POINT2_TEXT_IT; leveling_menu.position3 = LEVELING_POINT3_TEXT_IT; leveling_menu.position4 = LEVELING_POINT4_TEXT_IT; leveling_menu.position5 = LEVELING_POINT5_TEXT_IT; // - set_menu.title = TITLE_SET_IT; - set_menu.filesys = FILESYS_TEXT_IT; - set_menu.wifi = WIFI_TEXT_IT; - set_menu.about = ABOUT_TEXT_IT; - set_menu.fan = FAN_TEXT_IT; - set_menu.filament = FILAMENT_TEXT_IT; - set_menu.breakpoint = BREAK_POINT_TEXT_IT; - set_menu.motoroff = MOTOR_OFF_TEXT_IT; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_IT; - set_menu.language = LANGUAGE_TEXT_IT; - set_menu.shutdown = SHUTDOWN_TEXT_IT; - // - more_menu.title = TITLE_MORE_IT; - more_menu.zoffset = ZOFFSET_IT; + set_menu.title = TITLE_SET_IT; + set_menu.filesys = FILESYS_TEXT_IT; + set_menu.wifi = WIFI_TEXT_IT; + set_menu.about = ABOUT_TEXT_IT; + set_menu.fan = FAN_TEXT_IT; + set_menu.filament = FILAMENT_TEXT_IT; + set_menu.breakpoint = BREAK_POINT_TEXT_IT; + set_menu.motoroff = MOTOR_OFF_TEXT_IT; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_IT; + set_menu.language = LANGUAGE_TEXT_IT; + set_menu.shutdown = SHUTDOWN_TEXT_IT; + set_menu.machine_para = MACHINE_PARA_IT; + set_menu.eepromSet = EEPROM_SETTINGS_IT; + more_menu.title = TITLE_MORE_IT; + more_menu.zoffset = ZOFFSET_IT; // - filesys_menu.title = TITLE_FILESYS_IT; - filesys_menu.sd_sys = SD_CARD_TEXT_IT; + filesys_menu.title = TITLE_FILESYS_IT; + filesys_menu.sd_sys = SD_CARD_TEXT_IT; filesys_menu.usb_sys = U_DISK_TEXT_IT; - //WIFI + // WIFI wifi_menu.title = WIFI_NAME_TEXT_IT; - //wifi_menu.key = WIFI_KEY_TEXT_IT; - //wifi_menu.ip = WIFI_IP_TEXT_IT; - //wifi_menu.state = WIFI_STA_TEXT_IT; - wifi_menu.cloud = CLOSE_TEXT_IT; + // wifi_menu.key = WIFI_KEY_TEXT_IT; + // wifi_menu.ip = WIFI_IP_TEXT_IT; + // wifi_menu.state = WIFI_STA_TEXT_IT; + wifi_menu.cloud = CLOSE_TEXT_IT; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_IT; - cloud_menu.title = TITLE_CLOUD_TEXT_IT; - cloud_menu.bind = CLOUD_BINDED_IT; - cloud_menu.binded = CLOUD_BINDED_IT; - cloud_menu.unbind = CLOUD_UNBIND_IT; - cloud_menu.unbinding = CLOUD_UNBINDED_IT; + cloud_menu.title = TITLE_CLOUD_TEXT_IT; + cloud_menu.bind = CLOUD_BINDED_IT; + cloud_menu.binded = CLOUD_BINDED_IT; + cloud_menu.unbind = CLOUD_UNBIND_IT; + cloud_menu.unbinding = CLOUD_UNBINDED_IT; cloud_menu.disconnected = CLOUD_DISCONNECTED_IT; - cloud_menu.disable = CLOUD_DISABLE_IT; + cloud_menu.disable = CLOUD_DISABLE_IT; // - about_menu.title = ABOUT_TEXT_IT; - about_menu.type = ABOUT_TYPE_TEXT_IT; + about_menu.title = ABOUT_TEXT_IT; + about_menu.type = ABOUT_TYPE_TEXT_IT; about_menu.version = ABOUT_VERSION_TEXT_IT; - about_menu.wifi = ABOUT_WIFI_TEXT_IT; + about_menu.wifi = ABOUT_WIFI_TEXT_IT; // fan_menu.title = FAN_TEXT_IT; - fan_menu.add = FAN_ADD_TEXT_IT; - fan_menu.dec = FAN_DEC_TEXT_IT; + fan_menu.add = FAN_ADD_TEXT_IT; + fan_menu.dec = FAN_DEC_TEXT_IT; fan_menu.state = FAN_TIPS1_TEXT_IT; // - filament_menu.title = TITLE_FILAMENT_IT; - filament_menu.in = FILAMENT_IN_TEXT_IT; - filament_menu.out = FILAMENT_OUT_TEXT_IT; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_IT; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_IT; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_IT; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_IT; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT; + filament_menu.title = TITLE_FILAMENT_IT; + filament_menu.in = FILAMENT_IN_TEXT_IT; + filament_menu.out = FILAMENT_OUT_TEXT_IT; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_IT; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_IT; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_IT; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_IT; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT; filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_IT; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_IT; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT; // language_menu.title = LANGUAGE_TEXT_IT; // - printing_menu.title = TITLE_PRINTING_IT; + printing_menu.title = TITLE_PRINTING_IT; printing_menu.option = PRINTING_OPERATION_IT; - printing_menu.stop = PRINTING_STOP_IT; - printing_menu.pause = PRINTING_PAUSE_IT; + printing_menu.stop = PRINTING_STOP_IT; + printing_menu.pause = PRINTING_PAUSE_IT; printing_menu.resume = PRINTING_RESUME_IT; // - operation_menu.title = TITLE_OPERATION_IT; - operation_menu.pause = PRINTING_PAUSE_IT; - operation_menu.stop = PRINTING_STOP_IT; - operation_menu.temp = PRINTING_TEMP_IT; - operation_menu.fan = FAN_TEXT_IT; - operation_menu.extr = PRINTING_EXTRUDER_IT; - operation_menu.speed = PRINTING_CHANGESPEED_IT; - operation_menu.filament = FILAMENT_TEXT_IT; - operation_menu.more = PRINTING_MORE_IT; - operation_menu.move = PRINTING_MOVE_IT; - operation_menu.auto_off = AUTO_SHUTDOWN_IT; + operation_menu.title = TITLE_OPERATION_IT; + operation_menu.pause = PRINTING_PAUSE_IT; + operation_menu.stop = PRINTING_STOP_IT; + operation_menu.temp = PRINTING_TEMP_IT; + operation_menu.fan = FAN_TEXT_IT; + operation_menu.extr = PRINTING_EXTRUDER_IT; + operation_menu.speed = PRINTING_CHANGESPEED_IT; + operation_menu.filament = FILAMENT_TEXT_IT; + operation_menu.more = PRINTING_MORE_IT; + operation_menu.move = PRINTING_MOVE_IT; + operation_menu.auto_off = AUTO_SHUTDOWN_IT; operation_menu.manual_off = MANUAL_SHUTDOWN_IT; // - pause_menu.title = TITLE_PAUSE_IT; - pause_menu.resume = PRINTING_RESUME_IT; - pause_menu.stop = PRINTING_STOP_IT; - pause_menu.extrude = PRINTING_EXTRUDER_IT; - pause_menu.move = PRINTING_MOVE_IT; + pause_menu.title = TITLE_PAUSE_IT; + pause_menu.resume = PRINTING_RESUME_IT; + pause_menu.stop = PRINTING_STOP_IT; + pause_menu.extrude = PRINTING_EXTRUDER_IT; + pause_menu.move = PRINTING_MOVE_IT; pause_menu.filament = FILAMENT_TEXT_IT; - pause_menu.more = PRINTING_MORE_IT; + pause_menu.more = PRINTING_MORE_IT; // - speed_menu.title = PRINTING_CHANGESPEED_IT; - speed_menu.add = ADD_TEXT_IT; - speed_menu.dec = DEC_TEXT_IT; - speed_menu.move = MOVE_SPEED_IT; - speed_menu.extrude = EXTRUDER_SPEED_IT; + speed_menu.title = PRINTING_CHANGESPEED_IT; + speed_menu.add = ADD_TEXT_IT; + speed_menu.dec = DEC_TEXT_IT; + speed_menu.move = MOVE_SPEED_IT; + speed_menu.extrude = EXTRUDER_SPEED_IT; speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_IT; - speed_menu.move_speed = MOVE_SPEED_STATE_IT; + speed_menu.move_speed = MOVE_SPEED_STATE_IT; // - printing_more_menu.fan = FAN_TEXT_IT; + printing_more_menu.fan = FAN_TEXT_IT; printing_more_menu.auto_close = AUTO_SHUTDOWN_IT; - printing_more_menu.manual = MANUAL_SHUTDOWN_IT; - printing_more_menu.temp = PRINTING_TEMP_IT; - printing_more_menu.speed = PRINTING_CHANGESPEED_IT; - - //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_IT; - print_file_dialog_menu.cancle = DIALOG_CANCLE_IT; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_IT; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_IT; - print_file_dialog_menu.retry = DIALOG_RETRY_IT; - print_file_dialog_menu.stop = DIALOG_STOP_IT; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_IT; + printing_more_menu.manual = MANUAL_SHUTDOWN_IT; + printing_more_menu.temp = PRINTING_TEMP_IT; + printing_more_menu.speed = PRINTING_CHANGESPEED_IT; + + // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_IT; + print_file_dialog_menu.cancle = DIALOG_CANCLE_IT; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_IT; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_IT; + print_file_dialog_menu.retry = DIALOG_RETRY_IT; + print_file_dialog_menu.stop = DIALOG_STOP_IT; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_IT; print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_IT; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_IT; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_IT; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_IT; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_IT; - print_file_dialog_menu.reprint = DIALOG_REPRINT_IT; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_IT; - //ZOFFSET + print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_IT; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_IT; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_IT; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_IT; + print_file_dialog_menu.reprint = DIALOG_REPRINT_IT; + print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_IT; + // ZOFFSET zoffset_menu.title = TITLE_ZOFFSET_IT; - zoffset_menu.inc = ZOFFSET_INC_IT; - zoffset_menu.dec = ZOFFSET_DEC_IT; - - pause_msg_menu.pausing = MESSEGE_PAUSING_IT; - pause_msg_menu.changing = MESSEGE_CHANGING_IT; - pause_msg_menu.unload = MESSEGE_UNLOAD_IT; - pause_msg_menu.waiting = MESSEGE_WAITING_IT; - pause_msg_menu.insert = MESSEGE_INSERT_IT; - pause_msg_menu.load = MESSEGE_LOAD_IT; - pause_msg_menu.purge = MESSEGE_PURGE_IT; - pause_msg_menu.resume = MESSEGE_RESUME_IT; - pause_msg_menu.heat = MESSEGE_HEAT_IT; - pause_msg_menu.heating = MESSEGE_HEATING_IT; - pause_msg_menu.option = MESSEGE_OPTION_IT; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_IT; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_IT; + zoffset_menu.inc = ZOFFSET_INC_IT; + zoffset_menu.dec = ZOFFSET_DEC_IT; + + pause_msg_menu.pausing = MESSAGE_PAUSING_IT; + pause_msg_menu.changing = MESSAGE_CHANGING_IT; + pause_msg_menu.unload = MESSAGE_UNLOAD_IT; + pause_msg_menu.waiting = MESSAGE_WAITING_IT; + pause_msg_menu.insert = MESSAGE_INSERT_IT; + pause_msg_menu.load = MESSAGE_LOAD_IT; + pause_msg_menu.purge = MESSAGE_PURGE_IT; + pause_msg_menu.resume = MESSAGE_RESUME_IT; + pause_msg_menu.heat = MESSAGE_HEAT_IT; + pause_msg_menu.heating = MESSAGE_HEATING_IT; + pause_msg_menu.option = MESSAGE_OPTION_IT; + pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_IT; + pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_IT; + eeprom_menu.title = EEPROM_SETTINGS_TITLE_IT; + eeprom_menu.store = EEPROM_SETTINGS_STORE_IT; + eeprom_menu.read = EEPROM_SETTINGS_READ_IT; + eeprom_menu.revert = EEPROM_SETTINGS_REVERT_IT; + eeprom_menu.storeTips = EEPROM_STORE_TIPS_IT; + eeprom_menu.readTips = EEPROM_READ_TIPS_IT; + eeprom_menu.revertTips = EEPROM_REVERT_TIPS_IT; break; - #endif + #endif // if 1 default: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN; - common_menu.text_back = BACK_TEXT_EN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_EN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_EN; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; + common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN; + common_menu.text_back = BACK_TEXT_EN; + common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_EN; + common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_EN; + common_menu.print_special_title = PRINTING_OTHER_LANGUGE; + common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; // - main_menu.title = TITLE_READYPRINT_EN; - main_menu.preheat = PREHEAT_TEXT_EN; - main_menu.move = MOVE_TEXT_EN; - main_menu.home = HOME_TEXT_EN; - main_menu.print = PRINT_TEXT_EN; - main_menu.extrude = EXTRUDE_TEXT_EN; - main_menu.leveling = LEVELING_TEXT_EN; + main_menu.title = TITLE_READYPRINT_EN; + main_menu.preheat = PREHEAT_TEXT_EN; + main_menu.move = MOVE_TEXT_EN; + main_menu.home = HOME_TEXT_EN; + main_menu.print = PRINT_TEXT_EN; + main_menu.extrude = EXTRUDE_TEXT_EN; + main_menu.leveling = LEVELING_TEXT_EN; main_menu.autoleveling = AUTO_LEVELING_TEXT_EN; - main_menu.fan = FAN_TEXT_EN; - main_menu.set = SET_TEXT_EN; - main_menu.more = MORE_TEXT_EN; - main_menu.tool = TOOL_TEXT_EN; - //TOOL - tool_menu.title = TOOL_TEXT_EN; - tool_menu.preheat = TOOL_PREHEAT_EN; - tool_menu.extrude = TOOL_EXTRUDE_EN; - tool_menu.move = TOOL_MOVE_EN; - tool_menu.home = TOOL_HOME_EN; - tool_menu.leveling = TOOL_LEVELING_EN; + main_menu.fan = FAN_TEXT_EN; + main_menu.set = SET_TEXT_EN; + main_menu.more = MORE_TEXT_EN; + main_menu.tool = TOOL_TEXT_EN; + // TOOL + tool_menu.title = TOOL_TEXT_EN; + tool_menu.preheat = TOOL_PREHEAT_EN; + tool_menu.extrude = TOOL_EXTRUDE_EN; + tool_menu.move = TOOL_MOVE_EN; + tool_menu.home = TOOL_HOME_EN; + tool_menu.leveling = TOOL_LEVELING_EN; tool_menu.autoleveling = TOOL_AUTO_LEVELING_EN; - tool_menu.filament = TOOL_FILAMENT_EN; - tool_menu.more = TOOL_MORE_EN; + tool_menu.filament = TOOL_FILAMENT_EN; + tool_menu.more = TOOL_MORE_EN; // preheat_menu.adjust_title = TITLE_ADJUST_EN; - preheat_menu.title = TITLE_PREHEAT_EN; - preheat_menu.add = ADD_TEXT_EN; - preheat_menu.dec = DEC_TEXT_EN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_EN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_EN; - preheat_menu.hotbed = HEATBED_TEXT_EN; - preheat_menu.off = CLOSE_TEXT_EN; + preheat_menu.title = TITLE_PREHEAT_EN; + preheat_menu.add = ADD_TEXT_EN; + preheat_menu.dec = DEC_TEXT_EN; + preheat_menu.ext1 = EXTRUDER_1_TEXT_EN; + preheat_menu.ext2 = EXTRUDER_2_TEXT_EN; + preheat_menu.hotbed = HEATBED_TEXT_EN; + preheat_menu.off = CLOSE_TEXT_EN; // move_menu.title = TITLE_MOVE_EN; // - home_menu.title = TITLE_HOME_EN; + home_menu.title = TITLE_HOME_EN; home_menu.stopmove = HOME_STOPMOVE_EN; // - file_menu.title = TITLE_CHOOSEFILE_EN; - file_menu.page_up = PAGE_UP_TEXT_EN; - file_menu.page_down = PAGE_DOWN_TEXT_EN; - file_menu.file_loading = FILE_LOADING_EN; - file_menu.no_file = NO_FILE_EN; - file_menu.no_file_and_check = NO_FILE_EN;//NO_FILE_AND_CHECK_EN; + file_menu.title = TITLE_CHOOSEFILE_EN; + file_menu.page_up = PAGE_UP_TEXT_EN; + file_menu.page_down = PAGE_DOWN_TEXT_EN; + file_menu.file_loading = FILE_LOADING_EN; + file_menu.no_file = NO_FILE_EN; + file_menu.no_file_and_check = NO_FILE_EN;// NO_FILE_AND_CHECK_EN; // - extrude_menu.title = TITLE_EXTRUDE_EN; - extrude_menu.in = EXTRUDER_IN_TEXT_EN; - extrude_menu.out = EXTRUDER_OUT_TEXT_EN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_EN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_EN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_EN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_EN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_EN; + extrude_menu.title = TITLE_EXTRUDE_EN; + extrude_menu.in = EXTRUDER_IN_TEXT_EN; + extrude_menu.out = EXTRUDER_OUT_TEXT_EN; + extrude_menu.ext1 = EXTRUDER_1_TEXT_EN; + extrude_menu.ext2 = EXTRUDER_2_TEXT_EN; + extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_EN; + extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_EN; + extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_EN; extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_EN; // - leveling_menu.title = TITLE_LEVELING_EN; + leveling_menu.title = TITLE_LEVELING_EN; leveling_menu.position1 = LEVELING_POINT1_TEXT_EN; leveling_menu.position2 = LEVELING_POINT2_TEXT_EN; leveling_menu.position3 = LEVELING_POINT3_TEXT_EN; leveling_menu.position4 = LEVELING_POINT4_TEXT_EN; leveling_menu.position5 = LEVELING_POINT5_TEXT_EN; // - set_menu.title = TITLE_SET_EN; - set_menu.filesys = FILESYS_TEXT_EN; - set_menu.wifi = WIFI_TEXT_EN; - set_menu.about = ABOUT_TEXT_EN; - set_menu.fan = FAN_TEXT_EN; - set_menu.filament = FILAMENT_TEXT_EN; - set_menu.breakpoint = BREAK_POINT_TEXT_EN; - set_menu.motoroff = MOTOR_OFF_TEXT_EN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_EN; - set_menu.language = LANGUAGE_TEXT_EN; - set_menu.shutdown = SHUTDOWN_TEXT_EN; - //set_menu.machine_para = MACHINE_PARA_EN; + set_menu.title = TITLE_SET_EN; + set_menu.filesys = FILESYS_TEXT_EN; + set_menu.wifi = WIFI_TEXT_EN; + set_menu.about = ABOUT_TEXT_EN; + set_menu.fan = FAN_TEXT_EN; + set_menu.filament = FILAMENT_TEXT_EN; + set_menu.breakpoint = BREAK_POINT_TEXT_EN; + set_menu.motoroff = MOTOR_OFF_TEXT_EN; + set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_EN; + set_menu.language = LANGUAGE_TEXT_EN; + set_menu.shutdown = SHUTDOWN_TEXT_EN; + set_menu.machine_para = MACHINE_PARA_EN; + set_menu.eepromSet = EEPROM_SETTINGS_EN; // - more_menu.title = TITLE_MORE_EN; + more_menu.title = TITLE_MORE_EN; more_menu.zoffset = ZOFFSET_EN; // - filesys_menu.title = TITLE_FILESYS_EN; - filesys_menu.sd_sys = SD_CARD_TEXT_EN; + filesys_menu.title = TITLE_FILESYS_EN; + filesys_menu.sd_sys = SD_CARD_TEXT_EN; filesys_menu.usb_sys = U_DISK_TEXT_EN; - //WIFI + // WIFI wifi_menu.title = WIFI_TEXT; - //wifi_menu.key = WIFI_KEY_TEXT_EN; - //wifi_menu.ip = WIFI_IP_TEXT_EN; - //wifi_menu.state = WIFI_STA_TEXT_EN; - wifi_menu.cloud = CLOUD_TEXT_EN; + // wifi_menu.key = WIFI_KEY_TEXT_EN; + // wifi_menu.ip = WIFI_IP_TEXT_EN; + // wifi_menu.state = WIFI_STA_TEXT_EN; + wifi_menu.cloud = CLOUD_TEXT_EN; wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; - cloud_menu.title = TITLE_CLOUD_TEXT_EN; - cloud_menu.bind = CLOUD_BINDED_EN; - cloud_menu.binded = CLOUD_BINDED_EN; - cloud_menu.unbind = CLOUD_UNBIND_EN; - cloud_menu.unbinding = CLOUD_UNBINDED_EN; + cloud_menu.title = TITLE_CLOUD_TEXT_EN; + cloud_menu.bind = CLOUD_BINDED_EN; + cloud_menu.binded = CLOUD_BINDED_EN; + cloud_menu.unbind = CLOUD_UNBIND_EN; + cloud_menu.unbinding = CLOUD_UNBINDED_EN; cloud_menu.disconnected = CLOUD_DISCONNECTED_EN; - cloud_menu.disable = CLOUD_DISABLE_EN; + cloud_menu.disable = CLOUD_DISABLE_EN; // - about_menu.title = TITLE_ABOUT_EN; - about_menu.type = ABOUT_TYPE_TEXT_EN; + about_menu.title = TITLE_ABOUT_EN; + about_menu.type = ABOUT_TYPE_TEXT_EN; about_menu.version = ABOUT_VERSION_TEXT_EN; - about_menu.wifi = ABOUT_WIFI_TEXT_EN; + about_menu.wifi = ABOUT_WIFI_TEXT_EN; // fan_menu.title = TITLE_FAN_EN; - fan_menu.add = FAN_ADD_TEXT_EN; - fan_menu.dec = FAN_DEC_TEXT_EN; + fan_menu.add = FAN_ADD_TEXT_EN; + fan_menu.dec = FAN_DEC_TEXT_EN; fan_menu.state = FAN_TIPS1_TEXT_EN; // - filament_menu.title = TITLE_FILAMENT_EN; - filament_menu.in = FILAMENT_IN_TEXT_EN; - filament_menu.out = FILAMENT_OUT_TEXT_EN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_EN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_EN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_EN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_EN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN; + filament_menu.title = TITLE_FILAMENT_EN; + filament_menu.in = FILAMENT_IN_TEXT_EN; + filament_menu.out = FILAMENT_OUT_TEXT_EN; + filament_menu.ext1 = FILAMENT_EXT0_TEXT_EN; + filament_menu.ext2 = FILAMENT_EXT1_TEXT_EN; + filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_EN; + filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN; + filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN; + filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_EN; + filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN; + filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN; filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_EN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN; + filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_EN; + filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN; // language_menu.title = TITLE_LANGUAGE_EN; - language_menu.next = PAGE_DOWN_TEXT_EN; - language_menu.up = PAGE_UP_TEXT_EN; + language_menu.next = PAGE_DOWN_TEXT_EN; + language_menu.up = PAGE_UP_TEXT_EN; // - printing_menu.title = TITLE_PRINTING_EN; + printing_menu.title = TITLE_PRINTING_EN; printing_menu.option = PRINTING_OPERATION_EN; - printing_menu.stop = PRINTING_STOP_EN; - printing_menu.pause = PRINTING_PAUSE_EN; + printing_menu.stop = PRINTING_STOP_EN; + printing_menu.pause = PRINTING_PAUSE_EN; printing_menu.resume = PRINTING_RESUME_EN; // - operation_menu.title = TITLE_OPERATION_EN; - operation_menu.pause = PRINTING_PAUSE_EN; - operation_menu.stop = PRINTING_STOP_EN; - operation_menu.temp = PRINTING_TEMP_EN; - operation_menu.fan = FAN_TEXT_EN; - operation_menu.extr = PRINTING_EXTRUDER_EN; - operation_menu.speed = PRINTING_CHANGESPEED_EN; - operation_menu.filament = FILAMENT_TEXT_EN; - operation_menu.more = PRINTING_MORE_EN; - operation_menu.move = PRINTING_MOVE_EN; - operation_menu.auto_off = AUTO_SHUTDOWN_EN; + operation_menu.title = TITLE_OPERATION_EN; + operation_menu.pause = PRINTING_PAUSE_EN; + operation_menu.stop = PRINTING_STOP_EN; + operation_menu.temp = PRINTING_TEMP_EN; + operation_menu.fan = FAN_TEXT_EN; + operation_menu.extr = PRINTING_EXTRUDER_EN; + operation_menu.speed = PRINTING_CHANGESPEED_EN; + operation_menu.filament = FILAMENT_TEXT_EN; + operation_menu.more = PRINTING_MORE_EN; + operation_menu.move = PRINTING_MOVE_EN; + operation_menu.auto_off = AUTO_SHUTDOWN_EN; operation_menu.manual_off = MANUAL_SHUTDOWN_EN; // - pause_menu.title = TITLE_PAUSE_EN; - pause_menu.resume = PRINTING_RESUME_EN; - pause_menu.stop = PRINTING_STOP_EN; - pause_menu.extrude = PRINTING_EXTRUDER_EN; - pause_menu.move = PRINTING_MOVE_EN; + pause_menu.title = TITLE_PAUSE_EN; + pause_menu.resume = PRINTING_RESUME_EN; + pause_menu.stop = PRINTING_STOP_EN; + pause_menu.extrude = PRINTING_EXTRUDER_EN; + pause_menu.move = PRINTING_MOVE_EN; pause_menu.filament = FILAMENT_TEXT_EN; - pause_menu.more = PRINTING_MORE_EN; + pause_menu.more = PRINTING_MORE_EN; // - speed_menu.title = TITLE_CHANGESPEED_EN; - speed_menu.add = ADD_TEXT_EN; - speed_menu.dec = DEC_TEXT_EN; - speed_menu.move = MOVE_SPEED_EN; - speed_menu.extrude = EXTRUDER_SPEED_EN; + speed_menu.title = TITLE_CHANGESPEED_EN; + speed_menu.add = ADD_TEXT_EN; + speed_menu.dec = DEC_TEXT_EN; + speed_menu.move = MOVE_SPEED_EN; + speed_menu.extrude = EXTRUDER_SPEED_EN; speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_EN; - speed_menu.move_speed = MOVE_SPEED_STATE_EN; + speed_menu.move_speed = MOVE_SPEED_STATE_EN; // - printing_more_menu.title = TITLE_MORE_EN; - printing_more_menu.fan = FAN_TEXT_EN; + printing_more_menu.title = TITLE_MORE_EN; + printing_more_menu.fan = FAN_TEXT_EN; printing_more_menu.auto_close = AUTO_SHUTDOWN_EN; - printing_more_menu.manual = MANUAL_SHUTDOWN_EN; - printing_more_menu.speed = PRINTING_CHANGESPEED_EN; - printing_more_menu.temp = PRINTING_TEMP_EN; - - //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_EN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN; - print_file_dialog_menu.retry = DIALOG_RETRY_EN; - print_file_dialog_menu.stop = DIALOG_STOP_EN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN; + printing_more_menu.manual = MANUAL_SHUTDOWN_EN; + printing_more_menu.speed = PRINTING_CHANGESPEED_EN; + printing_more_menu.temp = PRINTING_TEMP_EN; + + // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN; + print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN; + print_file_dialog_menu.cancle = DIALOG_CANCLE_EN; + print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN; + print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN; + print_file_dialog_menu.retry = DIALOG_RETRY_EN; + print_file_dialog_menu.stop = DIALOG_STOP_EN; + print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN; print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_EN; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_EN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_EN; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_EN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_EN; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN; - //ZOFFSET + print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_EN; + print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_EN; + print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_EN; + print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN; + print_file_dialog_menu.reprint = DIALOG_REPRINT_EN; + print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN; + // ZOFFSET zoffset_menu.title = TITLE_ZOFFSET_EN; - zoffset_menu.inc = ZOFFSET_INC_EN; - zoffset_menu.dec = ZOFFSET_DEC_EN; - - pause_msg_menu.pausing = MESSEGE_PAUSING_EN; - pause_msg_menu.changing = MESSEGE_CHANGING_EN; - pause_msg_menu.unload = MESSEGE_UNLOAD_EN; - pause_msg_menu.waiting = MESSEGE_WAITING_EN; - pause_msg_menu.insert = MESSEGE_INSERT_EN; - pause_msg_menu.load = MESSEGE_LOAD_EN; - pause_msg_menu.purge = MESSEGE_PURGE_EN; - pause_msg_menu.resume = MESSEGE_RESUME_EN; - pause_msg_menu.heat = MESSEGE_HEAT_EN; - pause_msg_menu.heating = MESSEGE_HEATING_EN; - pause_msg_menu.option = MESSEGE_OPTION_EN; - pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_EN; - pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_EN; + zoffset_menu.inc = ZOFFSET_INC_EN; + zoffset_menu.dec = ZOFFSET_DEC_EN; + + pause_msg_menu.pausing = MESSAGE_PAUSING_EN; + pause_msg_menu.changing = MESSAGE_CHANGING_EN; + pause_msg_menu.unload = MESSAGE_UNLOAD_EN; + pause_msg_menu.waiting = MESSAGE_WAITING_EN; + pause_msg_menu.insert = MESSAGE_INSERT_EN; + pause_msg_menu.load = MESSAGE_LOAD_EN; + pause_msg_menu.purge = MESSAGE_PURGE_EN; + pause_msg_menu.resume = MESSAGE_RESUME_EN; + pause_msg_menu.heat = MESSAGE_HEAT_EN; + pause_msg_menu.heating = MESSAGE_HEATING_EN; + pause_msg_menu.option = MESSAGE_OPTION_EN; + pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_EN; + pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_EN; + eeprom_menu.title = EEPROM_SETTINGS_TITLE_EN; + eeprom_menu.store = EEPROM_SETTINGS_STORE_EN; + eeprom_menu.read = EEPROM_SETTINGS_READ_EN; + eeprom_menu.revert = EEPROM_SETTINGS_REVERT_EN; + eeprom_menu.storeTips = EEPROM_STORE_TIPS_EN; + eeprom_menu.readTips = EEPROM_READ_TIPS_EN; + eeprom_menu.revertTips = EEPROM_REVERT_TIPS_EN; break; } } -#endif // TFT_LVGL_UI +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 32834eafc6ef..585100935688 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -48,6 +48,228 @@ extern void disp_language_init(); #define MULTI_LANGUAGE_ENABLE 1 #define MULTI_LANGUAGE_DISABLE 0 +typedef struct machine_common_disp{ + const char *default_value; + + const char *next; + const char *previous; + + const char *MachineConfigTitle; + const char *MachineType; + const char *Stroke; + const char *HomeDir; + const char *EndStopType; + const char *FilamentConf; + const char *LevelingConf; + + const char *MachineTypeConfTitle; + const char *xyz; + const char *delta; + const char *corexy; + + const char *StrokeConfTitle; + const char *xStroke; + const char *yStroke; + const char *zStroke; + + const char *xmin; + const char *ymin; + const char *zmin; + + const char *HomeDirConfTitle; + const char *xHomeDir; + const char *yHomeDir; + const char *zHomeDir; + const char *min; + const char *max; + + const char *EndstopConfTitle; + const char *xEndstop_min; + const char *yEndstop_min; + const char *zEndstop_min; + const char *xEndstop_max; + const char *yEndstop_max; + const char *zEndstop_max; + const char *FilamentEndstop; + const char *LevelingEndstop; + const char *opened; + const char *closed; + + const char *FilamentConfTitle; + const char *InTemperature; + const char *InLength; + const char *InSpeed; + const char *OutTemperature; + const char *OutLength; + const char *OutSpeed; + + const char *LevelingParaConfTitle; + const char *LevelingParaConf; + const char *DeltaLevelConf; + const char *XYZLevelconf; + + const char *LevelingSubConfTitle; + const char *AutoLevelEnable; + const char *BLtouchEnable; + const char *ProbePort; + const char *ProbeXoffset; + const char *ProbeYoffset; + const char *ProbeZoffset; + const char *ProbeXYspeed; + const char *ProbeZspeed; + const char *enable; + const char *disable; + const char *z_min; + const char *z_max; + + const char *LevelingSubDeltaConfTitle; + const char *MachineRadius; + const char *DiagonalRod; + const char *PrintableRadius; + const char *DeltaHeight; + const char *SmoothRodOffset; + const char *EffectorOffset; + const char *CalibrationRadius; + + const char *LevelingSubXYZConfTitle; + //const char *Level_positon1; + //const char *Level_positon2; + //const char *Level_positon3; + //const char *Level_positon4; + + const char *TemperatureConfTitle; + const char *NozzleConf; + const char *HotBedConf; + const char *PreheatTemperConf; + + const char *NozzleCnt; + const char *NozzleConfTitle; + const char *NozzleType; + const char *NozzleAdjustType; + const char *NozzleMinTemperature; + const char *NozzleMaxTemperature; + const char *Extrude_Min_Temper; + + const char *HotbedEnable; + const char *HotbedConfTitle; + const char *HotbedAjustType; + const char *HotbedMinTemperature; + const char *HotbedMaxTemperature; + + const char *MotorConfTitle; + const char *MaxFeedRateConf; + const char *AccelerationConf; + const char *JerkConf; + const char *StepsConf; + const char *MotorDirConf; + const char *HomeFeedRateConf; + const char *TMCcurrentConf; + const char *TMCStepModeConf; + + const char *MaxFeedRateConfTitle; + const char *XMaxFeedRate; + const char *YMaxFeedRate; + const char *ZMaxFeedRate; + const char *E0MaxFeedRate; + const char *E1MaxFeedRate; + + const char *AccelerationConfTitle; + const char *PrintAcceleration; + const char *RetractAcceleration; + const char *TravelAcceleration; + const char *X_Acceleration; + const char *Y_Acceleration; + const char *Z_Acceleration; + const char *E0_Acceleration; + const char *E1_Acceleration; + + const char *JerkConfTitle; + const char *X_Jerk; + const char *Y_Jerk; + const char *Z_Jerk; + const char *E_Jerk; + + const char *StepsConfTitle; + const char *X_Steps; + const char *Y_Steps; + const char *Z_Steps; + const char *E0_Steps; + const char *E1_Steps; + + const char *TmcCurrentConfTitle; + const char *X_Current; + const char *Y_Current; + const char *Z_Current; + const char *E0_Current; + const char *E1_Current; + + const char *TmcStepModeConfTitle; + const char *X_StepMode; + const char *Y_StepMode; + const char *Z_StepMode; + const char *E0_StepMode; + const char *E1_StepMode; + + const char *MotorDirConfTitle; + const char *X_MotorDir; + const char *Y_MotorDir; + const char *Z_MotorDir; + const char *E0_MotorDir; + const char *E1_MotorDir; + const char *Invert_1; + const char *Invert_0; + + const char *HomeFeedRateConfTitle; + const char *XY_HomeFeedRate; + const char *Y_HomeFeedRate; + const char *Z_HomeFeedRate; + + const char *AdvancedConfTitle; + const char *PwrOffDection; + const char *PwrOffAfterPrint; + const char *HaveUps; + const char *Z2andZ2Endstop; + const char *EnablePinsInvert; + const char *PausePosition; + + const char *Z2ConfTitle; + const char *Z2Enable; + const char *Z2EndstopEnable; + const char *Z2Port; + + const char *EnablePinsInvertTitle; + const char *XInvert; + const char *YInvert; + const char *ZInvert; + const char *EInvert; + + const char *key_1; + const char *key_2; + const char *key_3; + const char *key_4; + const char *key_5; + const char *key_6; + const char *key_7; + const char *key_8; + const char *key_9; + const char *key_0; + const char *key_point; + const char *key_back; + const char *key_reset; + const char *key_confirm; + const char *negative; + const char *low_level; + const char *high_level; + + const char *PausePosText; + const char *xPos; + const char *yPos; + const char *zPos; + +} machine_common_def; + +extern machine_common_def machine_menu; + typedef struct common_menu_disp { const char *text_back; const char *dialog_confirm_title; @@ -59,6 +281,7 @@ typedef struct common_menu_disp { const char *next; const char *previous; } common_menu_def; + extern common_menu_def common_menu; typedef struct main_menu_disp { @@ -76,6 +299,7 @@ typedef struct main_menu_disp { const char *more; const char *machine_para; } main_menu_def; + extern main_menu_def main_menu; typedef struct preheat_menu_disp { @@ -96,7 +320,8 @@ typedef struct preheat_menu_disp { const char *dialog_tips; -}preheat_menu_def; +} preheat_menu_def; + extern preheat_menu_def preheat_menu; typedef struct move_menu_disp { @@ -114,6 +339,7 @@ typedef struct move_menu_disp { const char *step_10mm; const char *back; } move_menu_def; + extern move_menu_def move_menu; typedef struct home_menu_disp { @@ -125,6 +351,7 @@ typedef struct home_menu_disp { const char *stopmove; const char *back; } home_menu_def; + extern home_menu_def home_menu; typedef struct file_menu_disp { @@ -137,7 +364,8 @@ typedef struct file_menu_disp { const char *no_file; const char *no_file_and_check; -}file_menu_def; +} file_menu_def; + extern file_menu_def file_menu; typedef struct extrude_menu_disp { @@ -160,6 +388,7 @@ typedef struct extrude_menu_disp { const char *temp_value; const char *temper_text; } extrude_menu_def; + extern extrude_menu_def extrude_menu; typedef struct leveling_menu_disp { @@ -172,6 +401,7 @@ typedef struct leveling_menu_disp { char *back; } leveling_menu_def; + extern leveling_menu_def leveling_menu; typedef struct set_menu_disp { @@ -187,8 +417,10 @@ typedef struct set_menu_disp { const char *shutdown; const char *language; const char *machine_para; + const char *eepromSet; const char *back; } set_menu_def; + extern set_menu_def set_menu; typedef struct filesys_menu_disp { @@ -198,6 +430,7 @@ typedef struct filesys_menu_disp { const char *usb_sys; const char *back; } filesys_menu_def; + extern filesys_menu_def filesys_menu; typedef struct more_menu_disp { @@ -205,6 +438,7 @@ typedef struct more_menu_disp { const char *zoffset; const char *back; } more_menu_def; + extern more_menu_def more_menu; typedef struct wifi_menu_disp { @@ -221,6 +455,7 @@ typedef struct wifi_menu_disp { const char *back; const char *reconnect; } wifi_menu_def; + extern wifi_menu_def wifi_menu; typedef struct cloud_menu_disp { @@ -236,6 +471,7 @@ typedef struct cloud_menu_disp { const char *back; const char *unbind_printer_tips; } cloud_menu_def; + extern cloud_menu_def cloud_menu; typedef struct about_menu_disp { @@ -249,6 +485,7 @@ typedef struct about_menu_disp { const char *type_robin_mini; const char *back; } about_menu_def; + extern about_menu_def about_menu; typedef struct fan_menu_disp { @@ -263,6 +500,7 @@ typedef struct fan_menu_disp { const char *state; const char *state_value; } fan_menu_def; + extern fan_menu_def fan_menu; typedef struct filament_menu_disp { @@ -290,6 +528,7 @@ typedef struct filament_menu_disp { const char *filament_dialog_ok; const char *filament_dialog_back; } filament_menu_def; + extern filament_menu_def filament_menu; typedef struct language_menu { @@ -310,6 +549,7 @@ typedef struct language_menu { const char *up; const char *back; } language_menu_def; + extern language_menu_def language_menu; typedef struct printing_menu_disp { @@ -323,6 +563,7 @@ typedef struct printing_menu_disp { const char *resume; const char *stop; } printing_menu_def; + extern printing_menu_def printing_menu; typedef struct operation_menu_disp { @@ -341,6 +582,7 @@ typedef struct operation_menu_disp { const char *back; const char *babystep; } operation_menu_def; + extern operation_menu_def operation_menu; typedef struct pause_menu_disp { @@ -352,6 +594,7 @@ typedef struct pause_menu_disp { const char *filament; const char *more; } pause_menu_def; + extern pause_menu_def pause_menu; typedef struct speed_menu_disp { @@ -367,6 +610,7 @@ typedef struct speed_menu_disp { const char *move_speed; const char *extrude_speed; } speed_menu_def; + extern speed_menu_def speed_menu; typedef struct printing_more_menu_disp { @@ -378,6 +622,7 @@ typedef struct printing_more_menu_disp { const char *speed; const char *back; } printing_more_menu_def; + extern printing_more_menu_def printing_more_menu; typedef struct dialog_menu_disp { @@ -392,6 +637,7 @@ typedef struct dialog_menu_disp { const char *tip1_print_file; const char *tip2_stop_file; } dialog_menu_def; + extern dialog_menu_def dialog_menu; typedef struct print_file_dialog_disp { @@ -412,6 +658,7 @@ typedef struct print_file_dialog_disp { const char *reprint; const char *wifi_enable_tips; } print_file_dialog_menu_def; + extern print_file_dialog_menu_def print_file_dialog_menu; typedef struct zoffset_menu_disp { @@ -423,6 +670,7 @@ typedef struct zoffset_menu_disp { const char *step1; const char *back; } zoffset_menu_def; + extern zoffset_menu_def zoffset_menu; typedef struct tool_menu_disp { @@ -437,6 +685,7 @@ typedef struct tool_menu_disp { const char *more; const char *back; } tool_menu_def; + extern tool_menu_def tool_menu; typedef struct MachinePara_menu_disp { @@ -447,6 +696,7 @@ typedef struct MachinePara_menu_disp { const char *AdvanceSetting; //const char *back; } MachinePara_menu_def; + extern MachinePara_menu_def MachinePara_menu; typedef struct MachineSettings_menu_disp { @@ -459,6 +709,7 @@ typedef struct MachineSettings_menu_disp { const char *leveling; const char *back; } MachineSettings_menu_def; + extern MachineSettings_menu_def MachineSettings_menu; typedef struct TemperatureSettings_menu_disp { @@ -468,6 +719,7 @@ typedef struct TemperatureSettings_menu_disp { const char *preheat; const char *back; } TemperatureSettings_menu_def; + extern TemperatureSettings_menu_def TemperatureSettings_menu; typedef struct pause_msg_disp { @@ -485,23 +737,35 @@ typedef struct pause_msg_disp { const char *purgeMore; const char *continuePrint; } pause_msg_def; + extern pause_msg_def pause_msg_menu; +typedef struct eeprom_disp{ + const char *title; + const char *store; + const char *read; + const char *revert; + const char *storeTips; + const char *readTips; + const char *revertTips; +} eeprom_def; + +extern eeprom_def eeprom_menu; /*****************************************/ //********************************************// //#if defined(TFT70) // //#elif defined(TFT35) -#define TEXT_VALUE "%d/%d" +#define TEXT_VALUE "%d/%d" //#endif -#define TEXT_VALUE_T ": %d℃" -#define TEXT_VALUE_mm ": %dmm" -#define TEXT_VALUE_cm ": %dcm" -#define TEXT_VALUE_m ": %dm" +#define TEXT_VALUE_T ": %d℃" +#define TEXT_VALUE_mm ": %dmm" +#define TEXT_VALUE_cm ": %dcm" +#define TEXT_VALUE_m ": %dm" -#define TEMP_UNIT_SYBOL "%d℃" -#define FLOAT_TEMP_UNIT_SYBOL "%.1f℃" +#define TEMP_UNIT_SYBOL "%d℃" +#define FLOAT_TEMP_UNIT_SYBOL "%.1f℃" #define TEXT_1C "1℃" #define TEXT_5C "5℃" @@ -533,7 +797,7 @@ extern pause_msg_def pause_msg_menu; #define LANGUAGE_JP "日本語" #define LANGUAGE_GE "Deutsch" #define LANGUAGE_FR "français" -#define LANGUAGE_IT "Italia" +#define LANGUAGE_IT "Italiano" #define LANGUAGE_PR "português" #define LANGUAGE_KR "Korean" #define LANGUAGE_BR "Brazil" diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 24ce57a764a7..9b8c1c60ffa5 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1098,11 +1098,7 @@ void prepare_line_to_destination() { } uint8_t axes_need_homing(uint8_t axis_bits/*=0x07*/) { - #if ENABLED(HOME_AFTER_DEACTIVATE) - #define HOMED_FLAGS axis_known_position - #else - #define HOMED_FLAGS axis_homed - #endif + #define HOMED_FLAGS TERN(HOME_AFTER_DEACTIVATE, axis_known_position, axis_homed) // Clear test bits that are homed if (TEST(axis_bits, X_AXIS) && TEST(HOMED_FLAGS, X_AXIS)) CBI(axis_bits, X_AXIS); if (TEST(axis_bits, Y_AXIS) && TEST(HOMED_FLAGS, Y_AXIS)) CBI(axis_bits, Y_AXIS); diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 20514853ea1b..c9d87486f87d 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2551,7 +2551,7 @@ void Stepper::init() { AXIS_INIT(Z, Z); #endif - #if E_STEPPERS > 0 && HAS_E0_STEP + #if E_STEPPERS && HAS_E0_STEP E_AXIS_INIT(0); #endif #if E_STEPPERS > 1 && HAS_E1_STEP diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index a4db741966e0..e3d3730c79ea 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -865,14 +865,14 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_AXIS_E0 - #if E_STEPPERS > 0 && HAS_E0_ENABLE + #if E_STEPPERS && HAS_E0_ENABLE #define ENABLE_AXIS_E0() ENABLE_STEPPER_E0() #else #define ENABLE_AXIS_E0() NOOP #endif #endif #ifndef DISABLE_AXIS_E0 - #if E_STEPPERS > 0 && HAS_E0_ENABLE + #if E_STEPPERS && HAS_E0_ENABLE #define DISABLE_AXIS_E0() DISABLE_STEPPER_E0() #else #define DISABLE_AXIS_E0() NOOP diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index ba8a47324197..a8fb3f02f0b9 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -507,7 +507,9 @@ #elif MB(MKS_ROBIN_MINI) #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini #elif MB(MKS_ROBIN_NANO) - #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano + #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano env:mks_robin_nano35 +#elif MB(MKS_ROBIN_NANO_V2) + #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano env:mks_robin_nano35 #elif MB(MKS_ROBIN_LITE) #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite #elif MB(BTT_SKR_MINI_V1_1) diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index 475a15d6f6de..78231afaffa2 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -31,6 +31,14 @@ #define BOARD_INFO_NAME "RADDS" +// +// EEPROM +// +#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) + #define I2C_EEPROM + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB +#endif + // // Servos // @@ -205,9 +213,6 @@ #define FIL_RUNOUT_PIN 39 // SERVO2_PIN #endif -#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x2000 // 8KB - // // M3/M4/M5 - Spindle/Laser Control // diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 8f529085c91f..0a733049b87e 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -144,12 +144,13 @@ #define SPI_FLASH_SIZE 0x200000 // 2MB -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #define HAS_SPI_FLASH_FONT 0 #define HAS_GCODE_PREVIEW 1 #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 #define HAS_LANG_SELECT_SCREEN 0 #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 //SPI 2 #define W25QXX_CS_PIN PB12 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 021c2e176110..0fb3a9a8799e 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -150,12 +150,13 @@ #define SPI_FLASH_SIZE 0x200000 // 2MB -#if ENABLED(TFT_LVGL_UI) +#if HAS_TFT_LVGL_UI #define HAS_SPI_FLASH_FONT 0 #define HAS_GCODE_PREVIEW 1 #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 #define HAS_LANG_SELECT_SCREEN 0 #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 //SPI 2 #define W25QXX_CS_PIN PB12 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 1d0fd15c23b2..610f4b5735dd 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -45,7 +45,7 @@ #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif #define ENABLE_SPI2 @@ -123,8 +123,8 @@ // // Misc. Functions // -//#define POWER_LOSS_PIN PA2 // PW_DET -//#define PS_ON_PIN PA3 // PW_OFF +#define POWER_LOSS_PIN PA2 // PW_DET +#define PS_ON_PIN PA3 // PW_OFF //#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY //#define SUICIDE_PIN_INVERTING false @@ -132,13 +132,16 @@ //#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY //#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY +#define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY //#define LED_PIN PB2 #define MT_DET_1_PIN PA4 +#define MT_DET_2_PIN PE6 #define MT_DET_PIN_INVERTING false +#define WIFI_IO0_PIN PC13 + // // SD Card // @@ -162,76 +165,28 @@ * to let the bootloader init the screen. */ -#if ENABLED(SPI_GRAPHICAL_TFT) +#if ENABLED(TFT_LVGL_UI_SPI) - #if HAS_SPI_LCD + #define SPI_TFT_CS_PIN PD11 + #define SPI_TFT_SCK_PIN PA5 + #define SPI_TFT_MISO_PIN PA6 + #define SPI_TFT_MOSI_PIN PA7 + #define SPI_TFT_DC_PIN PD10 + #define SPI_TFT_RST_PIN PC6 - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define LCD_BACKLIGHT_PIN -1 + #define LCD_BACKLIGHT_PIN PD13 - // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) - #if ENABLED(MKS_MINI_12864) - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PD11 - #define DOGLCD_CS PE15 - #define DOGLCD_SCK PA5 - #define DOGLCD_MOSI PA7 - - // Required for MKS_MINI_12864 with this board - #define MKS_LCD12864B - #undef SHOW_BOOTSCREEN - - #else // !MKS_MINI_12864 - - #define LCD_PINS_D4 PE14 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PE15 - #define LCD_PINS_D6 PD11 - #define LCD_PINS_D7 PD10 - #endif - - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif - - #endif // !MKS_MINI_12864 - - #else - - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 - - #define LCD_BACKLIGHT_PIN PD13 - - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 - - #endif // HAS_SPI_LCD - -#elif ENABLED(TFT_LVGL_UI) + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + +#elif ENABLED(TFT_LVGL_UI_FSMC) #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -243,7 +198,11 @@ #define LCD_BACKLIGHT_PIN PD13 -#elif ENABLED(FSMC_GRAPHICAL_TFT) +#endif + +#if ENABLED(FSMC_GRAPHICAL_TFT) + //#define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h + //#define DOGLCD_SCK -1 #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -257,9 +216,54 @@ #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif - #endif +#if HAS_SPI_LCD + + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define LCD_BACKLIGHT_PIN -1 + + // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) + #if ENABLED(MKS_MINI_12864) + #define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN -1 + #define DOGLCD_A0 PD11 + #define DOGLCD_CS PE15 + #define DOGLCD_SCK PA5 + #define DOGLCD_MOSI PA7 + + // Required for MKS_MINI_12864 with this board + #define MKS_LCD12864B + #undef SHOW_BOOTSCREEN + + #else // !MKS_MINI_12864 + + #define LCD_PINS_D4 PE14 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PE15 + #define LCD_PINS_D6 PD11 + #define LCD_PINS_D7 PD10 + #endif + + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif + + #endif // !MKS_MINI_12864 + +#endif // HAS_SPI_LCD + #define SPI_FLASH #if ENABLED(SPI_FLASH) #define W25QXX_CS_PIN PB12 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h new file mode 100644 index 000000000000..efec3edcd9cd --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -0,0 +1,325 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * MKS Robin nano (STM32F130VET6) board pin assignments + */ + +#ifndef __STM32F1__ + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS Robin nano V2.0" + +// +// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role +// + +//#define DISABLE_DEBUG + +// +// EEPROM +// +//#define FLASH_EEPROM_EMULATION +//#define SDCARD_EEPROM_EMULATION + +#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) + #define I2C_EEPROM // EEPROM on I2C-0 + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// +// Note: MKS Robin board is using SPI2 interface. +// +//#define SPI_MODULE 2 +#define ENABLE_SPI2 + +// +// Limit Switches +// +#define X_DIAG_PIN PA15 +#define Y_DIAG_PIN PA12 +#define Z_DIAG_PIN PA11 +#define E0_DIAG_PIN PC4 +#define E1_DIAG_PIN PE7 + +#define X_STOP_PIN PA15 +#define Y_STOP_PIN PA12 +#define Z_MIN_PIN PA11 +#define Z_MAX_PIN PC4 + +// +// Steppers +// +#define X_ENABLE_PIN PE4 +#define X_STEP_PIN PE3 +#define X_DIR_PIN PE2 +#ifndef X_CS_PIN + #define X_CS_PIN PD5 +#endif + +#define Y_ENABLE_PIN PE1 +#define Y_STEP_PIN PE0 +#define Y_DIR_PIN PB9 +#ifndef Y_CS_PIN + #define Y_CS_PIN PD7 +#endif + +#define Z_ENABLE_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB4 +#ifndef Z_CS_PIN + #define Z_CS_PIN PD4 +#endif + +#define E0_ENABLE_PIN PB3 +#define E0_STEP_PIN PD6 +#define E0_DIR_PIN PD3 +#ifndef E0_CS_PIN + #define E0_CS_PIN PD9 +#endif + +#define E1_ENABLE_PIN PA3 +#define E1_STEP_PIN PD15 +#define E1_DIR_PIN PA1 +#ifndef E1_CS_PIN + #define E1_CS_PIN PD8 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PD14 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PD1 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PD0 + #endif +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + + #define X_SERIAL_TX_PIN PD5 + #define X_SERIAL_RX_PIN PD5 + + #define Y_SERIAL_TX_PIN PD7 + #define Y_SERIAL_RX_PIN PD7 + + #define Z_SERIAL_TX_PIN PD4 + #define Z_SERIAL_RX_PIN PD4 + + #define E0_SERIAL_TX_PIN PD9 + #define E0_SERIAL_RX_PIN PD9 + + #define E1_SERIAL_TX_PIN PD8 + #define E1_SERIAL_RX_PIN PD8 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif // TMC2208 || TMC2209 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // TH1 +#define TEMP_1_PIN PC2 // TH2 +#define TEMP_BED_PIN PC0 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC3 // HEATER1 +#define HEATER_1_PIN PB0 // HEATER2 +#define HEATER_BED_PIN PA0 // HOT BED + +#define FAN_PIN PB1 // FAN + +// +// Thermocouples +// +//#define MAX6675_SS_PIN PE5 // TC1 - CS1 +//#define MAX6675_SS_PIN PE6 // TC2 - CS2 + +// +// Misc. Functions +// +#define POWER_LOSS_PIN PA2 // PW_DET +#define PS_ON_PIN PA3 // PW_OFF + +//#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY +//#define SUICIDE_PIN_INVERTING false + +//#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY +//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY + +#define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY + +//#define LED_PIN PB2 + +#define MT_DET_1_PIN PA4 +#define MT_DET_2_PIN PE6 +#define MT_DET_PIN_INVERTING false + +#define WIFI_IO0_PIN PC13 + +// +// SD Card +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define SDIO_SUPPORT +#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SD_DETECT_PIN PD12 +#define ONBOARD_SD_CS_PIN PC11 + +// +// LCD / Controller +// +#define BEEPER_PIN PC5 + +/** + * Note: MKS Robin TFT screens use various TFT controllers. + * If the screen stays white, disable 'LCD_RESET_PIN' + * to let the bootloader init the screen. + */ + +#if ENABLED(TFT_LVGL_UI_SPI) + + #define SPI_TFT_CS_PIN PD11 + #define SPI_TFT_SCK_PIN PA5 + #define SPI_TFT_MISO_PIN PA6 + #define SPI_TFT_MOSI_PIN PA7 + #define SPI_TFT_DC_PIN PD10 + #define SPI_TFT_RST_PIN PC6 + + #define LCD_BACKLIGHT_PIN PD13 + + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + +#else + #if ENABLED(TFT_LITTLE_VGL_UI) + //FSMC LCD + #define FSMC_CS_PIN PD7 // NE4 + #define FSMC_RS_PIN PD11 // A0 + + #define TOUCH_CS_PIN PA7 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + + #define LCD_BACKLIGHT_PIN PD13 + + #endif // TFT_LITTLE_VGL_UI + +#endif // TFT_LVGL_UI_SPI + +#if HAS_SPI_LCD + + #define BEEPER_PIN PC5 + #define BTN_ENC PE13 + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + #define LCD_BACKLIGHT_PIN -1 + + // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) + #if ENABLED(MKS_MINI_12864) + #define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN -1 + #define DOGLCD_A0 PD11 + #define DOGLCD_CS PE15 + #define DOGLCD_SCK PA5 + #define DOGLCD_MOSI PA7 + + // Required for MKS_MINI_12864 with this board + #define MKS_LCD12864B + #undef SHOW_BOOTSCREEN + + #else // !MKS_MINI_12864 + + #define LCD_PINS_D4 PE14 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PE15 + #define LCD_PINS_D6 PD11 + #define LCD_PINS_D7 PD10 + #endif + + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #endif + + #endif // !MKS_MINI_12864 + +#endif // HAS_SPI_LCD + +#define SPI_FLASH +#if ENABLED(SPI_FLASH) + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif diff --git a/buildroot/share/PlatformIO/scripts/download_mks_assets.py b/buildroot/share/PlatformIO/scripts/download_mks_assets.py new file mode 100644 index 000000000000..ae2ce467e84a --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/download_mks_assets.py @@ -0,0 +1,46 @@ +Import("env") +import os +import requests +import zipfile +import tempfile +import shutil + +url = "https://github.com/makerbase-mks/Mks-Robin-Nano-Marlin2.0-Firmware/archive/master.zip" +zip_path = os.path.join(env.Dictionary("PROJECT_LIBDEPS_DIR"), "mks-assets.zip") +assets_path = os.path.join(env.Dictionary("PROJECT_BUILD_DIR"), env.Dictionary("PIOENV"), "assets") + +def download_mks_assets(): + print("Downloading MKS Assets") + r = requests.get(url, stream=True) + # the user may have a very clean workspace, + # so create the PROJECT_LIBDEPS_DIR directory if not exits + if os.path.exists(env.Dictionary("PROJECT_LIBDEPS_DIR")) == False: + os.mkdir(env.Dictionary("PROJECT_LIBDEPS_DIR")) + with open(zip_path, 'wb') as fd: + for chunk in r.iter_content(chunk_size=128): + fd.write(chunk) + +def copy_mks_assets(): + print("Copying MKS Assets") + output_path = tempfile.mkdtemp() + zip_obj = zipfile.ZipFile(zip_path, 'r') + zip_obj.extractall(output_path) + zip_obj.close() + if os.path.exists(assets_path) == True and os.path.isdir(assets_path) == False: + os.unlink(assets_path) + if os.path.exists(assets_path) == False: + os.mkdir(assets_path) + base_path = '' + for filename in os.listdir(output_path): + base_path = filename + for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_font')): + shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_font', filename), assets_path) + for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_pic')): + shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_pic', filename), assets_path) + shutil.rmtree(output_path, ignore_errors=True) + +if os.path.exists(zip_path) == False: + download_mks_assets() + +if os.path.exists(assets_path) == False: + copy_mks_assets() diff --git a/platformio.ini b/platformio.ini index 6ad1916a936a..743499e89944 100644 --- a/platformio.ini +++ b/platformio.ini @@ -37,8 +37,9 @@ lib_deps = # Feature Dependencies # [features] -TFT_LVGL_UI = MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip +HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip src_filter=+ + extra_scripts=download_mks_assets.py HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip DIGIPOT_MCP4... = SlowSoftI2CMaster @@ -525,7 +526,7 @@ build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -DBOARD_generic_stm32f103v -DDEBUG_LEVEL=DEBUG_NONE -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 -upload_protocol = serial +upload_protocol = serial # # Longer 3D board in Alfawise U20 (STM32F103VET6) @@ -555,7 +556,7 @@ build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE # -# MKS Robin Nano (STM32F103VET6) - Emulated Graphical 128x64 (DOGM) UI +# MKS Robin Nano (STM32F103VET6) - Emulated Graphical 128x64 (DOGM) UI and LVGL UI # [env:mks_robin_nano] platform = ${common_stm32f1.platform} @@ -567,6 +568,18 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 +# +# MKS Robin Nano v2.0 (STM32F103VET6) - LVGL UI +# +[env:mks_robin_nano35_v2] +platform = ${common_stm32f1.platform} +extends = env:mks_robin_nano +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +lib_deps = ${common_stm32f1.lib_deps} +debug_tool = jlink +upload_protocol = jlink + # # MKS Robin (STM32F103ZET6) # @@ -753,8 +766,8 @@ extra_scripts = ${common.extra_scripts} # FYSETC S6 (STM32F446VET6 ARM Cortex-M4) # [env:FYSETC_S6] -platform = ${common_stm32.platform} -extends = common_stm32 +platform = ${common_stm32.platform} +extends = common_stm32 platform_packages = ${common_stm32.platform_packages} tool-stm32duino board = fysetc_s6 From bc688f27dc6db76021da584bc529f29ddb6f6cce Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 25 Jul 2020 01:53:07 -0500 Subject: [PATCH 222/483] Clean up after changes --- Marlin/Configuration.h | 13 ++-- Marlin/src/HAL/STM32/HAL.cpp | 2 +- .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 5 +- Marlin/src/HAL/STM32/fastio.h | 2 + .../src/HAL/STM32F1/inc/Conditionals_post.h | 5 ++ Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 -- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 2 +- .../lib/mks_ui/draw_advance_settings.cpp | 2 +- .../extui/lib/mks_ui/draw_machine_para.cpp | 6 +- .../lib/mks_ui/draw_machine_settings.cpp | 6 +- .../extui/lib/mks_ui/draw_motor_settings.cpp | 6 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_print_file.cpp | 10 ++-- .../mks_ui/draw_tmc_step_mode_settings.cpp | 10 ++-- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 38 ++++++------ Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 60 +++++++++---------- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 9 +-- 17 files changed, 88 insertions(+), 94 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f2524cadb1d9..60f7ed159cd6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2142,6 +2142,7 @@ // // FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) +// Upscaled 128x64 Marlin UI // //#define FSMC_GRAPHICAL_TFT @@ -2149,17 +2150,11 @@ // TFT LVGL UI // // Using default MKS icons and fonts from: https://git.io/JJvzK -// Just copy the `assets` folder from the build directory to the +// Just copy the 'assets' folder from the build directory to the // root of your SD card, together with the compiled firmware. // -// Robin nano v1.2 uses FSMC -// -//#define TFT_LVGL_UI_FSMC - -// Robin nano v2.0 uses SPI -// -//#define TFT_LVGL_UI_SPI - +//#define TFT_LVGL_UI_FSMC // Robin nano v1.2 uses FSMC +//#define TFT_LVGL_UI_SPI // Robin nano v2.0 uses SPI //============================================================================= //============================ Other Controllers ============================ diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index 8a619bfb5071..b1b727ce195b 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -63,7 +63,7 @@ uint16_t HAL_adc_result; void HAL_init() { FastIO_init(); - #if ENABLED(SDSUPPORT) + #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up #endif diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index bab77b55daf1..9d32b342e440 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -41,8 +41,7 @@ } bool SDIO_Init() { - if (hsd.State == HAL_SD_STATE_READY) return 1; // return passing status - return 0; // return failing status + return hsd.State == HAL_SD_STATE_READY; // return pass/fail status } bool SDIO_ReadBlock(uint32_t block, uint8_t *src) { @@ -58,7 +57,6 @@ #else // !USBD_USE_CDC_COMPOSITE // use local drivers - #if defined(STM32F103xE) || defined(STM32F103xG) #include #include @@ -274,7 +272,6 @@ bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { hsd.Instance = SDIO; uint8_t retryCnt = SD_RETRY_COUNT; - bool status; for (;;) { status = (bool) HAL_SD_WriteBlocks(&hsd, (uint8_t*)src, block, 1, 500); // write one 512 byte block with 500mS timeout diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h index 38a2e28cfb3b..d90b2fbeb02d 100644 --- a/Marlin/src/HAL/STM32/fastio.h +++ b/Marlin/src/HAL/STM32/fastio.h @@ -64,12 +64,14 @@ void FastIO_init(); // Must be called before using fast io macros #define _GET_MODE(IO) #define _SET_MODE(IO,M) pinMode(IO, M) #define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ +#define _SET_OUTPUT_OD(IO) pinMode(IO, OUTPUT_OPEN_DRAIN) #define WRITE(IO,V) _WRITE(IO,V) #define READ(IO) _READ(IO) #define TOGGLE(IO) _TOGGLE(IO) #define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) +#define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0) #define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ #define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h index 5fd916624191..656fbe1ce259 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h @@ -27,3 +27,8 @@ #elif EITHER(I2C_EEPROM, SPI_EEPROM) #define USE_SHARED_EEPROM 1 #endif + +// Allow SDSUPPORT to be disabled +#if DISABLED(SDSUPPORT) + #undef SDIO_SUPPORT +#endif diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index 47f4f59b219b..5559b3d4a480 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -29,10 +29,6 @@ #error "EMERGENCY_PARSER is not yet implemented for STM32F1. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(SDIO_SUPPORT) && DISABLED(SDSUPPORT) - #error "SDIO_SUPPORT requires SDSUPPORT. Enable SDSUPPORT to continue." -#endif - #if ENABLED(FAST_PWM_FAN) #error "FAST_PWM_FAN is not yet implemented for this platform." #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index dbd6f4c117b4..fc7a22b26143 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -597,7 +597,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u case U8G_DEV_MSG_INIT: dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); - switch(lcd_id & 0xFFFF) { + switch (lcd_id & 0xFFFF) { case 0x8552: // ST7789V #ifdef LCD_USE_DMA_FSMC writeEscSequence(st7789v_init); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp index dabecfb9de2e..7d3eab436bd9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -95,7 +95,7 @@ void lv_draw_advance_settings(void) { buttonPausePos = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonPausePos, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonPausePos, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMachine, event_handler); + //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonPausePos, event_handler, ID_PAUSE_POS, NULL, 0); lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp index af16367b651d..d441f2ac51b8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -137,7 +137,7 @@ void lv_draw_machine_para(void) { buttonMachine = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonMachine, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonMachine, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMachine, event_handler); + //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonMachine, event_handler, ID_PARA_MACHINE, NULL, 0); lv_btn_set_style(buttonMachine, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonMachine, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ @@ -159,7 +159,7 @@ void lv_draw_machine_para(void) { buttonMotor = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonMotor, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ lv_obj_set_size(buttonMotor, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMotor, event_handler); + //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonMotor, event_handler, ID_PARA_MOTOR, NULL, 0); lv_btn_set_style(buttonMotor, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonMotor, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ @@ -181,7 +181,7 @@ void lv_draw_machine_para(void) { buttonAdvance = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonAdvance, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ lv_obj_set_size(buttonAdvance, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMotor, event_handler); + //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonAdvance, event_handler, ID_PARA_ADVANCE, NULL, 0); lv_btn_set_style(buttonAdvance, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonAdvance, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp index 982dd4408b9e..88a66c6599e1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -144,7 +144,7 @@ void lv_draw_machine_settings(void) { buttonAcceleration = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonAcceleration, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMachine, event_handler); + //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonAcceleration, event_handler, ID_MACHINE_ACCELERATION, NULL, 0); lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ @@ -166,7 +166,7 @@ void lv_draw_machine_settings(void) { buttonMaxFeedrate = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonMaxFeedrate, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ lv_obj_set_size(buttonMaxFeedrate, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMachine, event_handler); + //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonMaxFeedrate, event_handler, ID_MACHINE_FEEDRATE, NULL, 0); lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ @@ -189,7 +189,7 @@ void lv_draw_machine_settings(void) { buttonJerk = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonJerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ lv_obj_set_size(buttonJerk, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMotor, event_handler); + //lv_obj_set_event_cb(buttonMotor, event_handler); lv_obj_set_event_cb_mks(buttonJerk, event_handler, ID_MACHINE_JERK, NULL, 0); lv_btn_set_style(buttonJerk, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonJerk, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp index 1d8f80b9b4c6..7da477bd51f3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -147,7 +147,7 @@ void lv_draw_motor_settings(void) { buttonSteps = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonSteps, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ lv_obj_set_size(buttonSteps, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMachine, event_handler); + //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonSteps, event_handler, ID_MOTOR_STEPS, NULL, 0); lv_btn_set_style(buttonSteps, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonSteps, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ @@ -169,7 +169,7 @@ void lv_draw_motor_settings(void) { buttonTMCcurrent = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonTMCcurrent, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ lv_obj_set_size(buttonTMCcurrent, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMachine, event_handler); + //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonTMCcurrent, event_handler, ID_MOTOR_TMC_CURRENT, NULL, 0); lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ @@ -192,7 +192,7 @@ void lv_draw_motor_settings(void) { buttonStepMode = lv_btn_create(scr, NULL); /*Add a button the current screen*/ lv_obj_set_pos(buttonStepMode, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ lv_obj_set_size(buttonStepMode, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - // lv_obj_set_event_cb(buttonMachine, event_handler); + //lv_obj_set_event_cb(buttonMachine, event_handler); lv_obj_set_event_cb_mks(buttonStepMode, event_handler, ID_MOTOR_STEP_MODE, NULL, 0); lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 555c228f0027..e0d29467e616 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -228,7 +228,7 @@ void lv_draw_move_motor(void) { lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel); - // lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); + //lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, &bmp_pic); lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, &bmp_pic); lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 84853cff9d09..33405a905fe4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -72,12 +72,14 @@ uint8_t sel_id = 0; const uint16_t nr = SD_ORDER(i, fileCnt); card.getfilename_sorted(nr); - if (card.flag.filenameIsDir) + if (card.flag.filenameIsDir) { //SERIAL_ECHOLN(card.longest_filename); list_file.IsFolder[valid_name_cnt] = 1; - else + } + else { //SERIAL_ECHOLN(card.longFilename); list_file.IsFolder[valid_name_cnt] = 0; + } #if 1 // @@ -523,7 +525,7 @@ void lv_gcode_file_read(uint8_t *data_buf) { //Color = (*p_index >> 8); //*p_index = Color | ((*p_index & 0xff) << 8); i += 2; - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // 0x18C3; // + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // 0x18C3; } #endif // TFT_LVGL_UI_SPI memcpy(data_buf, public_buf, 200); @@ -556,7 +558,7 @@ void cutFileName(char *path, int len, int bytePerLine, char *outStr) { #endif beginIndex = (strIndex1 != 0 - // && (strIndex2 != 0) && (strIndex1 < strIndex2) + //&& (strIndex2 != 0) && (strIndex1 < strIndex2) ) ? strIndex1 + 1 : tmpFile; if (strIndex2 == 0 || (strIndex1 > strIndex2)) { // not gcode file diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp index 5e776a1c6745..b0d40fde28db 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -73,7 +73,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { stepperX.refresh_stepping_mode(); lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, "bmp_disable.bin", 0); lv_label_set_text(labelXState, machine_menu.disable); - // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); // gcode.process_subcommands_now_P(PSTR("M500")); } else { @@ -96,7 +96,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { stepperY.refresh_stepping_mode(); lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, "bmp_disable.bin", 0); lv_label_set_text(labelYState, machine_menu.disable); - // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } else { stepperY.stored.stealthChop_enabled = true; @@ -117,7 +117,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { stepperZ.refresh_stepping_mode(); lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, "bmp_disable.bin", 0); lv_label_set_text(labelZState, machine_menu.disable); - // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } else { stepperZ.stored.stealthChop_enabled = true; @@ -138,7 +138,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { stepperE0.refresh_stepping_mode(); lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, "bmp_disable.bin", 0); lv_label_set_text(labelE0State, machine_menu.disable); - // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } else { stepperE0.stored.stealthChop_enabled = true; @@ -160,7 +160,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) { stepperE1.refresh_stepping_mode(); lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, "bmp_disable.bin", 0); lv_label_set_text(labelE1State, machine_menu.disable); - // lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); + //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); } else { stepperE1.stored.stealthChop_enabled = true; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index 2e6d164c0bb0..91dd2f36ab9e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -125,7 +125,7 @@ void lv_draw_tool(void) { scr = lv_obj_create(NULL, NULL); - // static lv_style_t tool_style; + //static lv_style_t tool_style; lv_obj_set_style(scr, &tft_style_scr); lv_scr_load(scr); @@ -182,17 +182,17 @@ void lv_draw_tool(void) { lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_PR, &tft_style_label_pre); lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_REL, &tft_style_label_rel); - // lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,"bmp_Filamentchange.bin",0); - // lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic); - // lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic); - // lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); - // lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); + //lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,"bmp_Filamentchange.bin",0); + //lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic); + //lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic); + //lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); - // lv_obj_set_event_cb_mks(buttonMore, event_handler,ID_T_MORE,"bmp_More.bin",0); - // lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_REL, &bmp_pic); - // lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_PR, &bmp_pic); - // lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_PR, &tft_style_label_pre); - // lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_REL, &tft_style_label_rel); + //lv_obj_set_event_cb_mks(buttonMore, event_handler,ID_T_MORE,"bmp_More.bin",0); + //lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_REL, &bmp_pic); + //lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_PR, &bmp_pic); + //lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_PR, &tft_style_label_pre); + //lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_REL, &tft_style_label_rel); lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_T_RETURN, "bmp_return.bin", 0); lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic); @@ -206,8 +206,8 @@ void lv_draw_tool(void) { lv_obj_set_pos(buttonMove, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); lv_obj_set_pos(buttonHome, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); lv_obj_set_pos(buttonLevel, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - // lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - // lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + //lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); + //lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); /*Create a label on the Image button*/ @@ -216,8 +216,8 @@ void lv_draw_tool(void) { lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); lv_btn_set_layout(buttonHome, LV_LAYOUT_OFF); lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); - // lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); - // lv_btn_set_layout(buttonMore, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonMore, LV_LAYOUT_OFF); lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); lv_obj_t * labelPreHeat = lv_label_create(buttonPreHeat, NULL); @@ -251,11 +251,11 @@ void lv_draw_tool(void) { lv_label_set_text(label_Level, tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling)); lv_obj_align(label_Level, buttonLevel, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - // lv_label_set_text(label_Filament, tool_menu.filament); - // lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + //lv_label_set_text(label_Filament, tool_menu.filament); + //lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - // lv_label_set_text(label_More, tool_menu.more); - // lv_obj_align(label_More, buttonMore, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + //lv_label_set_text(label_More, tool_menu.more); + //lv_obj_align(label_More, buttonMore, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); lv_label_set_text(label_Back, common_menu.text_back); lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 75e9b7cdc8a1..5fb3bf6d7316 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -361,7 +361,7 @@ char *getDispText(int index) { strcpy(public_buf_l, tool_menu.title); break; case WIFI_LIST_UI: - // strcpy(public_buf_l, list_menu.title); + //strcpy(public_buf_l, list_menu.title); break; case MACHINE_PARA_UI: strcpy(public_buf_l, MachinePara_menu.title); @@ -386,7 +386,7 @@ char *creat_title_text() { ZERO(tmpCurFileStr); #if _LFN_UNICODE - // cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr); + //cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr); #else cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr); #endif @@ -434,8 +434,8 @@ char *creat_title_text() { void preview_gcode_prehandle(char *path) { #if ENABLED(SDSUPPORT) - // uint8_t re; - // uint32_t read; + //uint8_t re; + //uint32_t read; uint32_t pre_read_cnt = 0; uint32_t *p1; char *cur_name; @@ -468,11 +468,11 @@ char *creat_title_text() { void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { #if ENABLED(SDSUPPORT) - // uint8_t ress; - // uint32_t write; + //uint8_t ress; + //uint32_t write; volatile uint32_t i, j; volatile uint16_t *p_index; - // int res; + //int res; char *cur_name; cur_name = strrchr(path, '/'); @@ -493,12 +493,12 @@ char *creat_title_text() { } } - // SERIAL_ECHOLNPAIR("gPicturePreviewStart: ", gPicturePreviewStart, " PREVIEW_LITTLE_PIC_SIZE: ", PREVIEW_LITTLE_PIC_SIZE); + //SERIAL_ECHOLNPAIR("gPicturePreviewStart: ", gPicturePreviewStart, " PREVIEW_LITTLE_PIC_SIZE: ", PREVIEW_LITTLE_PIC_SIZE); card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); #if ENABLED(TFT_LVGL_UI_SPI) SPI_TFT.spi_init(SPI_FULL_SPEED); - // SPI_TFT.SetCursor(0,0); + //SPI_TFT.SetCursor(0,0); SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); SPI_TFT.LCD_WriteRAM_Prepare(); #else @@ -534,7 +534,7 @@ char *creat_title_text() { #else for (i = 0; i < 400;) { p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // gCfgItems.preview_bk_color; + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color; LCD_IO_WriteData(*p_index); i += 2; } @@ -550,7 +550,7 @@ char *creat_title_text() { row = 0; gcode_preview_over = 0; - // flash_preview_begin = 1; + //flash_preview_begin = 1; card.closefile(); @@ -586,7 +586,7 @@ char *creat_title_text() { card.openFileRead(cur_name); if (card.isFileOpen()) { feedrate_percentage = 100; - // saved_feedrate_percentage = feedrate_percentage; + //saved_feedrate_percentage = feedrate_percentage; planner.flow_percentage[0] = 100; planner.e_factor[0] = planner.flow_percentage[0] * 0.01; if (EXTRUDERS == 2) { @@ -607,11 +607,11 @@ char *creat_title_text() { void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { #if ENABLED(SDSUPPORT) - // uint8_t ress; - // uint32_t write; + //uint8_t ress; + //uint32_t write; volatile uint32_t i, j; volatile uint16_t *p_index; - // int res; + //int res; char *cur_name; uint16_t Color; @@ -621,7 +621,7 @@ char *creat_title_text() { card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); #if ENABLED(TFT_LVGL_UI_SPI) SPI_TFT.spi_init(SPI_FULL_SPEED); - // SPI_TFT.SetCursor(0,0); + //SPI_TFT.SetCursor(0,0); SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); SPI_TFT.LCD_WriteRAM_Prepare(); #else @@ -685,7 +685,7 @@ char *creat_title_text() { row = 0; gcode_preview_over = 0; - // flash_preview_begin = 1; + //flash_preview_begin = 1; card.closefile(); @@ -721,7 +721,7 @@ char *creat_title_text() { card.openFileRead(cur_name); if (card.isFileOpen()) { feedrate_percentage = 100; - // saved_feedrate_percentage = feedrate_percentage; + //saved_feedrate_percentage = feedrate_percentage; planner.flow_percentage[0] = 100; planner.e_factor[0] = planner.flow_percentage[0] * 0.01; if (EXTRUDERS == 2) { @@ -779,9 +779,9 @@ char *creat_title_text() { i = 0; #if ENABLED(TFT_LVGL_UI_SPI) - // SPI_TFT.spi_init(SPI_FULL_SPEED); - // SPI_TFT.SetWindows(xpos_pixel, y_off * 20+ypos_pixel, 200,20); //200*200 - // SPI_TFT.LCD_WriteRAM_Prepare(); + //SPI_TFT.spi_init(SPI_FULL_SPEED); + //SPI_TFT.SetWindows(xpos_pixel, y_off * 20+ypos_pixel, 200,20); //200*200 + //SPI_TFT.LCD_WriteRAM_Prepare(); int j = 0; for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { SPI_TFT.spi_init(SPI_FULL_SPEED); @@ -789,7 +789,7 @@ char *creat_title_text() { SPI_TFT.LCD_WriteRAM_Prepare(); j++; - // memcpy(public_buf,&bmp_public_buf[i],400); + //memcpy(public_buf,&bmp_public_buf[i],400); SPI_TFT_CS_L; SPI_TFT_DC_H; SPI.dmaSend(&bmp_public_buf[i], 400, true); @@ -814,13 +814,13 @@ char *creat_title_text() { else { p_index = (uint16_t *)(&bmp_public_buf[i]); } - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // gCfgItems.preview_bk_color; + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; //gCfgItems.preview_bk_color; LCD_IO_WriteData(*p_index); i += 2; } if (i >= 8000) break; } - #endif // if ENABLED(TFT_LVGL_UI_SPI) + #endif // TFT_LVGL_UI_SPI y_off++; } W25QXX.init(SPI_QUARTER_SPEED); @@ -841,7 +841,7 @@ char *creat_title_text() { } #endif } -#endif // if HAS_GCODE_PREVIEW +#endif // HAS_GCODE_PREVIEW void print_time_run() { static uint8_t lastSec = 0; @@ -866,7 +866,7 @@ void GUI_RefreshPage() { switch (disp_state) { case MAIN_UI: - // lv_draw_ready_print(); + //lv_draw_ready_print(); break; case EXTRUSION_UI: if (temperature_change_frequency == 1) { @@ -1053,7 +1053,7 @@ void clear_cur_ui() { switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { case PRINT_READY_UI: - // Get_Temperature_Flg = 0; + //Get_Temperature_Flg = 0; lv_clear_ready_print(); break; case PRINT_FILE_UI: @@ -1251,7 +1251,7 @@ void clear_cur_ui() { default: break; } - // GUI_Clear(); + //GUI_Clear(); } void draw_return_ui() { @@ -1501,14 +1501,14 @@ void print_time_count() { } void LV_TASK_HANDLER() { - // lv_tick_inc(1); + //lv_tick_inc(1); lv_task_handler(); if (mks_test_flag == 0x1e) mks_hardware_test(); #if HAS_GCODE_PREVIEW disp_pre_gcode(2, 36); #endif GUI_RefreshPage(); - // sd_detection(); + //sd_detection(); } #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index efec3edcd9cd..dd0d1e9465ef 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -253,9 +253,8 @@ #define BEEPER_PIN PC5 #define BTN_ENC PE13 -#else - #if ENABLED(TFT_LITTLE_VGL_UI) - //FSMC LCD +#elif ENABLED(TFT_LITTLE_VGL_UI) + #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -266,9 +265,7 @@ #define LCD_BACKLIGHT_PIN PD13 - #endif // TFT_LITTLE_VGL_UI - -#endif // TFT_LVGL_UI_SPI +#endif #if HAS_SPI_LCD From 11702dc0596ad04a72628fd352622c2cf8249f94 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 25 Jul 2020 04:10:12 -0500 Subject: [PATCH 223/483] Update (c) --- Marlin/src/feature/power_monitor.cpp | 2 +- Marlin/src/feature/power_monitor.h | 2 +- Marlin/src/gcode/feature/power_monitor/M430.cpp | 2 +- Marlin/src/lcd/menu/menu_power_monitor.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp index 956135d26e90..bf5ac748a86e 100644 --- a/Marlin/src/feature/power_monitor.cpp +++ b/Marlin/src/feature/power_monitor.cpp @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index 8dd79da6d2d5..ca52ed74c6bc 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp index 08e2d96cc001..a669f0a76b42 100644 --- a/Marlin/src/gcode/feature/power_monitor/M430.cpp +++ b/Marlin/src/gcode/feature/power_monitor/M430.cpp @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm diff --git a/Marlin/src/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp index 1627e7c80b32..bacf7f379f30 100644 --- a/Marlin/src/lcd/menu/menu_power_monitor.cpp +++ b/Marlin/src/lcd/menu/menu_power_monitor.cpp @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm From 6f26ed23ee0c3fd64bd3521f657e6755b5cacc1a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 25 Jul 2020 17:57:16 -0300 Subject: [PATCH 224/483] Fix ui.external_control compile error (#18778) --- Marlin/src/lcd/ultralcd.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 9968a3218ae2..88a9c36b3642 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -753,19 +753,19 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { //SERIAL_ECHOLNPAIR("Post Move with Axis ", int(axis), " soon."); } -#endif // HAS_LCD_MENU - -#if ENABLED(AUTO_BED_LEVELING_UBL) + #if ENABLED(AUTO_BED_LEVELING_UBL) - void MarlinUI::external_encoder() { - if (external_control && encoderDiff) { - ubl.encoder_diff += encoderDiff; // Encoder for UBL G29 mesh editing - encoderDiff = 0; // Hide encoder events from the screen handler - refresh(LCDVIEW_REDRAW_NOW); // ...but keep the refresh. + void MarlinUI::external_encoder() { + if (external_control && encoderDiff) { + ubl.encoder_diff += encoderDiff; // Encoder for UBL G29 mesh editing + encoderDiff = 0; // Hide encoder events from the screen handler + refresh(LCDVIEW_REDRAW_NOW); // ...but keep the refresh. + } } - } -#endif + #endif + +#endif // HAS_LCD_MENU /** * Update the LCD, read encoder buttons, etc. @@ -1283,7 +1283,9 @@ void MarlinUI::update() { case encrot2: ENCODER_SPIN(encrot1, encrot3); break; case encrot3: ENCODER_SPIN(encrot2, encrot0); break; } - TERN_(AUTO_BED_LEVELING_UBL, external_encoder()); + #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) + external_encoder(); + #endif lastEncoderBits = enc; } From 0dbebc283525044688ffbc91b50b3ed0a2ac018c Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 26 Jul 2020 00:09:32 +0000 Subject: [PATCH 225/483] [cron] Bump distribution date (2020-07-26) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 834f46da64df..3f8df1517ca8 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-25" + #define STRING_DISTRIBUTION_DATE "2020-07-26" #endif /** From 89722d2196741dad4b5981d9806b156a5486e4ed Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 25 Jul 2020 22:52:44 -0300 Subject: [PATCH 226/483] Fix search for best compiler (#18779) --- .../scripts/common-features-dependencies.h | 31 ++++-- .../scripts/common-features-dependencies.py | 99 ++++++++++++------- 2 files changed, 88 insertions(+), 42 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.h b/buildroot/share/PlatformIO/scripts/common-features-dependencies.h index 61e9dc79e5f7..f6abdbf36179 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.h @@ -27,15 +27,11 @@ * Used by common-features-dependencies.py */ -#ifndef __MARLIN_FIRMWARE__ -#define __MARLIN_FIRMWARE__ -#endif - -// -// Prefix header to acquire configurations -// #include +// Include platform headers +//#include "../../../../Marlin/src/HAL/platforms.h" + #include "../../../../Marlin/src/core/boards.h" #include "../../../../Marlin/src/core/macros.h" #include "../../../../Marlin/Configuration.h" @@ -44,7 +40,28 @@ #include "../../../../Marlin/src/inc/Conditionals_LCD.h" +#ifdef HAL_PATH + #include HAL_PATH(../../../../Marlin/src/HAL, inc/Conditionals_LCD.h) +#endif + #include "../../../../Marlin/src/core/drivers.h" #include "../../../../Marlin/Configuration_adv.h" #include "../../../../Marlin/src/inc/Conditionals_adv.h" + +#ifdef HAL_PATH + #include HAL_PATH(../../../../Marlin/src/HAL, inc/Conditionals_adv.h) +#endif + +//#include "../../../../Marlin/src/pins/pins.h" + +#ifdef HAL_PATH + #include HAL_PATH(../../../../Marlin/src/HAL, timers.h) + #include HAL_PATH(../../../../Marlin/src/HAL, spi_pins.h) +#endif + +#include "../../../../Marlin/src/inc/Conditionals_post.h" + +#ifdef HAL_PATH + #include HAL_PATH(../../../../Marlin/src/HAL, inc/Conditionals_post.h) +#endif diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py index 48081bbd4655..c8b7ec9a9709 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-features-dependencies.py @@ -30,12 +30,8 @@ def load_config(): parts = dep.split('=') name = parts.pop(0) rest = '='.join(parts) - if name == 'extra_scripts': - FEATURE_DEPENDENCIES[ukey]['extra_scripts'] = rest - elif name == 'src_filter': - FEATURE_DEPENDENCIES[ukey]['src_filter'] = rest - elif name == 'lib_ignore': - FEATURE_DEPENDENCIES[ukey]['lib_ignore'] = rest + if name in ['extra_scripts', 'src_filter', 'lib_ignore']: + FEATURE_DEPENDENCIES[ukey][name] = rest else: FEATURE_DEPENDENCIES[ukey]['lib_deps'] += [dep] @@ -57,15 +53,14 @@ def get_all_env_libs(): env_libs.append(name) return env_libs -# We need to ignore all non-used libs, -# so if a lib folder lay forgotten in .pio/lib_deps, it -# will not break compiling +# All unused libs should be ignored so that if a library +# exists in .pio/lib_deps it will not break compilation. def force_ignore_unused_libs(): env_libs = get_all_env_libs() known_libs = get_all_known_libs() diff = (list(set(known_libs) - set(env_libs))) lib_ignore = env.GetProjectOption("lib_ignore") + diff - print("Ignoring libs: ", lib_ignore) + print("Ignoring libs:", lib_ignore) proj = env.GetProjectConfig() proj.set("env:" + env["PIOENV"], "lib_ignore", lib_ignore) @@ -84,23 +79,23 @@ def install_features_dependencies(): name, _, _ = PackageManager.parse_pkg_uri(dep) deps_to_add[name] = dep - # first check if the env already have the dep + # Does the env already have the dependency? deps = env.GetProjectOption("lib_deps") for dep in deps: name, _, _ = PackageManager.parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] - # check if we need ignore any lib + # Are there any libraries that should be ignored? lib_ignore = env.GetProjectOption("lib_ignore") for dep in deps: name, _, _ = PackageManager.parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] - # any left? + # Is there anything left? if len(deps_to_add) > 0: - # add only the missing deps + # Only add the missing dependencies proj = env.GetProjectConfig() proj.set("env:" + env["PIOENV"], "lib_deps", deps + list(deps_to_add.values())) @@ -129,45 +124,72 @@ def install_features_dependencies(): proj = env.GetProjectConfig() proj.set("env:" + env["PIOENV"], "lib_ignore", lib_ignore) -# search the current compiler, considering the OS +# +# Find a compiler, considering the OS +# +ENV_BUILD_PATH = os.path.join(env.Dictionary("PROJECT_BUILD_DIR"), env["PIOENV"]) +GCC_PATH_CACHE = os.path.join(ENV_BUILD_PATH, ".gcc_path") def search_compiler(): + if os.path.exists(GCC_PATH_CACHE): + print('Getting g++ path from cache') + with open(GCC_PATH_CACHE, 'r') as f: + return f.read() + + # PlatformIO inserts the toolchain bin folder on the front of the $PATH + # Find the current platform compiler by searching the $PATH if env['PLATFORM'] == 'win32': - # the first path have the compiler - for path in env['ENV']['PATH'].split(';'): - if not re.search(r'platformio\\packages.*\\bin', path): - continue - #print(path) - for file in os.listdir(path): - if file.endswith("g++.exe"): - return file - print("Could not find the g++") - return None + path_separator = ';' + path_regex = r'platformio\\packages.*\\bin' + gcc = "g++.exe" else: - return env.get('CXX') + path_separator = ':' + path_regex = r'platformio/packages.*/bin' + gcc = "g++" + + # Search for the compiler + for path in env['ENV']['PATH'].split(path_separator): + if not re.search(path_regex, path): + continue + for file in os.listdir(path): + if not file.endswith(gcc): + continue + + # Cache the g++ path to no search always + if os.path.exists(ENV_BUILD_PATH): + print('Caching g++ for current env') + with open(GCC_PATH_CACHE, 'w+') as f: + f.write(file) + + return file + file = env.get('CXX') + print("Couldn't find a compiler! Fallback to", file) + return file -# load marlin features +# +# Use the compiler to get a list of all enabled features +# def load_marlin_features(): if "MARLIN_FEATURES" in env: return - # procces defines - # print(env.Dump()) + # Process defines + #print(env.Dump()) build_flags = env.get('BUILD_FLAGS') build_flags = env.ParseFlagsExtended(build_flags) cxx = search_compiler() cmd = [cxx] - # build flags from board.json - # if 'BOARD' in env: - # cmd += [env.BoardConfig().get("build.extra_flags")] + # Build flags from board.json + #if 'BOARD' in env: + # cmd += [env.BoardConfig().get("build.extra_flags")] for s in build_flags['CPPDEFINES']: if isinstance(s, tuple): cmd += ['-D' + s[0] + '=' + str(s[1])] else: cmd += ['-D' + s] - # cmd += ['-w -dM -E -x c++ Marlin/src/inc/MarlinConfigPre.h'] + cmd += ['-w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-features-dependencies.h'] cmd = ' '.join(cmd) print(cmd) @@ -179,15 +201,22 @@ def load_marlin_features(): marlin_features[feature] = definition env["MARLIN_FEATURES"] = marlin_features +# +# Return True if a matching feature is enabled +# def MarlinFeatureIsEnabled(env, feature): load_marlin_features() r = re.compile(feature) matches = list(filter(r.match, env["MARLIN_FEATURES"])) return len(matches) > 0 -# add a method for others scripts to check if a feature is enabled +# +# Add a method for other PIO scripts to query enabled features +# env.AddMethod(MarlinFeatureIsEnabled) -# install all dependencies for features enabled in Configuration.h +# +# Add dependencies for enabled Marlin features +# install_features_dependencies() force_ignore_unused_libs() From 0bc8d315d8346352e0a1c2b993e21b87ed454c63 Mon Sep 17 00:00:00 2001 From: ManuelMcLure Date: Sat, 25 Jul 2020 19:09:56 -0700 Subject: [PATCH 227/483] Close host's Filament Change dialog (#18785) --- Marlin/src/feature/pause.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 291401ca0db7..77f352c399b5 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -271,6 +271,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l } while (TERN0(HAS_LCD_MENU, show_lcd && pause_menu_response == PAUSE_RESPONSE_EXTRUDE_MORE)); #endif + TERN_(HOST_PROMPT_SUPPORT, host_action_prompt_end()); return true; } From e02817b07798b92aa31091c78c16581f0c867923 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 25 Jul 2020 23:40:44 -0300 Subject: [PATCH 228/483] More folders only compiled when their feature is Enabled (#18780) Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_LCD.h | 7 +++ ...s-dependencies.h => common-dependencies.h} | 2 +- ...dependencies.py => common-dependencies.py} | 4 +- platformio.ini | 62 ++++++++++++------- 4 files changed, 50 insertions(+), 25 deletions(-) rename buildroot/share/PlatformIO/scripts/{common-features-dependencies.h => common-dependencies.h} (97%) rename buildroot/share/PlatformIO/scripts/{common-features-dependencies.py => common-dependencies.py} (99%) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 3472cdc7ba81..66e83c5299e4 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -748,3 +748,10 @@ #ifndef EXTRUDE_MINTEMP #define EXTRUDE_MINTEMP 170 #endif + +/** + * To check if we need the folder src/features/leds + */ +#if ANY(TEMP_STAT_LEDS, HAS_COLOR_LEDS, HAS_CASE_LIGHT, PRINTER_EVENT_LEDS, LED_BACKLIGHT_TIMEOUT, PCA9632_BUZZER, LED_CONTROL_MENU) + #define HAS_LED_FEATURE 1 +#endif diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h similarity index 97% rename from buildroot/share/PlatformIO/scripts/common-features-dependencies.h rename to buildroot/share/PlatformIO/scripts/common-dependencies.h index f6abdbf36179..a1f8b095add7 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -24,7 +24,7 @@ /** * The purpose of this file is just include Marlin Configuration files, * to discover which FEATURES are enabled, without any HAL include. - * Used by common-features-dependencies.py + * Used by common-dependencies.py */ #include diff --git a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py similarity index 99% rename from buildroot/share/PlatformIO/scripts/common-features-dependencies.py rename to buildroot/share/PlatformIO/scripts/common-dependencies.py index c8b7ec9a9709..8287c0b2025a 100644 --- a/buildroot/share/PlatformIO/scripts/common-features-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -1,5 +1,5 @@ # -# common-features-dependencies.py +# common-dependencies.py # Convenience script to check dependencies and add libs and sources for Marlin Enabled Features # import subprocess @@ -190,7 +190,7 @@ def load_marlin_features(): else: cmd += ['-D' + s] - cmd += ['-w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-features-dependencies.h'] + cmd += ['-w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] cmd = ' '.join(cmd) print(cmd) define_list = subprocess.check_output(cmd, shell=True).splitlines() diff --git a/platformio.ini b/platformio.ini index 743499e89944..838ce116118e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -25,10 +25,18 @@ include_dir = Marlin # The 'common' values are used for most Marlin builds # [common] -default_src_filter = + - - + - - - - - - - +default_src_filter = + - - + + - - - - + - - - - + - + - + - - + - - + - - + - - + - extra_scripts = - pre:buildroot/share/PlatformIO/scripts/common-features-dependencies.py + pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants lib_deps = @@ -37,24 +45,34 @@ lib_deps = # Feature Dependencies # [features] -HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip - src_filter=+ - extra_scripts=download_mks_assets.py -HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 -SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -DIGIPOT_MCP4... = SlowSoftI2CMaster -HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip -HAS_L64XX = Arduino-L6470@0.8.0 -NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 -MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 -HAS_GRAPHICAL_LCD = U8glib-HAL@0.4.1 - src_filter=+ -USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 -USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 -TOUCH_UI_FTDI_EVE = src_filter=+ -HAS_DGUS_LCD = src_filter=+ -DWIN_CREALITY_LCD = src_filter=+ -HAS_LCD_MENU = src_filter=+ +HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip + src_filter=+ + extra_scripts=download_mks_assets.py +HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 + src_filter=+ +SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip +DIGIPOT_MCP4... = SlowSoftI2CMaster +HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip +HAS_L64XX = Arduino-L6470@0.8.0 +NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 +MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 +HAS_GRAPHICAL_LCD = U8glib-HAL@0.4.1 + src_filter=+ +USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 +USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 +DWIN_CREALITY_LCD = src_filter=+ +HAS_CHARACTER_LCD = src_filter=+ +HAS_LCD_MENU = src_filter=+ +HAS_DGUS_LCD = src_filter=+ +TOUCH_UI_FTDI_EVE = src_filter=+ +ANYCUBIC_TFT_MODEL = src_filter=+ +USB_FLASH_DRIVE_SUPPORT = src_filter=+ +AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ + +MESH_BED_LEVELING = src_filter=+ + +AUTO_BED_LEVELING_UBL = src_filter=+ + +DAC_STEPPER_CURRENT = src_filter=+ +HAS_I2C_DIGIPOT = src_filter=+ +HAS_LED_FEATURE = src_filter=+ (ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer ESP3DLib=https://github.com/luc-github/ESP3DLib.git arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git @@ -699,7 +717,7 @@ src_filter = ${common.default_src_filter} + platform = ${common_stm32f1.platform} extends = common_stm32f1 board = CHITU_F103 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-features-dependencies.py +extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/chitu_crypt.py build_flags = ${common_stm32f1.build_flags} From d0222e5c76276d4bb1c46a4731ec63938f545eb0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 25 Jul 2020 22:57:00 -0500 Subject: [PATCH 229/483] Randomize firmware.bin, fix unflag --- .../PlatformIO/scripts/common-dependencies.py | 30 +++++++++---------- .../share/PlatformIO/scripts/creality.py | 9 +++--- .../share/PlatformIO/scripts/random-bin.py | 5 ++++ platformio.ini | 3 +- 4 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 buildroot/share/PlatformIO/scripts/random-bin.py diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 8287c0b2025a..37efaa37436f 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -47,22 +47,25 @@ def get_all_known_libs(): def get_all_env_libs(): env_libs = [] - lib_deps = env.GetProjectOption("lib_deps") + lib_deps = env.GetProjectOption('lib_deps') for dep in lib_deps: name, _, _ = PackageManager.parse_pkg_uri(dep) env_libs.append(name) return env_libs +def set_env_field(field, value): + proj = env.GetProjectConfig() + proj.set("env:" + env['PIOENV'], field, value) + # All unused libs should be ignored so that if a library # exists in .pio/lib_deps it will not break compilation. def force_ignore_unused_libs(): env_libs = get_all_env_libs() known_libs = get_all_known_libs() diff = (list(set(known_libs) - set(env_libs))) - lib_ignore = env.GetProjectOption("lib_ignore") + diff + lib_ignore = env.GetProjectOption('lib_ignore') + diff print("Ignoring libs:", lib_ignore) - proj = env.GetProjectConfig() - proj.set("env:" + env["PIOENV"], "lib_ignore", lib_ignore) + set_env_field('lib_ignore', lib_ignore) def install_features_dependencies(): load_config() @@ -80,14 +83,14 @@ def install_features_dependencies(): deps_to_add[name] = dep # Does the env already have the dependency? - deps = env.GetProjectOption("lib_deps") + deps = env.GetProjectOption('lib_deps') for dep in deps: name, _, _ = PackageManager.parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] # Are there any libraries that should be ignored? - lib_ignore = env.GetProjectOption("lib_ignore") + lib_ignore = env.GetProjectOption('lib_ignore') for dep in deps: name, _, _ = PackageManager.parse_pkg_uri(dep) if name in deps_to_add: @@ -96,8 +99,7 @@ def install_features_dependencies(): # Is there anything left? if len(deps_to_add) > 0: # Only add the missing dependencies - proj = env.GetProjectConfig() - proj.set("env:" + env["PIOENV"], "lib_deps", deps + list(deps_to_add.values())) + set_env_field('lib_deps', deps + list(deps_to_add.values())) if 'extra_scripts' in FEATURE_DEPENDENCIES[feature]: print("Executing extra_scripts for %s... " % feature) @@ -105,8 +107,7 @@ def install_features_dependencies(): if 'src_filter' in FEATURE_DEPENDENCIES[feature]: print("Adding src_filter for %s... " % feature) - proj = env.GetProjectConfig() - src_filter = ' '.join(env.GetProjectOption("src_filter")) + src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder my_srcs = re.findall( r'[+-](<.*?>)', FEATURE_DEPENDENCIES[feature]['src_filter']) cur_srcs = re.findall( r'[+-](<.*?>)', src_filter) @@ -115,19 +116,18 @@ def install_features_dependencies(): src_filter = re.sub(r'[+-]' + d, '', src_filter) src_filter = FEATURE_DEPENDENCIES[feature]['src_filter'] + ' ' + src_filter - proj.set("env:" + env["PIOENV"], "src_filter", [src_filter]) + set_env_field('src_filter', [src_filter]) env.Replace(SRC_FILTER=src_filter) if 'lib_ignore' in FEATURE_DEPENDENCIES[feature]: print("Ignoring libs for %s... " % feature) - lib_ignore = env.GetProjectOption("lib_ignore") + [FEATURE_DEPENDENCIES[feature]['lib_ignore']] - proj = env.GetProjectConfig() - proj.set("env:" + env["PIOENV"], "lib_ignore", lib_ignore) + lib_ignore = env.GetProjectOption('lib_ignore') + [FEATURE_DEPENDENCIES[feature]['lib_ignore']] + set_env_field('lib_ignore', lib_ignore) # # Find a compiler, considering the OS # -ENV_BUILD_PATH = os.path.join(env.Dictionary("PROJECT_BUILD_DIR"), env["PIOENV"]) +ENV_BUILD_PATH = os.path.join(env.Dictionary('PROJECT_BUILD_DIR'), env['PIOENV']) GCC_PATH_CACHE = os.path.join(ENV_BUILD_PATH, ".gcc_path") def search_compiler(): if os.path.exists(GCC_PATH_CACHE): diff --git a/buildroot/share/PlatformIO/scripts/creality.py b/buildroot/share/PlatformIO/scripts/creality.py index d7b7823356a7..b9d7d7039bb4 100644 --- a/buildroot/share/PlatformIO/scripts/creality.py +++ b/buildroot/share/PlatformIO/scripts/creality.py @@ -5,12 +5,13 @@ for define in env['CPPDEFINES']: if define[0] == "VECT_TAB_ADDR": env['CPPDEFINES'].remove(define) + env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/creality.ld") -for i, flag in enumerate(env["LINKFLAGS"]): + +for i, flag in enumerate(env['LINKFLAGS']): if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script + env['LINKFLAGS'][i] = "-Wl,-T" + custom_ld_script elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - + env['LINKFLAGS'][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/random-bin.py b/buildroot/share/PlatformIO/scripts/random-bin.py new file mode 100644 index 000000000000..4d7ca5dc09b7 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/random-bin.py @@ -0,0 +1,5 @@ +Import("env") + +from datetime import datetime + +env['PROGNAME'] = datetime.now().strftime("firmware-%Y%m%d-%H%M%S") diff --git a/platformio.ini b/platformio.ini index 838ce116118e..429091fbf041 100644 --- a/platformio.ini +++ b/platformio.ini @@ -380,7 +380,7 @@ src_filter = ${common.default_src_filter} + platform = ${common_stm32.platform} build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DHAVE_SW_SERIAL -build_unflags = -std=gnu++11 +build_unflags = -std=gnu11 src_filter = ${common.default_src_filter} + lib_ignore = SPI lib_deps = ${common.lib_deps} @@ -744,6 +744,7 @@ board = genericSTM32F103RC build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DSTM32_XL_DENSITY -DTEMP_TIMER_CHAN=4 extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/random-bin.py buildroot/share/PlatformIO/scripts/creality.py lib_ignore = ${common_stm32f1.lib_ignore} debug_tool = jlink From 3eef000e2a7623d0d1d1f56fbf3109023f5d74c2 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 26 Jul 2020 01:08:30 -0300 Subject: [PATCH 230/483] Fix MKS Robin Nano V2 build / upload (#18784) --- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 7 ++++++ Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 1 + .../extui/lib/mks_ui/mks_hardware_test.cpp | 10 ++++---- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 10 +++++++- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 3 ++- Marlin/src/pins/pins.h | 4 +-- platformio.ini | 25 +++++++------------ 7 files changed, 35 insertions(+), 25 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 5fb3bf6d7316..e8899b9ad122 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -126,6 +126,13 @@ void gCfgItems_init() { W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); } + + uiCfg.F[0] = 'N'; + uiCfg.F[1] = 'A'; + uiCfg.F[2] = 'N'; + uiCfg.F[3] = 'O'; + W25QXX.SPI_FLASH_BlockErase(REFLSHE_FLGA_ADD + 32 - 64*1024); + W25QXX.SPI_FLASH_BufferWrite(uiCfg.F,REFLSHE_FLGA_ADD,4); } void gCfg_to_spiFlah() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 5c114c2ac13f..595565e1c704 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -161,6 +161,7 @@ typedef struct { uint8_t waitEndMoves; uint16_t moveSpeed; float move_dist; + uint8_t F[4]; } UI_CFG; typedef enum { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index 54db9dd5b049..b5b77c50b24b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -590,6 +590,8 @@ void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint1 } void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor) { + // Select TFT SPI so it can receive data + TERN_(TFT_LVGL_UI_SPI, SPI_TFT.spi_init(SPI_FULL_SPEED)); while (*string != '\0') { disp_char_1624(x, y, *string, charColor, bkColor); string++; @@ -599,10 +601,8 @@ void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor //static lv_obj_t * scr_test; void disp_assets_update() { - #if DISABLED(TFT_LVGL_UI_SPI) - LCD_Clear(0x0000); - #endif - disp_string(100, 150, "Assets Updating...", 0xFFFF, 0x0000); + TERN(TFT_LVGL_UI_SPI,, LCD_Clear(0x0000)); + disp_string(100, 140, "Assets Updating...", 0xFFFF, 0x0000); } void disp_assets_update_progress(const char *msg) { @@ -610,7 +610,7 @@ void disp_assets_update_progress(const char *msg) { memset(buf, ' ', COUNT(buf)); strncpy(buf, msg, strlen(msg)); buf[COUNT(buf)-1] = '\0'; - disp_string(100, 200, buf, 0xFFFF, 0x0000); + disp_string(100, 165, buf, 0xFFFF, 0x0000); } uint8_t mks_test_flag = 0; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 3f9af712d1e2..2a16bcf1b3b9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -249,6 +249,7 @@ const char *bakPath = "_assets"; void spiFlashErase_PIC() { volatile uint32_t pic_sectorcnt = 0; + W25QXX.init(SPI_QUARTER_SPEED); for (pic_sectorcnt = 0; pic_sectorcnt < PIC_SIZE_xM * 1024 / 64; pic_sectorcnt++) W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024); } @@ -256,7 +257,8 @@ void spiFlashErase_PIC() { #if HAS_SPI_FLASH_FONT void spiFlashErase_FONT() { volatile uint32_t Font_sectorcnt = 0; - for (Font_sectorcnt = 0; Font_sectorcnt < FONT_SIZE_xM * 1024 / 64; Font_sectorcnt++) + W25QXX.init(SPI_QUARTER_SPEED); + for (Font_sectorcnt = 0; Font_sectorcnt < 32-1; Font_sectorcnt++) W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024); } #endif @@ -386,6 +388,9 @@ uint8_t public_buf[512]; } disp_assets_update_progress(fn); + + W25QXX.init(SPI_QUARTER_SPEED); + uint16_t pbr; uint32_t pfileSize; uint32_t totalSizeLoaded = 0; @@ -444,11 +449,14 @@ uint8_t public_buf[512]; if (dir.open(&root, assetsPath, O_RDONLY)) { disp_assets_update(); + disp_assets_update_progress("Erasing pics..."); spiFlashErase_PIC(); #if HAS_SPI_FLASH_FONT + disp_assets_update_progress("Erasing fonts..."); spiFlashErase_FONT(); #endif + disp_assets_update_progress("Reading files..."); dir_t d; while (dir.readDir(&d, card.longFilename) > 0) { // if we dont get a long name, but gets a short one, try it diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 663a88d8db3a..3ef4ee4f8624 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -120,6 +120,7 @@ extern "C" { /* C-declarations for C++ */ #endif // Flash flag +#define REFLSHE_FLGA_ADD (0X800000-32) #define FLASH_INF_VALID_FLAG 0xAA558761 // SD card information first addr #define VAR_INF_ADDR 0x000000 @@ -139,7 +140,7 @@ typedef struct pic_msg PIC_MSG; #define BMP_WRITE_BUF_LEN 512 -#define PICINFOADDR 0 +#define PICINFOADDR 0x1000 #define PIC_SIZE_xM 6 #define FONT_SIZE_xM 2 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index a8fb3f02f0b9..1b78b0f769ad 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -507,9 +507,9 @@ #elif MB(MKS_ROBIN_MINI) #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini #elif MB(MKS_ROBIN_NANO) - #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano env:mks_robin_nano35 + #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano35 #elif MB(MKS_ROBIN_NANO_V2) - #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano env:mks_robin_nano35 + #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano35 #elif MB(MKS_ROBIN_LITE) #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite #elif MB(BTT_SKR_MINI_V1_1) diff --git a/platformio.ini b/platformio.ini index 429091fbf041..543b837f54d3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -574,27 +574,20 @@ build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE # -# MKS Robin Nano (STM32F103VET6) - Emulated Graphical 128x64 (DOGM) UI and LVGL UI +# MKS Robin Nano (STM32F103VET6) +# v1.2 - Emulated Graphical 128x64 (DOGM) UI and LVGL UI +# v2.0 - LVGL UI # -[env:mks_robin_nano] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -platform_packages = tool-stm32duino -extra_scripts = ${common.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_nano.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE -DSS_TIMER=4 - -# -# MKS Robin Nano v2.0 (STM32F103VET6) - LVGL UI -# -[env:mks_robin_nano35_v2] +[env:mks_robin_nano35] platform = ${common_stm32f1.platform} -extends = env:mks_robin_nano +extends = common_stm32f1 +board = genericSTM32F103VE +platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_nano35.py lib_deps = ${common_stm32f1.lib_deps} +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSS_TIMER=4 debug_tool = jlink upload_protocol = jlink From f949287aec966d200dd14d55c33f974a75ffe9fb Mon Sep 17 00:00:00 2001 From: giryan Date: Sun, 26 Jul 2020 21:31:45 +0100 Subject: [PATCH 231/483] Fix compile-time PWM_PIN (#18793) Co-authored-by: Scott Lahteine --- Marlin/src/inc/SanityCheck.h | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b1f9aab370c4..944620a4e9ab 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2106,27 +2106,33 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #undef _RGB_TEST +#if DISABLED(NO_COMPILE_TIME_PWM) + #define _TEST_PWM(P) PWM_PIN(P) +#else + #define _TEST_PWM(P) 1 // pass +#endif + /** * Auto Fan check for PWM pins */ -#if HAS_AUTO_FAN && EXTRUDER_AUTO_FAN_SPEED != 255 && DISABLED(NO_COMPILE_TIME_PWM) +#if HAS_AUTO_FAN && EXTRUDER_AUTO_FAN_SPEED != 255 #define AF_ERR_SUFF "_AUTO_FAN_PIN is not a PWM pin. Set EXTRUDER_AUTO_FAN_SPEED to 255." #if HAS_AUTO_FAN_0 - static_assert(PWM_PIN(E0_AUTO_FAN_PIN), "E0" AF_ERR_SUFF); + static_assert(_TEST_PWM(E0_AUTO_FAN_PIN), "E0" AF_ERR_SUFF); #elif HAS_AUTO_FAN_1 - static_assert(PWM_PIN(E1_AUTO_FAN_PIN), "E1" AF_ERR_SUFF); + static_assert(_TEST_PWM(E1_AUTO_FAN_PIN), "E1" AF_ERR_SUFF); #elif HAS_AUTO_FAN_2 - static_assert(PWM_PIN(E2_AUTO_FAN_PIN), "E2" AF_ERR_SUFF); + static_assert(_TEST_PWM(E2_AUTO_FAN_PIN), "E2" AF_ERR_SUFF); #elif HAS_AUTO_FAN_3 - static_assert(PWM_PIN(E3_AUTO_FAN_PIN), "E3" AF_ERR_SUFF); + static_assert(_TEST_PWM(E3_AUTO_FAN_PIN), "E3" AF_ERR_SUFF); #elif HAS_AUTO_FAN_4 - static_assert(PWM_PIN(E4_AUTO_FAN_PIN), "E4" AF_ERR_SUFF); + static_assert(_TEST_PWM(E4_AUTO_FAN_PIN), "E4" AF_ERR_SUFF); #elif HAS_AUTO_FAN_5 - static_assert(PWM_PIN(E5_AUTO_FAN_PIN), "E5" AF_ERR_SUFF); + static_assert(_TEST_PWM(E5_AUTO_FAN_PIN), "E5" AF_ERR_SUFF); #elif HAS_AUTO_FAN_6 - static_assert(PWM_PIN(E6_AUTO_FAN_PIN), "E6" AF_ERR_SUFF); + static_assert(_TEST_PWM(E6_AUTO_FAN_PIN), "E6" AF_ERR_SUFF); #elif HAS_AUTO_FAN_7 - static_assert(PWM_PIN(E7_AUTO_FAN_PIN), "E7" AF_ERR_SUFF); + static_assert(_TEST_PWM(E7_AUTO_FAN_PIN), "E7" AF_ERR_SUFF); #endif #endif @@ -2945,7 +2951,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #elif ENABLED(SPINDLE_LASER_PWM) #if !defined(SPINDLE_LASER_PWM_PIN) || SPINDLE_LASER_PWM_PIN < 0 #error "SPINDLE_LASER_PWM_PIN is required for SPINDLE_LASER_PWM." - #elif !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #elif !_TEST_PWM(SPINDLE_LASER_PWM_PIN) #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." #elif !defined(SPINDLE_LASER_PWM_INVERT) #error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE." @@ -3037,3 +3043,6 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." #endif #endif + +// Misc. Cleanup +#undef _TEST_PWM From 6924b2deaa6a790d54d1bd2814f19285baa8915c Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 27 Jul 2020 08:36:58 +1200 Subject: [PATCH 232/483] Prevent ESP3D_WIFISUPPORT with non-ESP32 board (#18792) --- Marlin/src/inc/SanityCheck.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 944620a4e9ab..2cba0fecf26d 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3044,5 +3044,12 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif +/** + * Sanity check for WIFI + */ +#if ENABLED(ESP3D_WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) + #error "ESP3D_WIFISUPPORT requires an ESP32 controller. Use WIFISUPPORT for standalone ESP3D modules." +#endif + // Misc. Cleanup #undef _TEST_PWM From b9f0c06d834c1c4e1745f90b6b2b25f421caaf53 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 27 Jul 2020 08:41:50 +1200 Subject: [PATCH 233/483] Add 0 to EXTRUDERS :[json] (#18786) --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 60f7ed159cd6..cf3fb61cb67d 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -141,7 +141,7 @@ // @section extruder // This defines the number of extruders -// :[1, 2, 3, 4, 5, 6, 7, 8] +// :[0, 1, 2, 3, 4, 5, 6, 7, 8] #define EXTRUDERS 1 // Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. From 84b92d8f2fd519a41625ff2be080d503f1116d63 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 27 Jul 2020 00:09:57 +0000 Subject: [PATCH 234/483] [cron] Bump distribution date (2020-07-27) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 3f8df1517ca8..4007997de8c3 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-26" + #define STRING_DISTRIBUTION_DATE "2020-07-27" #endif /** From de68b3753faa675bed4c42345633e4085c1c072b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 26 Jul 2020 19:49:14 -0500 Subject: [PATCH 235/483] Config for Anycubic Mega TFT --- Marlin/Configuration.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index cf3fb61cb67d..a01571c42232 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2156,6 +2156,12 @@ //#define TFT_LVGL_UI_FSMC // Robin nano v1.2 uses FSMC //#define TFT_LVGL_UI_SPI // Robin nano v2.0 uses SPI +// +// Anycubic Mega TFT (AI3M) +// +//#define ANYCUBIC_TFT_MODEL +//#define ANYCUBIC_TFT_DEBUG + //============================================================================= //============================ Other Controllers ============================ //============================================================================= From cead93713fcdecd9a3722fad8b374f60722ff036 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 28 Jul 2020 00:09:26 +0000 Subject: [PATCH 236/483] [cron] Bump distribution date (2020-07-28) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 4007997de8c3..aea45c24c5a1 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-27" + #define STRING_DISTRIBUTION_DATE "2020-07-28" #endif /** From a63ad32f71201b01e08f4f01a2088065587e6c32 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 28 Jul 2020 13:12:30 +1200 Subject: [PATCH 237/483] Fix WiFi / ESP32 sanity check (#18808) --- Marlin/src/inc/SanityCheck.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2cba0fecf26d..9fde639b0f26 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3047,8 +3047,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) /** * Sanity check for WIFI */ -#if ENABLED(ESP3D_WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) - #error "ESP3D_WIFISUPPORT requires an ESP32 controller. Use WIFISUPPORT for standalone ESP3D modules." +#if EITHER(ESP3D_WIFISUPPORT, WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) + #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 controller." #endif // Misc. Cleanup From b5ece63778cb3f1b5eb8f173643a9de621764820 Mon Sep 17 00:00:00 2001 From: Victor Tseng Date: Tue, 28 Jul 2020 09:13:27 +0800 Subject: [PATCH 238/483] Fix garbled print_xyz output (#18810) --- Marlin/src/core/serial.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 77854d0f80a2..0d22f7bfc067 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -68,7 +68,7 @@ void print_bin(uint16_t val) { extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { - serialprintPGM(prefix); + if (prefix) serialprintPGM(prefix); SERIAL_ECHOPAIR_P(SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z); if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); } From 5d14c3712f96e0800cfe30e85036f4941a5a21ee Mon Sep 17 00:00:00 2001 From: Victor Tseng Date: Tue, 28 Jul 2020 09:15:14 +0800 Subject: [PATCH 239/483] Fix DELTA + TMC sensorless homing + SPI endstops (#18811) --- Marlin/src/module/delta.cpp | 14 ++++++-------- Marlin/src/module/motion.h | 6 ++++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 9361729462a7..df6cae6e0a97 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -242,11 +242,9 @@ void home_delta() { // Disable stealthChop if used. Enable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - sensorless_t stealth_states { - tmc_enable_stallguard(stepperX), - tmc_enable_stallguard(stepperY), - tmc_enable_stallguard(stepperZ) - }; + TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); + TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); + TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); #endif // Move all carriages together linearly until an endstop is hit. @@ -256,9 +254,9 @@ void home_delta() { // Re-enable stealthChop if used. Disable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - tmc_disable_stallguard(stepperX, stealth_states.x); - tmc_disable_stallguard(stepperY, stealth_states.y); - tmc_disable_stallguard(stepperZ, stealth_states.z); + TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); + TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); + TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); #endif endstops.validate_homing_move(); diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index d33ce623a466..38ce980dae98 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -395,3 +395,9 @@ void homeaxis(const AxisEnum axis); #if HAS_M206_COMMAND void set_home_offset(const AxisEnum axis, const float v); #endif + +#if USE_SENSORLESS + struct sensorless_t; + sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis); + void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth); +#endif From de5cca6b1f660776e85d646d9c227c03ef60ccf1 Mon Sep 17 00:00:00 2001 From: Diego von Deschwanden <68632259+Diegovd@users.noreply.github.com> Date: Tue, 28 Jul 2020 08:04:44 +0200 Subject: [PATCH 240/483] Update more external links (#18819) --- LICENSE | 5 ++--- Marlin/src/HAL/DUE/HAL.cpp | 1 + Marlin/src/HAL/ESP32/ota.cpp | 1 + Marlin/src/HAL/STM32/SoftwareSerial.cpp | 10 +++++----- Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp | 2 +- Marlin/src/feature/dac/dac_mcp4728.cpp | 2 +- Marlin/src/gcode/motion/G5.cpp | 2 +- buildroot/share/vscode/avrdude.conf | 16 ++++++++-------- buildroot/share/vscode/avrdude_linux.conf | 16 ++++++++-------- buildroot/share/vscode/avrdude_macOS.conf | 8 ++++---- platformio.ini | 2 +- 11 files changed, 33 insertions(+), 32 deletions(-) diff --git a/LICENSE b/LICENSE index 4ad6d9b1e2aa..6c0e10f3b802 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (c) 2007 Free Software Foundation, Inc. + Copyright (c) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -673,5 +673,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. - +. diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index f2bf4ebbf5b8..4b9260c35962 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -15,6 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ /** diff --git a/Marlin/src/HAL/ESP32/ota.cpp b/Marlin/src/HAL/ESP32/ota.cpp index 7cf65ed2d3cf..69a3e25e5631 100644 --- a/Marlin/src/HAL/ESP32/ota.cpp +++ b/Marlin/src/HAL/ESP32/ota.cpp @@ -15,6 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ #ifdef ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/STM32/SoftwareSerial.cpp b/Marlin/src/HAL/STM32/SoftwareSerial.cpp index af92548cbb64..2228a177be66 100644 --- a/Marlin/src/HAL/STM32/SoftwareSerial.cpp +++ b/Marlin/src/HAL/STM32/SoftwareSerial.cpp @@ -3,14 +3,14 @@ * * Multi-instance software serial library for Arduino/Wiring * -- Interrupt-driven receive and other improvements by ladyada - * (https://ladyada.net) + * * -- Tuning, circular buffer, derivation from class Print/Stream, * multi-instance support, porting to 8MHz processors, * various optimizations, PROGMEM delay tables, inverse logic and - * direct port writing by Mikal Hart (http://www.arduiniana.org) - * -- Pin change interrupt macros by Paul Stoffregen (https://www.pjrc.com) - * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) - * -- ATmega1280/2560 support by Brett Hagman (https://www.roguerobotics.com/) + * direct port writing by Mikal Hart + * -- Pin change interrupt macros by Paul Stoffregen + * -- 20MHz processor support by Garrett Mace + * -- ATmega1280/2560 support by Brett Hagman * -- STM32 support by Armin van der Togt * * This library is free software; you can redistribute it and/or diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp index f524673ecd74..bfc062af2090 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp @@ -4,7 +4,7 @@ * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * file, You can obtain one at https://www.mozilla.org/en-US/MPL/2.0/ * * This library was modified, some bugs fixed, stack address validated * and adapted to be used in Marlin 3D printer firmware as backtracer diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index 4976b3690729..55f10a49ef70 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -27,7 +27,7 @@ * https://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf * * For discussion and feedback, please go to: - * https://arduino.cc/forum/index.php/topic,51842.0.html + * https://forum.arduino.cc/index.php/topic,51842.0.html */ #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/gcode/motion/G5.cpp b/Marlin/src/gcode/motion/G5.cpp index 35cc4280239b..2c98fae84522 100644 --- a/Marlin/src/gcode/motion/G5.cpp +++ b/Marlin/src/gcode/motion/G5.cpp @@ -29,7 +29,7 @@ /** * Parameters interpreted according to: - * https://linuxcnc.org/docs/2.6/html/gcode/gcode.html#sec:G5-Cubic-Spline + * https://linuxcnc.org/docs/2.7/html/gcode/g-code.html#gcode:g5 * However I, J omission is not supported at this point; all * parameters can be omitted and default to zero. */ diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf index 1194847f775d..475f8bf1086c 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/vscode/avrdude.conf @@ -145,9 +145,9 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: +# at90s4433/2333's; see the at90s4433 errata page 2 at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf # # INSTRUCTION FORMATS # @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + desc = "Brian Dean's Programmer, https://savannah.nongnu.org/projects/avrdude"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on http://electropol.free.fr) +# disconnect port download on http://www.electropol.fr programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +# https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en592141 programmer id = "89isp"; desc = "Atmel at89isp cable"; diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf index 46e7ace34b21..cbc65d6917ca 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -145,9 +145,9 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: +# at90s4433/2333's; see the at90s4433 errata page 2 at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf # # INSTRUCTION FORMATS # @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + desc = "Brian Dean's Programmer, https://savannah.nongnu.org/projects/avrdude"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on http://electropol.free.fr) +# disconnect port download on http://www.electropol.fr programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +# https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en592141 programmer id = "89isp"; desc = "Atmel at89isp cable"; diff --git a/buildroot/share/vscode/avrdude_macOS.conf b/buildroot/share/vscode/avrdude_macOS.conf index d933567452fc..814e87e35ea3 100644 --- a/buildroot/share/vscode/avrdude_macOS.conf +++ b/buildroot/share/vscode/avrdude_macOS.conf @@ -145,9 +145,9 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: +# at90s4433/2333's; see the at90s4433 errata page 2 at: # -# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf # # INSTRUCTION FORMATS # @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; + desc = "USBasp, https://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; type = usbtiny; ; diff --git a/platformio.ini b/platformio.ini index 543b837f54d3..f60ebcce3564 100644 --- a/platformio.ini +++ b/platformio.ini @@ -4,7 +4,7 @@ # # For detailed documentation with EXAMPLES: # -# https://docs.platformio.org/en/latest/projectconf.html +# https://docs.platformio.org/en/latest/projectconf/index.html # # Automatic targets - enable auto-uploading From b80cc09b13dbac0b1b289a89568641a07e226345 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 28 Jul 2020 03:10:00 -0500 Subject: [PATCH 241/483] Keep -std=gnu++11 in stm32 build_unflags --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index f60ebcce3564..24d416444f83 100644 --- a/platformio.ini +++ b/platformio.ini @@ -380,7 +380,7 @@ src_filter = ${common.default_src_filter} + platform = ${common_stm32.platform} build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DHAVE_SW_SERIAL -build_unflags = -std=gnu11 +build_unflags = -std=gnu11 -std=gnu++11 src_filter = ${common.default_src_filter} + lib_ignore = SPI lib_deps = ${common.lib_deps} From aaf1ee78a454969cf948b69e6afdd121adb80fc7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 29 Jul 2020 00:09:42 +0000 Subject: [PATCH 242/483] [cron] Bump distribution date (2020-07-29) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index aea45c24c5a1..c85a31df0723 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-28" + #define STRING_DISTRIBUTION_DATE "2020-07-29" #endif /** From f205cd7d2cf3b78c75f60648f972cd12377f0784 Mon Sep 17 00:00:00 2001 From: natemason Date: Wed, 29 Jul 2020 09:18:02 +0800 Subject: [PATCH 243/483] Add TEMP_PROBE_PIN for Einsy Rambo (#18823) --- Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 76c3f131a96e..8fb3be47da54 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -109,6 +109,7 @@ #define TEMP_0_PIN 0 // Analog Input #define TEMP_1_PIN 1 // Analog Input #define TEMP_BED_PIN 2 // Analog Input +#define TEMP_PROBE_PIN 3 // Analog Input // // Heaters / Fans From 159dcd8e8a6e829fa8caaa90ecf1a5140ea87989 Mon Sep 17 00:00:00 2001 From: MoellerDi Date: Wed, 29 Jul 2020 03:19:12 +0200 Subject: [PATCH 244/483] Fix NEOPIXEL_LED compile w/out PRINTER_EVENT_LEDS (#18824) --- Marlin/src/inc/Conditionals_LCD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 66e83c5299e4..992a788eb54e 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -752,6 +752,6 @@ /** * To check if we need the folder src/features/leds */ -#if ANY(TEMP_STAT_LEDS, HAS_COLOR_LEDS, HAS_CASE_LIGHT, PRINTER_EVENT_LEDS, LED_BACKLIGHT_TIMEOUT, PCA9632_BUZZER, LED_CONTROL_MENU) +#if ANY(TEMP_STAT_LEDS, HAS_COLOR_LEDS, HAS_CASE_LIGHT, PRINTER_EVENT_LEDS, LED_BACKLIGHT_TIMEOUT, PCA9632_BUZZER, LED_CONTROL_MENU, NEOPIXEL_LED) #define HAS_LED_FEATURE 1 #endif From 62da2c97d0f17fff6bc5bf3ca7be7ba6f9c8e0a7 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 28 Jul 2020 23:15:17 -0300 Subject: [PATCH 245/483] DISABLE_DEBUG required to free Robin nano Z_DIR_PIN (#18832) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index dd0d1e9465ef..ee88962e12bf 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -37,7 +37,7 @@ // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // -//#define DISABLE_DEBUG +#define DISABLE_DEBUG // // EEPROM From 83e15f7701d36f3c8401ab0064278d233e2be6de Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 29 Jul 2020 04:19:46 +0200 Subject: [PATCH 246/483] [SAMD51] ES Interrupt parity with other HALs (#18836) --- Marlin/src/HAL/SAMD51/endstop_interrupts.h | 27 +++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Marlin/src/HAL/SAMD51/endstop_interrupts.h b/Marlin/src/HAL/SAMD51/endstop_interrupts.h index 03c24694536a..daac7733875b 100644 --- a/Marlin/src/HAL/SAMD51/endstop_interrupts.h +++ b/Marlin/src/HAL/SAMD51/endstop_interrupts.h @@ -126,82 +126,83 @@ void endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) #if HAS_X_MAX #if !AVAILABLE_EILINE(X_MAX_PIN) #error "X_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(X_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(X_MAX_PIN); #endif #if HAS_X_MIN #if !AVAILABLE_EILINE(X_MIN_PIN) #error "X_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(X_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(X_MIN_PIN); #endif #if HAS_Y_MAX #if !AVAILABLE_EILINE(Y_MAX_PIN) #error "Y_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Y_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Y_MAX_PIN); #endif #if HAS_Y_MIN #if !AVAILABLE_EILINE(Y_MIN_PIN) #error "Y_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Y_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Y_MIN_PIN); #endif #if HAS_Z_MAX #if !AVAILABLE_EILINE(Z_MAX_PIN) #error "Z_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Z_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Z_MAX_PIN); #endif #if HAS_Z_MIN #if !AVAILABLE_EILINE(Z_MIN_PIN) #error "Z_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Z_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Z_MIN_PIN); #endif #if HAS_Z2_MAX #if !AVAILABLE_EILINE(Z2_MAX_PIN) #error "Z2_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Z2_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Z2_MAX_PIN); #endif #if HAS_Z2_MIN #if !AVAILABLE_EILINE(Z2_MIN_PIN) #error "Z2_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Z2_MIN_PIN); #endif #if HAS_Z3_MAX #if !AVAILABLE_EILINE(Z3_MAX_PIN) #error "Z3_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Z3_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Z3_MAX_PIN); #endif #if HAS_Z3_MIN #if !AVAILABLE_EILINE(Z3_MIN_PIN) #error "Z3_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Z3_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Z3_MIN_PIN); #endif #if HAS_Z4_MAX #if !AVAILABLE_EILINE(Z4_MAX_PIN) #error "Z4_MAX_PIN has no EXTINT line available." #endif - attachInterrupt(Z4_MAX_PIN, endstop_ISR, CHANGE); + _ATTACH(Z4_MAX_PIN); #endif #if HAS_Z4_MIN #if !AVAILABLE_EILINE(Z4_MIN_PIN) #error "Z4_MIN_PIN has no EXTINT line available." #endif - attachInterrupt(Z4_MIN_PIN, endstop_ISR, CHANGE); + _ATTACH(Z4_MIN_PIN); #endif #if HAS_Z_MIN_PROBE_PIN #if !AVAILABLE_EILINE(Z_MIN_PROBE_PIN) #error "Z_MIN_PROBE_PIN has no EXTINT line available." #endif - attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); + _ATTACH(Z_MIN_PROBE_PIN); #endif } From 37b03dea8d34cbb6baa69f52ed365df94541763b Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Wed, 29 Jul 2020 04:28:58 +0200 Subject: [PATCH 247/483] Fix Cancel Objects index display (zero-based) (#18841) --- Marlin/src/feature/cancel_object.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index 7eb471543534..16f876f13686 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -45,7 +45,7 @@ void CancelObject::set_active_object(const int8_t obj) { #if HAS_DISPLAY if (active_object >= 0) - ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object + 1)); + ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object)); else ui.reset_status(); #endif From 05d95171cc4ef51e91c0c0f069d935f8f252dcdc Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 29 Jul 2020 21:35:31 +0200 Subject: [PATCH 248/483] Clarify Nozzle-to-Probe offset (#18828) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index a01571c42232..bde1e7855214 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -964,24 +964,34 @@ // /** - * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * Nozzle-to-Probe offsets { X, Y, Z } * - * In the following example the X and Y offsets are both positive: + * - Use a caliper or ruler to measure the distance from the tip of + * the Nozzle to the center-point of the Probe in the X and Y axes. + * - For the Z offset use your best known value and adjust at runtime. + * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. * - * #define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } + * Assuming the typical work area orientation: + * - Probe to RIGHT of the Nozzle has a Positive X offset + * - Probe to LEFT of the Nozzle has a Negative X offset + * - Probe in BACK of the Nozzle has a Positive Y offset + * - Probe in FRONT of the Nozzle has a Negative Y offset + * + * Some examples: + * #define NOZZLE_TO_PROBE_OFFSET { 10, 10, -1 } // Example "1" + * #define NOZZLE_TO_PROBE_OFFSET {-10, 5, -1 } // Example "2" + * #define NOZZLE_TO_PROBE_OFFSET { 5, -5, -1 } // Example "3" + * #define NOZZLE_TO_PROBE_OFFSET {-15,-10, -1 } // Example "4" * * +-- BACK ---+ - * | | - * L | (+) P | R <-- probe (20,20) - * E | | I - * F | (-) N (+) | G <-- nozzle (10,10) - * T | | H - * | (-) | T - * | | + * | [+] | + * L | 1 | R <-- Example "1" (right+, back+) + * E | 2 | I <-- Example "2" ( left-, back+) + * F |[-] N [+]| G <-- Nozzle + * T | 3 | H <-- Example "3" (right+, front-) + * | 4 | T <-- Example "4" ( left-, front-) + * | [-] | * O-- FRONT --+ - * (0,0) - * - * Specify a Probe position as { X, Y, Z } */ #define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } From fc959463805171f1f4063886d5ecaba7cd046040 Mon Sep 17 00:00:00 2001 From: lethalwallabies <54120706+lethalwallabies@users.noreply.github.com> Date: Wed, 29 Jul 2020 21:49:07 +0200 Subject: [PATCH 249/483] Typo fix (#18856) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 3f097c09e311..7ebab9d166cd 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -680,7 +680,7 @@ * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller! * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup. * If disabled, OD mode is the hard-coded default on 3.0 - * On startup, Marlin will compare its eeprom to this vale. If the selected mode + * On startup, Marlin will compare its eeprom to this value. If the selected mode * differs, a mode set eeprom write will be completed at initialization. * Use the option below to force an eeprom write to a V3.1 probe regardless. */ From 5eae8e78306ac570d94128e05dd3e6563b63c32b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 29 Jul 2020 15:44:05 -0500 Subject: [PATCH 250/483] Update keypad link --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index bde1e7855214..1f34c069180f 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2197,7 +2197,7 @@ // // RepRapWorld REPRAPWORLD_KEYPAD v1.1 -// https://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/ // //#define REPRAPWORLD_KEYPAD //#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press From e549d474aa66a4f92eebd9512940b34e188b97c2 Mon Sep 17 00:00:00 2001 From: Diego von Deschwanden <68632259+Diegovd@users.noreply.github.com> Date: Thu, 30 Jul 2020 02:04:37 +0200 Subject: [PATCH 251/483] Fix URLs to websites and resources (#18844) --- buildroot/share/vscode/avrdude.conf | 2 +- buildroot/share/vscode/avrdude_linux.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf index 475f8bf1086c..9f85aa0d26d6 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/vscode/avrdude.conf @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf index cbc65d6917ca..64d3b677d5bf 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; From 251c5c47aae1451e5be8f1151fb248b5e6a9a68b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 30 Jul 2020 00:15:26 +0000 Subject: [PATCH 252/483] [cron] Bump distribution date (2020-07-30) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c85a31df0723..199f09221d02 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-29" + #define STRING_DISTRIBUTION_DATE "2020-07-30" #endif /** From 95f990a656faefe071eabac107c1ffa012598710 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 29 Jul 2020 20:43:35 -0500 Subject: [PATCH 253/483] Fix UNKNOWN_Z_NO_RAISE in G28 Bug introduced in 73fc0778b86 --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 1fbb3dd35332..0b2bb9801b42 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -312,7 +312,7 @@ void GcodeSuite::G28() { #endif const float z_homing_height = - ENABLED(UNKNOWN_Z_NO_RAISE) && TEST(axis_known_position, Z_AXIS) + ENABLED(UNKNOWN_Z_NO_RAISE) && !TEST(axis_known_position, Z_AXIS) ? 0 : (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT); From 73ce80af3a3f8415a7c3f7f5551b429d58019a05 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 29 Jul 2020 20:50:10 -0500 Subject: [PATCH 254/483] In G28 Z is sort-of known --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 0b2bb9801b42..78695bc05b40 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -319,7 +319,7 @@ void GcodeSuite::G28() { if (z_homing_height && (doX || doY || (ENABLED(Z_SAFE_HOMING) && doZ))) { // Raise Z before homing any other axes and z is not already high enough (never lower z) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); - do_z_clearance(z_homing_height, TEST(axis_known_position, Z_AXIS), DISABLED(UNKNOWN_Z_NO_RAISE)); + do_z_clearance(z_homing_height, true, DISABLED(UNKNOWN_Z_NO_RAISE)); } #if ENABLED(QUICK_HOME) From 38ce5966e19094fb499ce7d647961c0594c5f811 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 29 Jul 2020 23:25:07 -0300 Subject: [PATCH 255/483] SPI Emulated DOGM (like FSMC_GRAPHICAL_TFT, but SPI) (#18817) --- Marlin/Configuration.h | 14 +- Marlin/Configuration_adv.h | 5 +- Marlin/src/HAL/STM32F1/SPI.h | 2 + .../STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp | 236 ++++++++++++++++++ Marlin/src/feature/touch/xpt2046.cpp | 84 +++++-- Marlin/src/feature/touch/xpt2046.h | 4 - Marlin/src/inc/Conditionals_LCD.h | 6 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/SanityCheck.h | 26 +- Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 5 + ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 131 +++++----- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 14 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 25 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 24 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 89 ++++++- 15 files changed, 542 insertions(+), 125 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1f34c069180f..c6ec607d9b8f 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2156,6 +2156,12 @@ // //#define FSMC_GRAPHICAL_TFT +// +// SPI display (MKS Robin Nano V2.0, MKS Gen L V2.0) +// Upscaled 128x64 Marlin UI +// +//#define SPI_GRAPHICAL_TFT + // // TFT LVGL UI // @@ -2189,10 +2195,10 @@ #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - #define XPT2046_X_CALIBRATION 12316 - #define XPT2046_Y_CALIBRATION -8981 - #define XPT2046_X_OFFSET -43 - #define XPT2046_Y_OFFSET 257 + //#define XPT2046_X_CALIBRATION 12316 + //#define XPT2046_Y_CALIBRATION -8981 + //#define XPT2046_X_OFFSET -43 + //#define XPT2046_Y_OFFSET 257 #endif // diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7ebab9d166cd..37c997977192 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1509,9 +1509,10 @@ #endif // -// FSMC Graphical TFT +// FSMC / SPI Graphical TFT // -#if ENABLED(FSMC_GRAPHICAL_TFT) +#if TFT_SCALED_DOGLCD + //#define GRAPHICAL_TFT_ROTATE_180 //#define TFT_MARLINUI_COLOR 0xFFFF // White //#define TFT_MARLINBG_COLOR 0x0000 // Black //#define TFT_DISABLED_COLOR 0x0003 // Almost black diff --git a/Marlin/src/HAL/STM32F1/SPI.h b/Marlin/src/HAL/STM32F1/SPI.h index dc2a21586560..0d20a46577e7 100644 --- a/Marlin/src/HAL/STM32F1/SPI.h +++ b/Marlin/src/HAL/STM32F1/SPI.h @@ -208,6 +208,8 @@ class SPIClass { */ void setDataSize(uint32_t ds); + uint32_t getDataSize() { return _currentSetting->dataSize; } + /* Victor Perez 2017. Added to set and clear callback functions for callback * on DMA transfer completion. * onReceive used to set the callback in case of dmaTransfer (tx/rx), once rx is completed diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp new file mode 100644 index 000000000000..286dcfb5d0dc --- /dev/null +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp @@ -0,0 +1,236 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __STM32F1__ + +#include "../../../inc/MarlinConfig.h" + +#if BOTH(HAS_GRAPHICAL_LCD, SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) + +#include "../HAL.h" +#include +#include + +#define SPI_TFT_CS_H OUT_WRITE(SPI_TFT_CS_PIN, HIGH) +#define SPI_TFT_CS_L OUT_WRITE(SPI_TFT_CS_PIN, LOW) + +#define SPI_TFT_DC_H OUT_WRITE(SPI_TFT_DC_PIN, HIGH) +#define SPI_TFT_DC_L OUT_WRITE(SPI_TFT_DC_PIN, LOW) + +#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) +#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) + +#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) +#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) + +void LCD_IO_Init(uint8_t cs, uint8_t rs); +void LCD_IO_WriteData(uint16_t RegValue); +void LCD_IO_WriteReg(uint16_t Reg); +uint16_t LCD_IO_ReadData(uint16_t RegValue); +uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); +#ifdef LCD_USE_DMA_SPI + void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); +#endif + +void LCD_WR_REG(uint8_t cmd) { + SPI_TFT_CS_L; + SPI_TFT_DC_L; + SPI.send(cmd); + SPI_TFT_CS_H; +} +void LCD_WR_DATA(uint8_t data) { + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.send(data); + SPI_TFT_CS_H; +} + +void spi1Init(uint8_t spiRate) { + SPI_TFT_CS_H; + + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + SPI.setModule(1); + SPI.begin(); + SPI.setClockDivider(clock); + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); +} + +void LCD_IO_Init(uint8_t cs, uint8_t rs) { + spi1Init(SPI_FULL_SPEED); +} + +void LCD_IO_WriteData(uint16_t RegValue) { + LCD_WR_DATA(RegValue); +} + +void LCD_IO_WriteReg(uint16_t Reg) { + LCD_WR_REG(Reg); +} + +uint16_t LCD_IO_ReadData(uint16_t RegValue) { + uint16_t d = 0; + SPI_TFT_CS_L; + + SPI_TFT_DC_L; + SPI.send(RegValue); + SPI_TFT_DC_H; + + SPI.read((uint8_t*)&d, 1); //dummy read + SPI.read((uint8_t*)&d, 1); + + SPI_TFT_CS_H; + return d >> 7; +} + +uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { + uint32_t data = 0; + uint8_t d = 0; + SPI_TFT_CS_L; + + SPI_TFT_DC_L; + SPI.send(RegValue); + SPI_TFT_DC_H; + + SPI.read((uint8_t*)&d, 1); //dummy read + SPI.read((uint8_t*)&d, 1); + data = d; + while (--ReadSize) { + data <<= 8; + SPI.read((uint8_t*)&d, 1); + data |= (d & 0xFF); + } + + SPI_TFT_CS_H; + return uint32_t(data >> 7); +} + +#ifdef LCD_USE_DMA_SPI + void LCD_IO_WriteMultiple(uint16_t data, uint32_t count) { + if (SPI.getDataSize() == DATA_SIZE_8BIT) { + count *= 2; + } + while (count > 0) { + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(&data, 1, true); + SPI_TFT_CS_H; + count--; + } + } + + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { + if (SPI.getDataSize() == DATA_SIZE_8BIT) { + length *= 2; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSend(data, length, true); + SPI_TFT_CS_H; + } + + void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { + if (SPI.getDataSize() == DATA_SIZE_8BIT) { + length *= 2; + } + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSendAsync(data, length, true); + SPI_TFT_CS_H; + } + + void LCD_IO_WaitSequence_Async() { + SPI_TFT_CS_L; + SPI_TFT_DC_H; + SPI.dmaSendAsync(NULL, 0, true); + SPI_TFT_CS_H; + } +#endif + +static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif + +uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + if (msgInitCount) { + if (msg == U8G_COM_MSG_INIT) msgInitCount--; + if (msgInitCount) return -1; + } + + static uint8_t isCommand; + + LCD_IO_Init(-1, -1); + + switch (msg) { + case U8G_COM_MSG_STOP: break; + case U8G_COM_MSG_INIT: + u8g_SetPIOutput(u8g, U8G_PI_RESET); + + u8g_Delay(50); + + if (arg_ptr) { + spi1Init(SPI_EIGHTH_SPEED); + *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3); + spi1Init(SPI_FULL_SPEED); + } + isCommand = 0; + break; + + case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) + isCommand = arg_val == 0 ? 1 : 0; + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + if (isCommand) + LCD_IO_WriteReg(arg_val); + else + LCD_IO_WriteData((uint16_t)arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: + for (uint8_t i = 0; i < arg_val; i += 2) + LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); + break; + + } + return 1; +} + +#endif // HAS_GRAPHICAL_LCD +#endif // STM32F1 diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index 235c17b50c85..d613fbc89a98 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -23,10 +23,14 @@ #include "xpt2046.h" #include "../../inc/MarlinConfig.h" -#if ENABLED(FSMC_GRAPHICAL_TFT) + +#if TFT_SCALED_DOGLCD #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. #endif +#ifndef XPT2046_Z1_THRESHOLD + #define XPT2046_Z1_THRESHOLD 10 +#endif /* * Draw and Touch processing @@ -117,10 +121,15 @@ uint8_t XPT2046::read_buttons() { // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible. if (!isTouched()) return 0; - const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], - y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; + uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], + y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. + #if ENABLED(GRAPHICAL_TFT_ROTATE_180) + x = TOUCH_SCREEN_WIDTH - x; + y = TOUCH_SCREEN_HEIGHT - y; + #endif + // Touch within the button area simulates an encoder button if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) return WITHIN(x, 14, 77) ? EN_D @@ -151,30 +160,69 @@ bool XPT2046::isTouched() { ); } +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include + + static void touch_spi_init(uint8_t spiRate) { + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + SPI.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); + SPI.begin(); + SPI.setClockDivider(clock); + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); + } +#endif // TOUCH_BUTTONS_HW_SPI + uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) { uint16_t data[3]; + const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE; - OUT_WRITE(TOUCH_CS_PIN, LOW); + #if ENABLED(TOUCH_BUTTONS_HW_SPI) - const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE; - for (uint16_t i = 0; i < 3 ; i++) { - for (uint8_t j = 0x80; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - WRITE(TOUCH_MOSI_PIN, bool(coord & j)); - WRITE(TOUCH_SCK_PIN, HIGH); + touch_spi_init(SPI_SPEED_6); + for (uint16_t i = 0; i < 3; i++) { + OUT_WRITE(TOUCH_CS_PIN, LOW); + SPI.transfer(coord); + data[i] = (((SPI.transfer(0xFF) << 8) | SPI.transfer(0xFF)) >> 3) & 0x0FFF; + WRITE(TOUCH_CS_PIN, HIGH); } - data[i] = 0; - for (uint16_t j = 0x8000; j; j >>= 1) { + #else // !TOUCH_BUTTONS_HW_SPI + + OUT_WRITE(TOUCH_CS_PIN, LOW); + for (uint16_t i = 0; i < 3; i++) { + for (uint8_t j = 0x80; j; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + WRITE(TOUCH_MOSI_PIN, bool(coord & j)); + WRITE(TOUCH_SCK_PIN, HIGH); + } + + data[i] = 0; + for (uint16_t j = 0x8000; j; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + if (READ(TOUCH_MISO_PIN)) data[i] |= j; + WRITE(TOUCH_SCK_PIN, HIGH); + } WRITE(TOUCH_SCK_PIN, LOW); - if (READ(TOUCH_MISO_PIN)) data[i] |= j; - WRITE(TOUCH_SCK_PIN, HIGH); + data[i] >>= 4; } - WRITE(TOUCH_SCK_PIN, LOW); - data[i] >>= 4; - } + WRITE(TOUCH_CS_PIN, HIGH); - WRITE(TOUCH_CS_PIN, HIGH); + #endif // !TOUCH_BUTTONS_HW_SPI uint16_t delta01 = _MAX(data[0], data[1]) - _MIN(data[0], data[1]), delta02 = _MAX(data[0], data[2]) - _MIN(data[0], data[2]), diff --git a/Marlin/src/feature/touch/xpt2046.h b/Marlin/src/feature/touch/xpt2046.h index 347881e0addc..467317901b2b 100644 --- a/Marlin/src/feature/touch/xpt2046.h +++ b/Marlin/src/feature/touch/xpt2046.h @@ -34,10 +34,6 @@ enum XPTCoordinate : uint8_t { XPT2046_Z2 = 0x40 }; -#ifndef XPT2046_Z1_THRESHOLD - #define XPT2046_Z1_THRESHOLD 10 -#endif - class XPT2046 { public: static void init(); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 992a788eb54e..1605ced3c8a0 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -261,7 +261,11 @@ #endif // FSMC/SPI TFT Panels -#if ENABLED(FSMC_GRAPHICAL_TFT) +#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) + #define TFT_SCALED_DOGLCD 1 +#endif + +#if TFT_SCALED_DOGLCD #define DOGLCD #define IS_ULTIPANEL #define DELAYED_BACKLIGHT_INIT diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index e12310e07c51..c7171b06d806 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -373,7 +373,7 @@ #endif -#if EITHER(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) +#if ANY(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) #define NO_LCD_REINIT 1 // Suppress LCD re-initialization #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9fde639b0f26..9fb742f50572 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -451,8 +451,6 @@ #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. Please update your configuration." #elif defined(TFT_LVGL_UI) #error "TFT_LVGL_UI is now TFT_LVGL_UI_FSMC. Please update your configuration." -#elif defined(SPI_GRAPHICAL_TFT) - #error "SPI_GRAPHICAL_TFT is now TFT_LVGL_UI_SPI. Please update your configuration." #elif defined(SDPOWER) #error "SDPOWER is now SDPOWER_PIN. Please update your configuration and/or pins." #elif defined(STRING_SPLASH_LINE1) || defined(STRING_SPLASH_LINE2) @@ -3036,11 +3034,27 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif /** - * Sanity checks for stepper chunk support + * Stepper Chunk support */ -#if ENABLED(DIRECT_STEPPING) - #if ENABLED(LIN_ADVANCE) - #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." +#if BOTH(DIRECT_STEPPING, LIN_ADVANCE) + #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." +#endif + +/** + * Touch Buttons + */ +#if ENABLED(TOUCH_BUTTONS) + #ifndef XPT2046_X_CALIBRATION + #error "XPT2046_X_CALIBRATION must be defined with TOUCH_BUTTONS." + #endif + #ifndef XPT2046_Y_CALIBRATION + #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_BUTTONS." + #endif + #ifndef XPT2046_X_OFFSET + #error "XPT2046_X_OFFSET must be defined with TOUCH_BUTTONS." + #endif + #ifndef XPT2046_Y_OFFSET + #error "XPT2046_Y_OFFSET must be defined with TOUCH_BUTTONS." #endif #endif diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index df7f8dd44b8f..1f9621e9c05e 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -87,6 +87,11 @@ #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_fsmc_fn #endif + #if ENABLED(SPI_GRAPHICAL_TFT) + uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_spi_fn + #endif + #elif defined(TARGET_LPC1768) uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index fc7a22b26143..33cd5ecca6d2 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -57,14 +57,21 @@ #include "../../inc/MarlinConfig.h" -#if HAS_GRAPHICAL_LCD && PIN_EXISTS(FSMC_CS) +#if HAS_GRAPHICAL_LCD && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT)) #include "HAL_LCD_com_defines.h" #include "ultralcd_DOGM.h" #include -#ifdef LCD_USE_DMA_FSMC +#if EITHER(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) + #define HAS_LCD_IO 1 +#endif + +#if HAS_LCD_IO + extern void LCD_IO_Init(uint8_t cs, uint8_t rs); + extern uint16_t LCD_IO_ReadData(uint16_t Reg); + extern uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); extern void LCD_IO_WriteReg(uint16_t Reg); extern void LCD_IO_WriteData(uint16_t RegValue); extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); @@ -148,46 +155,34 @@ static uint32_t lcd_id = 0; static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteReg(ILI9328_HASTART); - LCD_IO_WriteData(Ymin); - LCD_IO_WriteReg(ILI9328_HAEND); - LCD_IO_WriteData(Ymax); - LCD_IO_WriteReg(ILI9328_VASTART); - LCD_IO_WriteData(Xmin); - LCD_IO_WriteReg(ILI9328_VAEND); - LCD_IO_WriteData(Xmax); - - LCD_IO_WriteReg(ILI9328_HASET); - LCD_IO_WriteData(Ymin); - LCD_IO_WriteReg(ILI9328_VASET); - LCD_IO_WriteData(Xmin); - - LCD_IO_WriteReg(ILI9328_WRITE_RAM); + #if HAS_LCD_IO + #define IO_REG_DATA(R,D) do { LCD_IO_WriteReg(R); LCD_IO_WriteData(D); }while(0) #else + #define IO_REG_DATA(R,D) do { u8g_WriteByte(u8g, dev, R); u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&D); }while(0) + #endif + + #if NONE(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) u8g_SetAddress(u8g, dev, 0); + #endif - u8g_WriteByte(u8g, dev, ILI9328_HASTART); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymin); - u8g_WriteByte(u8g, dev, ILI9328_HAEND); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymax); - u8g_WriteByte(u8g, dev, ILI9328_VASTART); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmin); - u8g_WriteByte(u8g, dev, ILI9328_VAEND); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmax); + IO_REG_DATA(ILI9328_HASTART, Ymin); + IO_REG_DATA(ILI9328_HAEND, Ymax); + IO_REG_DATA(ILI9328_VASTART, Xmin); + IO_REG_DATA(ILI9328_VAEND, Xmax); - u8g_WriteByte(u8g, dev, ILI9328_HASET); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Ymin); - u8g_WriteByte(u8g, dev, ILI9328_VASET); - u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&Xmin); + IO_REG_DATA(ILI9328_HASET, Ymin); + IO_REG_DATA(ILI9328_VASET, Xmin); + #if HAS_LCD_IO + LCD_IO_WriteReg(ILI9328_WRITE_RAM); + #else u8g_WriteByte(u8g, dev, ILI9328_WRITE_RAM); u8g_SetAddress(u8g, dev, 1); #endif } static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO LCD_IO_WriteReg(ST7789V_CASET); LCD_IO_WriteData((Xmin >> 8) & 0xFF); LCD_IO_WriteData(Xmin & 0xFF); @@ -227,7 +222,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint #define ESC_END 0xFFFF, 0x7FFF #define ESC_FFFF 0xFFFF, 0xFFFF -#ifdef LCD_USE_DMA_FSMC +#if HAS_LCD_IO void writeEscSequence(const uint16_t *sequence) { uint16_t data; for (;;) { @@ -247,6 +242,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } } } + #define WRITE_ESC_SEQUENCE(V) writeEscSequence(V) #else void writeEscSequence8(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { uint16_t data; @@ -271,6 +267,8 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } } + #define WRITE_ESC_SEQUENCE(V) writeEscSequence8(u8g, dev, V) + void writeEscSequence16(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { uint16_t data; u8g_SetAddress(u8g, dev, 0); @@ -381,6 +379,30 @@ static const uint16_t ili9341_init[] = { ESC_END }; +static const uint16_t st9677_init[] = { + ESC_REG(0x0010), ESC_DELAY(120), + ESC_REG(0x0001), ESC_DELAY(120), + ESC_REG(0x0011), ESC_DELAY(120), + ESC_REG(0x00F0), 0x00C3, + ESC_REG(0x00F0), 0x0096, + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028), + ESC_REG(0x003A), 0x0055, + ESC_REG(0x00B4), 0x0001, + ESC_REG(0x00B7), 0x00C6, + ESC_REG(0x00E8), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, + ESC_REG(0x00C1), 0x0006, + ESC_REG(0x00C2), 0x00A7, + ESC_REG(0x00C5), 0x0018, + ESC_REG(0x00E0), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0015, 0x002F, 0x0054, 0x0042, 0x003C, 0x0017, 0x0014, 0x0018, 0x001B, + ESC_REG(0x00E1), 0x00F0, 0x0009, 0x000B, 0x0006, 0x0004, 0x0003, 0x002D, 0x0043, 0x0042, 0x003B, 0x0016, 0x0014, 0x0017, 0x001B, + ESC_REG(0x00F0), 0x003C, + ESC_REG(0x00F0), 0x0069, ESC_DELAY(120), + ESC_REG(0x0029), + ESC_REG(0x0011), + ESC_DELAY(100), + ESC_END +}; + #if ENABLED(TOUCH_BUTTONS) static const uint8_t buttonD[] = { @@ -560,7 +582,7 @@ static const uint16_t ili9341_init[] = { v = TFT_MARLINBG_COLOR; LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = v; } - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO LOOP_S_L_N(n, 1, FSMC_UPSCALE) for (uint16_t l = 0; l < length * (FSMC_UPSCALE); l++) buffer[l + (length * (FSMC_UPSCALE) * n)] = buffer[l]; @@ -586,41 +608,39 @@ static uint8_t page; uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - #ifdef LCD_USE_DMA_FSMC + + #if ENABLED(SPI_GRAPHICAL_TFT) + LCD_IO_Init(-1, -1); + #endif + + #if HAS_LCD_IO static uint16_t bufferA[WIDTH * sq(FSMC_UPSCALE)], bufferB[WIDTH * sq(FSMC_UPSCALE)]; uint16_t* buffer = &bufferA[0]; - bool allow_async = true; + bool allow_async = DISABLED(SPI_GRAPHICAL_TFT); #else uint16_t buffer[WIDTH*2]; // 16-bit RGB 565 pixel line buffer #endif + switch (msg) { case U8G_DEV_MSG_INIT: dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); switch (lcd_id & 0xFFFF) { case 0x8552: // ST7789V - #ifdef LCD_USE_DMA_FSMC - writeEscSequence(st7789v_init); - #else - writeEscSequence8(u8g, dev, st7789v_init); - #endif + WRITE_ESC_SEQUENCE(st7789v_init); setWindow = setWindow_st7789v; break; case 0x9328: // ILI9328 - #ifdef LCD_USE_DMA_FSMC - writeEscSequence(ili9328_init); - #else - writeEscSequence16(u8g, dev, ili9328_init); - #endif + WRITE_ESC_SEQUENCE(ili9328_init); setWindow = setWindow_ili9328; break; case 0x9341: // ILI9341 case 0x8066: // Anycubic / TronXY TFTs (480x320) - #ifdef LCD_USE_DMA_FSMC - writeEscSequence(ili9341_init); - #else - writeEscSequence8(u8g, dev, ili9341_init); - #endif + WRITE_ESC_SEQUENCE(ili9341_init); + setWindow = setWindow_st7789v; + break; + case 0x7796: + WRITE_ESC_SEQUENCE(TERN(HAS_LCD_IO, st9677_init, ili9341_init)); setWindow = setWindow_st7789v; break; case 0x0404: // No connected display on FSMC @@ -630,10 +650,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u lcd_id = 0; return 0; default: - if (lcd_id && 0xFF000000) - setWindow = setWindow_st7789v; - else - setWindow = setWindow_ili9328; + setWindow = (lcd_id & 0xFF000000) ? setWindow_st7789v : setWindow_ili9328; break; } @@ -644,7 +661,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u // Clear Screen setWindow(u8g, dev, 0, 0, LCD_FULL_PIXEL_WIDTH - 1, LCD_FULL_PIXEL_HEIGHT - 1); - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT); #else memset2(buffer, TFT_MARLINBG_COLOR, 160); @@ -681,7 +698,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u LOOP_L_N(y, PAGE_HEIGHT) { uint32_t k = 0; - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO buffer = (y & 1) ? bufferB : bufferA; #endif for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { @@ -689,7 +706,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR; LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = c; } - #ifdef LCD_USE_DMA_FSMC + #if HAS_LCD_IO LOOP_S_L_N(n, 1, FSMC_UPSCALE) for (uint16_t l = 0; l < WIDTH * (FSMC_UPSCALE); l++) buffer[l + WIDTH * (FSMC_UPSCALE) * n] = buffer[l]; diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 1b6dd0b9def8..5ebff37edfd1 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -182,12 +182,16 @@ #define U8G_CLASS U8GLIB_SH1106_128X64 #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS -#elif ENABLED(FSMC_GRAPHICAL_TFT) +#elif TFT_SCALED_DOGLCD // Unspecified 320x240 TFT pre-initialized by built-in bootloader #define U8G_CLASS U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 - #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN + #if ENABLED(FSMC_GRAPHICAL_TFT) + #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN + #else + #define U8G_PARAM -1, -1 + #endif #else @@ -210,18 +214,18 @@ // LCD_FULL_PIXEL_WIDTH = // LCD_PIXEL_OFFSET_X + (LCD_PIXEL_WIDTH * 2) + LCD_PIXEL_OFFSET_X -#if ENABLED(FSMC_GRAPHICAL_TFT) +#if TFT_SCALED_DOGLCD #ifndef LCD_FULL_PIXEL_WIDTH #define LCD_FULL_PIXEL_WIDTH 320 #endif #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 32 + #define LCD_PIXEL_OFFSET_X 32 #endif #ifndef LCD_FULL_PIXEL_HEIGHT #define LCD_FULL_PIXEL_HEIGHT 240 #endif #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 + #define LCD_PIXEL_OFFSET_Y 32 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 0a733049b87e..5a672d29b173 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -112,10 +112,10 @@ #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 + #define LCD_FULL_PIXEL_WIDTH 480 + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_FULL_PIXEL_HEIGHT 320 + #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -135,10 +135,19 @@ #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif + #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 0fb3a9a8799e..be71d3f2c246 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -118,10 +118,10 @@ // #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 + #define LCD_FULL_PIXEL_WIDTH 480 + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_FULL_PIXEL_HEIGHT 320 + #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -141,10 +141,18 @@ #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index ee88962e12bf..afbcc8f32a05 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -207,6 +207,13 @@ #define MT_DET_2_PIN PE6 #define MT_DET_PIN_INVERTING false +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN MT_DET_1_PIN +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN MT_DET_2_PIN +#endif + #define WIFI_IO0_PIN PC13 // @@ -224,7 +231,9 @@ // // LCD / Controller // -#define BEEPER_PIN PC5 +#ifndef BEEPER_PIN + #define BEEPER_PIN PC5 +#endif /** * Note: MKS Robin TFT screens use various TFT controllers. @@ -250,7 +259,6 @@ #define BTN_EN1 PE8 #define BTN_EN2 PE11 - #define BEEPER_PIN PC5 #define BTN_ENC PE13 #elif ENABLED(TFT_LITTLE_VGL_UI) @@ -269,16 +277,71 @@ #if HAS_SPI_LCD - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define LCD_BACKLIGHT_PIN -1 + #if ENABLED(SPI_GRAPHICAL_TFT) // Emulated DOGM SPI + #define SPI_TFT_CS_PIN PD11 + #define SPI_TFT_SCK_PIN PA5 + #define SPI_TFT_MISO_PIN PA6 + #define SPI_TFT_MOSI_PIN PA7 + #define SPI_TFT_DC_PIN PD10 + #define SPI_TFT_RST_PIN PC6 + + #define LCD_BACKLIGHT_PIN PD13 + + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + //#define TOUCH_BUTTONS + #if ENABLED(TOUCH_BUTTONS) + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -5481 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 4000 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 343 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 0 + #endif + #endif + + #ifndef FSMC_UPSCALE + #define FSMC_UPSCALE 3 + #endif + #ifndef LCD_FULL_PIXEL_WIDTH + #define LCD_FULL_PIXEL_WIDTH 480 + #endif + #ifndef LCD_PIXEL_OFFSET_X + #define LCD_PIXEL_OFFSET_X 48 + #endif + #ifndef LCD_FULL_PIXEL_HEIGHT + #define LCD_FULL_PIXEL_HEIGHT 320 + #endif + #ifndef LCD_PIXEL_OFFSET_Y + #define LCD_PIXEL_OFFSET_Y 32 + #endif + + #define BTN_ENC PE13 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 + + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 + + #elif ENABLED(MKS_MINI_12864) + + // MKS MINI12864 and MKS LCD12864B + // If using MKS LCD12864A (Need to remove RPK2 resistor) - // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) - #if ENABLED(MKS_MINI_12864) #define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN -1 #define DOGLCD_A0 PD11 @@ -320,3 +383,7 @@ #define W25QXX_MISO_PIN PB14 #define W25QXX_SCK_PIN PB13 #endif + +#if ENABLED(SPEAKER) && BEEPER_PIN == PC5 + #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER." +#endif From 8faa31df5427be7001affd28a96cf6886e9d1f49 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 30 Jul 2020 14:26:18 +1200 Subject: [PATCH 256/483] No HEATER_0_PIN needed with 0 EXTRUDERS (#18827) --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9fb742f50572..1db779b31e58 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1797,7 +1797,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Test Heater, Temp Sensor, and Extruder Pins */ -#if !HAS_HEATER_0 +#if !HAS_HEATER_0 && EXTRUDERS #error "HEATER_0_PIN not defined for this board." #elif !ANY_PIN(TEMP_0, MAX6675_SS) #error "TEMP_0_PIN not defined for this board." From bba157e5bd5a715e1c1e58061b9038adb981793a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 30 Jul 2020 00:04:47 -0300 Subject: [PATCH 257/483] SanityCheck: No Adafruit NeoPixel for STM32F1 (#18833) --- Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index 5559b3d4a480..ec7e8cf176e1 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -51,3 +51,7 @@ #elif ENABLED(SERIAL_STATS_DROPPED_RX) #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." #endif + +#if ENABLED(NEOPIXEL_LED) + #error "NEOPIXEL_LED (Adafruit NeoPixel) is not supported for HAL/STM32F1. Comment out this line to proceed at your own risk!" +#endif From 117df87d193994f6fbcd46c45573095adf921784 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilenko Date: Thu, 30 Jul 2020 09:43:19 +0300 Subject: [PATCH 258/483] Support for TFT & Touch Screens (#18130) --- .github/workflows/test-builds.yml | 1 + Marlin/Configuration.h | 22 +- Marlin/src/HAL/AVR/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/DUE/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h | 4 + Marlin/src/HAL/STM32/HAL.h | 5 + .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 73 +- Marlin/src/HAL/STM32/tft/tft_fsmc.cpp | 180 +++++ Marlin/src/HAL/STM32/tft/tft_fsmc.h | 160 +++++ Marlin/src/HAL/STM32/tft/tft_spi.cpp | 212 ++++++ Marlin/src/HAL/STM32/tft/tft_spi.h | 67 ++ Marlin/src/HAL/STM32/tft/xpt2046.cpp | 185 +++++ Marlin/src/HAL/STM32/tft/xpt2046.h | 86 +++ Marlin/src/HAL/STM32F1/SPI.cpp | 2 +- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 11 + .../HAL/STM32_F4_F7/inc/Conditionals_LCD.h | 4 + .../HAL/TEENSY31_32/inc/Conditionals_LCD.h | 4 + .../HAL/TEENSY35_36/inc/Conditionals_LCD.h | 4 + Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/core/boards.h | 5 + Marlin/src/feature/touch/xpt2046.cpp | 13 +- Marlin/src/gcode/bedlevel/G26.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 4 + Marlin/src/gcode/gcode.h | 3 + Marlin/src/gcode/lcd/M995.cpp | 39 ++ Marlin/src/inc/Conditionals_LCD.h | 40 +- Marlin/src/inc/Conditionals_adv.h | 11 + Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/SanityCheck.h | 18 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 8 +- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 345 ++++----- .../lib/mks_ui/tft_lvgl_configuration.cpp | 6 +- Marlin/src/lcd/menu/menu.cpp | 8 +- Marlin/src/lcd/menu/menu.h | 4 + Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 23 +- Marlin/src/lcd/menu/menu_touch_screen.cpp | 34 + Marlin/src/lcd/menu/menu_ubl.cpp | 6 +- Marlin/src/lcd/tft/bitmaps/back.bmp | Bin 0 -> 3126 bytes Marlin/src/lcd/tft/bitmaps/bed.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/bed_heated.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/cancel.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/chamber.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/confirm.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/decrease.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/directory.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/down.bmp | Bin 0 -> 3126 bytes Marlin/src/lcd/tft/bitmaps/fan0.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan1.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/feedrate.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/flowrate.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/hotend.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/increase.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/left.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/leveling.bmp | Bin 0 -> 3126 bytes .../bitmaps/marlin-logo/Marlin-1500x319.png | Bin 0 -> 387923 bytes .../tft/bitmaps/marlin-logo/Marlin-195x59.png | Bin 0 -> 18386 bytes .../marlin-logo/Marlin-228x255-greyscale.png | Bin 0 -> 7940 bytes .../bitmaps/marlin-logo/Marlin-228x255.png | Bin 0 -> 81470 bytes .../bitmaps/marlin-logo/Marlin-280x200.png | Bin 0 -> 46851 bytes .../bitmaps/marlin-logo/Marlin-320x240.png | Bin 0 -> 97523 bytes .../bitmaps/marlin-logo/Marlin-480x319.png | Bin 0 -> 168816 bytes .../bitmaps/marlin-logo/Marlin-480x320.png | Bin 0 -> 168834 bytes Marlin/src/lcd/tft/bitmaps/menu.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/pause.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/refresh.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/right.bmp | Bin 0 -> 3194 bytes Marlin/src/lcd/tft/bitmaps/sd.bmp | Bin 0 -> 12410 bytes Marlin/src/lcd/tft/bitmaps/settings.bmp | Bin 0 -> 12342 bytes Marlin/src/lcd/tft/bitmaps/up.bmp | Bin 0 -> 3126 bytes Marlin/src/lcd/tft/canvas.cpp | 179 +++++ Marlin/src/lcd/tft/canvas.h | 57 ++ .../src/lcd/tft/fontdata/fontdata_10x20.cpp | 257 +++++++ .../lcd/tft/fontdata/fontdata_ISO10646_1.cpp | 314 +++++++++ .../lcd/tft/fontdata/helvetica_12_bold.cpp | 302 ++++++++ Marlin/src/lcd/tft/fontdata/helvetica_14.cpp | 378 ++++++++++ Marlin/src/lcd/tft/fontdata/helvetica_18.cpp | 492 +++++++++++++ Marlin/src/lcd/tft/fontdata/profont_22.cpp | 426 ++++++++++++ Marlin/src/lcd/tft/ili9328.h | 150 ++++ Marlin/src/lcd/tft/ili9341.h | 162 +++++ Marlin/src/lcd/tft/ili9488.h | 156 +++++ Marlin/src/lcd/tft/images/back_32x32x4.cpp | 62 ++ .../lcd/tft/images/background_320x30x16.cpp | 60 ++ .../lcd/tft/images/bootscreen_112x38x1.cpp | 70 ++ .../lcd/tft/images/bootscreen_195x59x16.cpp | 89 +++ .../lcd/tft/images/bootscreen_228x255x2.cpp | 285 ++++++++ .../lcd/tft/images/bootscreen_228x255x4.cpp | 285 ++++++++ .../lcd/tft/images/bootscreen_320x240x16.cpp | 270 +++++++ .../lcd/tft/images/bootscreen_480x320x16.cpp | 350 ++++++++++ Marlin/src/lcd/tft/images/cancel_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/chamber_64x64x4.cpp | 161 +++++ Marlin/src/lcd/tft/images/confirm_64x64x4.cpp | 94 +++ .../src/lcd/tft/images/decrease_64x64x4.cpp | 94 +++ .../src/lcd/tft/images/directory_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/down_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/fan_64x64x4.cpp | 161 +++++ .../src/lcd/tft/images/fan_fast_64x64x4.cpp | 161 +++++ .../src/lcd/tft/images/fan_slow_64x64x4.cpp | 161 +++++ .../src/lcd/tft/images/feedrate_32x32x4.cpp | 62 ++ .../src/lcd/tft/images/flowrate_32x32x4.cpp | 62 ++ .../src/lcd/tft/images/heated_bed_64x64x4.cpp | 161 +++++ Marlin/src/lcd/tft/images/hotend_64x64x4.cpp | 94 +++ .../src/lcd/tft/images/increase_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/left_32x32x4.cpp | 62 ++ .../src/lcd/tft/images/leveling_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/menu_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/pause_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/refresh_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/right_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/images/sd_64x64x4.cpp | 94 +++ .../src/lcd/tft/images/settings_64x64x4.cpp | 94 +++ Marlin/src/lcd/tft/images/slider_8x16x4.cpp | 46 ++ Marlin/src/lcd/tft/images/up_32x32x4.cpp | 62 ++ Marlin/src/lcd/tft/r65105.h | 155 +++++ Marlin/src/lcd/tft/st7735.h | 128 ++++ Marlin/src/lcd/tft/st7789v.h | 148 ++++ Marlin/src/lcd/tft/st7796s.h | 175 +++++ Marlin/src/lcd/tft/tft.cpp | 199 ++++++ Marlin/src/lcd/tft/tft.h | 113 +++ Marlin/src/lcd/tft/tft_color.h | 112 +++ Marlin/src/lcd/tft/tft_image.cpp | 69 ++ Marlin/src/lcd/tft/tft_image.h | 160 +++++ Marlin/src/lcd/tft/tft_io.h | 30 + Marlin/src/lcd/tft/tft_queue.cpp | 346 +++++++++ Marlin/src/lcd/tft/tft_queue.h | 140 ++++ Marlin/src/lcd/tft/tft_string.cpp | 159 +++++ Marlin/src/lcd/tft/tft_string.h | 104 +++ Marlin/src/lcd/tft/touch.cpp | 293 ++++++++ Marlin/src/lcd/tft/touch.h | 180 +++++ Marlin/src/lcd/tft/ui_320x240.cpp | 653 +++++++++++++++++ Marlin/src/lcd/tft/ui_320x240.h | 106 +++ Marlin/src/lcd/tft/ui_480x320.cpp | 657 ++++++++++++++++++ Marlin/src/lcd/tft/ui_480x320.h | 106 +++ Marlin/src/lcd/ultralcd.cpp | 20 +- Marlin/src/lcd/ultralcd.h | 25 +- Marlin/src/module/configuration_store.cpp | 31 + Marlin/src/pins/pins.h | 8 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 2 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 68 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 2 +- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 2 +- buildroot/bin/opt_add | 2 +- buildroot/bin/use_example_configs | 15 +- .../share/PlatformIO/scripts/mks_encrypt.py | 32 + .../variants/CHITU_F103/wirish/boards.cpp | 2 +- .../variants/MARLIN_F103Vx/PeripheralPins.c | 425 +++++++++++ .../variants/MARLIN_F103Vx/PinNamesVar.h | 30 + .../variants/MARLIN_F103Vx/ldscript.ld | 200 ++++++ .../variants/MARLIN_F103Vx/variant.cpp | 235 +++++++ .../variants/MARLIN_F103Vx/variant.h | 181 +++++ .../variants/MARLIN_F103Zx/PeripheralPins.c | 368 ++++++++++ .../variants/MARLIN_F103Zx/PinNamesVar.h | 30 + .../variants/MARLIN_F103Zx/hal_conf_custom.h | 412 +++++++++++ .../variants/MARLIN_F103Zx/ldscript.ld | 200 ++++++ .../variants/MARLIN_F103Zx/variant.cpp | 222 ++++++ .../variants/MARLIN_F103Zx/variant.h | 232 +++++++ buildroot/tests/mks_robin-tests | 7 +- buildroot/tests/mks_robin_mini-tests | 5 +- buildroot/tests/mks_robin_nano-tests | 5 +- buildroot/tests/mks_robin_stm32-tests | 13 + platformio.ini | 25 +- 176 files changed, 14755 insertions(+), 311 deletions(-) create mode 100644 Marlin/src/HAL/STM32/tft/tft_fsmc.cpp create mode 100644 Marlin/src/HAL/STM32/tft/tft_fsmc.h create mode 100644 Marlin/src/HAL/STM32/tft/tft_spi.cpp create mode 100644 Marlin/src/HAL/STM32/tft/tft_spi.h create mode 100644 Marlin/src/HAL/STM32/tft/xpt2046.cpp create mode 100644 Marlin/src/HAL/STM32/tft/xpt2046.h create mode 100644 Marlin/src/gcode/lcd/M995.cpp create mode 100644 Marlin/src/lcd/menu/menu_touch_screen.cpp create mode 100644 Marlin/src/lcd/tft/bitmaps/back.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/bed.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/bed_heated.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/cancel.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/chamber.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/confirm.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/decrease.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/directory.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/down.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan0.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan1.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/feedrate.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/flowrate.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/hotend.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/increase.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/left.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/leveling.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-195x59.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-280x200.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png create mode 100644 Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x320.png create mode 100644 Marlin/src/lcd/tft/bitmaps/menu.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/pause.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/refresh.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/right.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/sd.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/settings.bmp create mode 100644 Marlin/src/lcd/tft/bitmaps/up.bmp create mode 100644 Marlin/src/lcd/tft/canvas.cpp create mode 100644 Marlin/src/lcd/tft/canvas.h create mode 100644 Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/helvetica_14.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/helvetica_18.cpp create mode 100644 Marlin/src/lcd/tft/fontdata/profont_22.cpp create mode 100644 Marlin/src/lcd/tft/ili9328.h create mode 100644 Marlin/src/lcd/tft/ili9341.h create mode 100644 Marlin/src/lcd/tft/ili9488.h create mode 100644 Marlin/src/lcd/tft/images/back_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/background_320x30x16.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp create mode 100644 Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp create mode 100644 Marlin/src/lcd/tft/images/cancel_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/chamber_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/confirm_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/decrease_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/directory_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/down_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/fan_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/hotend_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/increase_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/left_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/leveling_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/menu_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/pause_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/refresh_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/right_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/images/sd_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/settings_64x64x4.cpp create mode 100644 Marlin/src/lcd/tft/images/slider_8x16x4.cpp create mode 100644 Marlin/src/lcd/tft/images/up_32x32x4.cpp create mode 100644 Marlin/src/lcd/tft/r65105.h create mode 100644 Marlin/src/lcd/tft/st7735.h create mode 100644 Marlin/src/lcd/tft/st7789v.h create mode 100644 Marlin/src/lcd/tft/st7796s.h create mode 100644 Marlin/src/lcd/tft/tft.cpp create mode 100644 Marlin/src/lcd/tft/tft.h create mode 100644 Marlin/src/lcd/tft/tft_color.h create mode 100644 Marlin/src/lcd/tft/tft_image.cpp create mode 100644 Marlin/src/lcd/tft/tft_image.h create mode 100644 Marlin/src/lcd/tft/tft_io.h create mode 100644 Marlin/src/lcd/tft/tft_queue.cpp create mode 100644 Marlin/src/lcd/tft/tft_queue.h create mode 100644 Marlin/src/lcd/tft/tft_string.cpp create mode 100644 Marlin/src/lcd/tft/tft_string.h create mode 100644 Marlin/src/lcd/tft/touch.cpp create mode 100644 Marlin/src/lcd/tft/touch.h create mode 100644 Marlin/src/lcd/tft/ui_320x240.cpp create mode 100644 Marlin/src/lcd/tft/ui_320x240.h create mode 100644 Marlin/src/lcd/tft/ui_480x320.cpp create mode 100644 Marlin/src/lcd/tft/ui_480x320.h create mode 100644 buildroot/share/PlatformIO/scripts/mks_encrypt.py create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp create mode 100644 buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h create mode 100644 buildroot/tests/mks_robin_stm32-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 4dd483499b6a..bcc42fbd6001 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -67,6 +67,7 @@ jobs: - BIGTREE_SKR_PRO - BIGTREE_GTR_V1_0 - mks_robin + - mks_robin_stm32 - ARMED - FYSETC_S6 - STM32F070RB_malyan diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c6ec607d9b8f..363ea2f351ff 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2150,6 +2150,22 @@ //=============================== Graphical TFTs ============================== //============================================================================= +// +// TFT display with optional touch screen +// Color Marlin UI with standard menu system +// +//#define TFT_320x240 +//#define TFT_320x240_SPI +//#define TFT_480x320 +//#define TFT_480x320_SPI + +// +// Skip autodetect and force specific TFT driver +// Mandatory for SPI screens with no MISO line +// Available drivers are: ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488 +// +//#define TFT_DRIVER AUTO + // // FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) // Upscaled 128x64 Marlin UI @@ -2190,11 +2206,13 @@ // // ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8 // -//#define TOUCH_BUTTONS -#if ENABLED(TOUCH_BUTTONS) +//#define TOUCH_SCREEN +#if ENABLED(TOUCH_SCREEN) #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus + #define TOUCH_SCREEN_CALIBRATION + //#define XPT2046_X_CALIBRATION 12316 //#define XPT2046_Y_CALIBRATION -8981 //#define XPT2046_X_OFFSET -43 diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h index 5f1c4b16019d..a611ccd7c4a9 100644 --- a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/AVR." +#endif diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h index 5f1c4b16019d..58674144470c 100644 --- a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/DUE." +#endif diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h index 5f1c4b16019d..4da600179d6c 100644 --- a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/ESP32." +#endif diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h index 5f1c4b16019d..99a6fc27534a 100644 --- a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/LINUX." +#endif diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h index 5f1c4b16019d..7d4de40faac2 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/LPC1768." +#endif diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h index 5f1c4b16019d..932348c52f40 100644 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/SAMD51." +#endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 730ada96c197..08081331b736 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -213,5 +213,10 @@ uint16_t HAL_adc_get_result(); #define GET_PIN_MAP_INDEX(pin) pin #define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) +#ifdef STM32F1xx + #define JTAG_DISABLE() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_JTAGDISABLE) + #define JTAGSWD_DISABLE() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_DISABLE) +#endif + #define PLATFORM_M997_SUPPORT void flashFirmware(const int16_t); diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index 9d32b342e440..6e73e87c2123 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -76,7 +76,24 @@ SD_HandleTypeDef hsd; // create SDIO structure - #define TRANSFER_CLOCK_DIV (uint8_t(SDIO_INIT_CLK_DIV) / 40) + /* + SDIO_INIT_CLK_DIV is 118 + SDIO clock frequency is 48MHz / (TRANSFER_CLOCK_DIV + 2) + SDIO init clock frequency should not exceed 400KHz = 48MHz / (118 + 2) + + Default TRANSFER_CLOCK_DIV is 2 (118 / 40) + Default SDIO clock frequency is 48MHz / (2 + 2) = 12 MHz + This might be too fast for stable SDIO operations + + MKS Robin board seems to have stable SDIO with BusWide 1bit and ClockDiv 8 i.e. 4.8MHz SDIO clock frequency + Additional testing is required as there are clearly some 4bit initialization problems + + Add -DTRANSFER_CLOCK_DIV=8 to build parameters to improve SDIO stability + */ + + #ifndef TRANSFER_CLOCK_DIV + #define TRANSFER_CLOCK_DIV (uint8_t(SDIO_INIT_CLK_DIV) / 40) + #endif #ifndef USBD_OK #define USBD_OK 0 @@ -100,24 +117,25 @@ void SD_LowLevel_Init(void) { uint32_t tempreg; - GPIO_InitTypeDef GPIO_InitStruct; - + __HAL_RCC_SDIO_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); //enable GPIO clocks __HAL_RCC_GPIOD_CLK_ENABLE(); //enable GPIO clocks - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_12; // D0 & SCK + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = 1; //GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + + #if DISABLED(STM32F1xx) + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + #endif + + GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_12; // D0 & SCK HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); #if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // define D1-D3 only if have a four bit wide SDIO bus GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11; // D1-D3 - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = 1; // GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); #endif @@ -125,10 +143,13 @@ GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset - RCC->APB2ENR |= RCC_APB2RSTR_SDIORST_Msk; // enable SDIO clock - // Enable the DMA2 Clock + #if DISABLED(STM32F1xx) + // TODO: use __HAL_RCC_SDIO_RELEASE_RESET() and __HAL_RCC_SDIO_CLK_ENABLE(); + RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset + RCC->APB2ENR |= RCC_APB2RSTR_SDIORST_Msk; // enable SDIO clock + // Enable the DMA2 Clock + #endif //Initialize the SDIO (with initial <400Khz Clock) tempreg = 0; //Reset value @@ -156,10 +177,21 @@ bool status; hsd.Instance = SDIO; hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET + + /* + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 8; + */ + SD_LowLevel_Init(); uint8_t retry_Cnt = retryCnt; for (;;) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); status = (bool) HAL_SD_Init(&hsd); if (!status) break; if (!--retry_Cnt) return false; // return failing status if retries are exhausted @@ -170,6 +202,7 @@ #if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // go to 4 bit wide mode if pins are defined retry_Cnt = retryCnt; for (;;) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); if (!HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)) break; // some cards are only 1 bit wide so a pass here is not required if (!--retry_Cnt) break; } @@ -178,6 +211,7 @@ SD_LowLevel_Init(); retry_Cnt = retryCnt; for (;;) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); status = (bool) HAL_SD_Init(&hsd); if (!status) break; if (!--retry_Cnt) return false; // return failing status if retries are exhausted @@ -187,15 +221,15 @@ return true; } - + /* void init_SDIO_pins(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - /**SDIO GPIO Configuration - PC8 ------> SDIO_D0 - PC12 ------> SDIO_CK - PD2 ------> SDIO_CMD - */ + // SDIO GPIO Configuration + // PC8 ------> SDIO_D0 + // PC12 ------> SDIO_CK + // PD2 ------> SDIO_CMD + GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; @@ -217,7 +251,7 @@ GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); } - + */ //bool SDIO_init() { return (bool) (SD_SDIO_Init() ? 1 : 0);} //bool SDIO_Init_C() { return (bool) (SD_SDIO_Init() ? 1 : 0);} @@ -227,6 +261,7 @@ bool status; for (;;) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); status = (bool) HAL_SD_ReadBlocks(&hsd, (uint8_t*)dst, block, 1, 1000); // read one 512 byte block with 500mS timeout status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK if (!status) break; // return passing status diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp new file mode 100644 index 000000000000..f11fab39dbad --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_FSMC_TFT + +#include "tft_fsmc.h" +#include "pinconfig.h" + +SRAM_HandleTypeDef TFT_FSMC::SRAMx; +DMA_HandleTypeDef TFT_FSMC::DMAtx; +LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD; + +void TFT_FSMC::Init() { + uint32_t controllerAddress; + + #if PIN_EXISTS(TFT_RESET) + OUT_WRITE(TFT_RESET_PIN, HIGH); + HAL_Delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif + + FSMC_NORSRAM_TimingTypeDef Timing, ExtTiming; + + uint32_t NSBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); + + SRAMx.Instance = FSMC_NORSRAM_DEVICE; + SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE; + /* SRAMx.Init */ + SRAMx.Init.NSBank = NSBank; + SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; + SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; + SRAMx.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; + SRAMx.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; + SRAMx.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; + SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE; + SRAMx.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; + SRAMx.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; + SRAMx.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; + SRAMx.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE; + SRAMx.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; + SRAMx.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; + #ifdef STM32F4xx + SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE; + #endif + /* Read Timing - relatively slow to ensure ID information is correctly read from TFT controller */ + /* Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss */ + Timing.AddressSetupTime = 15; + Timing.AddressHoldTime = 15; + Timing.DataSetupTime = 24; + Timing.BusTurnAroundDuration = 0; + Timing.CLKDivision = 16; + Timing.DataLatency = 17; + Timing.AccessMode = FSMC_ACCESS_MODE_A; + /* Write Timing */ + /* Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss */ + ExtTiming.AddressSetupTime = 8; + ExtTiming.AddressHoldTime = 15; + ExtTiming.DataSetupTime = 8; + ExtTiming.BusTurnAroundDuration = 0; + ExtTiming.CLKDivision = 16; + ExtTiming.DataLatency = 17; + ExtTiming.AccessMode = FSMC_ACCESS_MODE_A; + + __HAL_RCC_FSMC_CLK_ENABLE(); + + for(uint16_t i = 0; PinMap_FSMC[i].pin != NC; i++) + pinmap_pinout(PinMap_FSMC[i].pin, PinMap_FSMC); + pinmap_pinout(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); + pinmap_pinout(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); + + controllerAddress = FSMC_BANK1_1; + #ifdef PF0 + switch (NSBank) { + case FSMC_NORSRAM_BANK2: controllerAddress = FSMC_BANK1_2 ; break; + case FSMC_NORSRAM_BANK3: controllerAddress = FSMC_BANK1_3 ; break; + case FSMC_NORSRAM_BANK4: controllerAddress = FSMC_BANK1_4 ; break; + } + #endif + + controllerAddress |= (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); + + HAL_SRAM_Init(&SRAMx, &Timing, &ExtTiming); + + __HAL_RCC_DMA2_CLK_ENABLE(); + + #ifdef STM32F1xx + DMAtx.Instance = DMA2_Channel1; + #elif defined(STM32F4xx) + DMAtx.Instance = DMA2_Stream0; + DMAtx.Init.Channel = DMA_CHANNEL_0; + DMAtx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + DMAtx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + DMAtx.Init.MemBurst = DMA_MBURST_SINGLE; + DMAtx.Init.PeriphBurst = DMA_PBURST_SINGLE; + #endif + + DMAtx.Init.Direction = DMA_MEMORY_TO_MEMORY; + DMAtx.Init.MemInc = DMA_MINC_DISABLE; + DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + DMAtx.Init.Mode = DMA_NORMAL; + DMAtx.Init.Priority = DMA_PRIORITY_HIGH; + + LCD = (LCD_CONTROLLER_TypeDef *)controllerAddress; +} + +uint32_t TFT_FSMC::GetID() { + uint32_t id; + WriteReg(0x0000); + id = LCD->RAM; + + if (id == 0) + id = ReadID(LCD_READ_ID); + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + + uint32_t TFT_FSMC::ReadID(uint16_t Reg) { + uint32_t id; + WriteReg(Reg); + id = LCD->RAM; // dummy read + id = Reg << 24; + id |= (LCD->RAM & 0x00FF) << 16; + id |= (LCD->RAM & 0x00FF) << 8; + id |= LCD->RAM & 0x00FF; + return id; + } + +bool TFT_FSMC::isBusy() { + if (__IS_DMA_ENABLED(&DMAtx)) + if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) + Abort(); + return __IS_DMA_ENABLED(&DMAtx); +} + +void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + DMAtx.Init.PeriphInc = MemoryIncrease; + HAL_DMA_Init(&DMAtx); + + __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)); + __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)); + + #ifdef STM32F1xx + DMAtx.Instance->CNDTR = Count; + DMAtx.Instance->CPAR = (uint32_t)Data; + DMAtx.Instance->CMAR = (uint32_t)&(LCD->RAM); + #elif defined(STM32F4xx) + DMAtx.Instance->NDTR = Count; + DMAtx.Instance->PAR = (uint32_t)Data; + DMAtx.Instance->M0AR = (uint32_t)&(LCD->RAM); + #endif + __HAL_DMA_ENABLE(&DMAtx); +} + +#endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h new file mode 100644 index 000000000000..8500fee113eb --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef STM32F1xx + #include "stm32f1xx_hal.h" +#elif defined(STM32F4xx) + #include "stm32f4xx_hal.h" +#else + #error FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware. +#endif + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#define DATASIZE_8BIT SPI_DATASIZE_8BIT +#define DATASIZE_16BIT SPI_DATASIZE_16BIT +#define TFT_IO TFT_FSMC + +#ifdef STM32F1xx + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) +#elif defined(STM32F4xx) + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) +#endif + +typedef struct { + __IO uint16_t REG; + __IO uint16_t RAM; +} LCD_CONTROLLER_TypeDef; + +class TFT_FSMC { + private: + static SRAM_HandleTypeDef SRAMx; + static DMA_HandleTypeDef DMAtx; + + static LCD_CONTROLLER_TypeDef *LCD; + + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data) { LCD->RAM = Data; __DSB(); } + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + + public: + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort() { __HAL_DMA_DISABLE(&DMAtx); } + + static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {} + static void DataTransferEnd() {}; + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg) { LCD->REG = Reg; __DSB(); } + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } +}; + + +#ifdef STM32F1xx + #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE) +#elif defined(STM32F4xx) + #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FSMC) + #define FSMC_BANK1_1 0x60000000U + #define FSMC_BANK1_2 0x64000000U + #define FSMC_BANK1_3 0x68000000U + #define FSMC_BANK1_4 0x6C000000U +#else + #error No configuration for this MCU +#endif + +const PinMap PinMap_FSMC[] = { + {PD_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D00 + {PD_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D01 + {PD_0, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D02 + {PD_1, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D03 + {PE_7, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D04 + {PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05 + {PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06 + {PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07 + {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08 + {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09 + {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10 + {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11 + {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12 + {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13 + {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14 + {PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15 + {PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE + {PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE + {NC, NP, 0} +}; + +const PinMap PinMap_FSMC_CS[] = { + {PD_7, (void *)FSMC_NORSRAM_BANK1, FSMC_PIN_DATA}, // FSMC_NE1 + #ifdef PF0 + {PG_9, (void *)FSMC_NORSRAM_BANK2, FSMC_PIN_DATA}, // FSMC_NE2 + {PG_10, (void *)FSMC_NORSRAM_BANK3, FSMC_PIN_DATA}, // FSMC_NE3 + {PG_12, (void *)FSMC_NORSRAM_BANK4, FSMC_PIN_DATA}, // FSMC_NE4 + #endif + {NC, NP, 0} +}; + +#define FSMC_RS(A) (void *)((2 << A) - 2) + +const PinMap PinMap_FSMC_RS[] = { + #ifdef PF0 + {PF_0, FSMC_RS( 0), FSMC_PIN_DATA}, // FSMC_A0 + {PF_1, FSMC_RS( 1), FSMC_PIN_DATA}, // FSMC_A1 + {PF_2, FSMC_RS( 2), FSMC_PIN_DATA}, // FSMC_A2 + {PF_3, FSMC_RS( 3), FSMC_PIN_DATA}, // FSMC_A3 + {PF_4, FSMC_RS( 4), FSMC_PIN_DATA}, // FSMC_A4 + {PF_5, FSMC_RS( 5), FSMC_PIN_DATA}, // FSMC_A5 + {PF_12, FSMC_RS( 6), FSMC_PIN_DATA}, // FSMC_A6 + {PF_13, FSMC_RS( 7), FSMC_PIN_DATA}, // FSMC_A7 + {PF_14, FSMC_RS( 8), FSMC_PIN_DATA}, // FSMC_A8 + {PF_15, FSMC_RS( 9), FSMC_PIN_DATA}, // FSMC_A9 + {PG_0, FSMC_RS(10), FSMC_PIN_DATA}, // FSMC_A10 + {PG_1, FSMC_RS(11), FSMC_PIN_DATA}, // FSMC_A11 + {PG_2, FSMC_RS(12), FSMC_PIN_DATA}, // FSMC_A12 + {PG_3, FSMC_RS(13), FSMC_PIN_DATA}, // FSMC_A13 + {PG_4, FSMC_RS(14), FSMC_PIN_DATA}, // FSMC_A14 + {PG_5, FSMC_RS(15), FSMC_PIN_DATA}, // FSMC_A15 + #endif + {PD_11, FSMC_RS(16), FSMC_PIN_DATA}, // FSMC_A16 + {PD_12, FSMC_RS(17), FSMC_PIN_DATA}, // FSMC_A17 + {PD_13, FSMC_RS(18), FSMC_PIN_DATA}, // FSMC_A18 + {PE_3, FSMC_RS(19), FSMC_PIN_DATA}, // FSMC_A19 + {PE_4, FSMC_RS(20), FSMC_PIN_DATA}, // FSMC_A20 + {PE_5, FSMC_RS(21), FSMC_PIN_DATA}, // FSMC_A21 + {PE_6, FSMC_RS(22), FSMC_PIN_DATA}, // FSMC_A22 + {PE_2, FSMC_RS(23), FSMC_PIN_DATA}, // FSMC_A23 + #ifdef PF0 + {PG_13, FSMC_RS(24), FSMC_PIN_DATA}, // FSMC_A24 + {PG_14, FSMC_RS(25), FSMC_PIN_DATA}, // FSMC_A25 + #endif + {NC, NP, 0} +}; diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp new file mode 100644 index 000000000000..d3eb4ba8db6a --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -0,0 +1,212 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT + +#include "tft_spi.h" +#include "pinconfig.h" + +SPI_HandleTypeDef TFT_SPI::SPIx; +DMA_HandleTypeDef TFT_SPI::DMAtx; + +void TFT_SPI::Init() { + SPI_TypeDef *spiInstance; + + #if PIN_EXISTS(TFT_RESET) + OUT_WRITE(TFT_RESET_PIN, HIGH); + HAL_Delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif + + OUT_WRITE(TFT_A0_PIN, HIGH); + OUT_WRITE(TFT_CS_PIN, HIGH); + + if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return; + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI)) return; + + #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN) + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return; + #endif + + SPIx.Instance = spiInstance; + SPIx.State = HAL_SPI_STATE_RESET; + SPIx.Init.NSS = SPI_NSS_SOFT; + SPIx.Init.Mode = SPI_MODE_MASTER; + SPIx.Init.Direction = + #if TFT_MISO_PIN == TFT_MOSI_PIN + SPI_DIRECTION_1LINE; + #else + SPI_DIRECTION_2LINES; + #endif + SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + SPIx.Init.CLKPhase = SPI_PHASE_1EDGE; + SPIx.Init.CLKPolarity = SPI_POLARITY_LOW; + SPIx.Init.DataSize = SPI_DATASIZE_8BIT; + SPIx.Init.FirstBit = SPI_FIRSTBIT_MSB; + SPIx.Init.TIMode = SPI_TIMODE_DISABLE; + SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPIx.Init.CRCPolynomial = 10; + + pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK); + pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI); + #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN) + pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO); + #endif + pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN); + + #ifdef SPI1_BASE + if (SPIx.Instance == SPI1) { + __HAL_RCC_SPI1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; + DMAtx.Instance = DMA1_Channel3; + } + #endif + #ifdef SPI2_BASE + if (SPIx.Instance == SPI2) { + __HAL_RCC_SPI2_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + DMAtx.Instance = DMA1_Channel5; + } + #endif + #ifdef SPI3_BASE + if (SPIx.Instance == SPI3) { + __HAL_RCC_SPI3_CLK_ENABLE(); + __HAL_RCC_DMA2_CLK_ENABLE(); + DMAtx.Instance = DMA2_Channel2; + } + #endif + + HAL_SPI_Init(&SPIx); + + DMAtx.Init.Direction = DMA_MEMORY_TO_PERIPH; + DMAtx.Init.PeriphInc = DMA_PINC_DISABLE; + DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; + DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; + DMAtx.Init.Mode = DMA_NORMAL; + DMAtx.Init.Priority = DMA_PRIORITY_LOW; +} + +void TFT_SPI::DataTransferBegin(uint16_t DataSize) { + SPIx.Init.DataSize = DataSize == DATASIZE_8BIT ? SPI_DATASIZE_8BIT : SPI_DATASIZE_16BIT; + HAL_SPI_Init(&SPIx); + WRITE(TFT_CS_PIN, LOW); +} + +uint32_t TFT_SPI::GetID() { + uint32_t id; + id = ReadID(LCD_READ_ID); + + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + +uint32_t TFT_SPI::ReadID(uint16_t Reg) { + #if !PIN_EXISTS(TFT_MISO) + return 0; + #else + uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler; + uint32_t i, Data = 0; + + SPIx.Init.BaudRatePrescaler = SPIx.Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4; + DataTransferBegin(DATASIZE_8BIT); + WriteReg(Reg); + + if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_RX(&SPIx); + __HAL_SPI_ENABLE(&SPIx); + + for (i = 0; i < 4; i++) { + #if TFT_MISO_PIN != TFT_MOSI_PIN + //if (hspi->Init.Direction == SPI_DIRECTION_2LINES) { + while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} + SPIx.Instance->DR = 0; + //} + #endif + while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} + Data = (Data << 8) | SPIx.Instance->DR; + } + + __HAL_SPI_DISABLE(&SPIx); + DataTransferEnd(); + + SPIx.Init.BaudRatePrescaler = BaudRatePrescaler; + + return Data >> 7; + #endif +} + +bool TFT_SPI::isBusy() { + if (DMAtx.Instance->CCR & DMA_CCR_EN) + if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) + Abort(); + return DMAtx.Instance->CCR & DMA_CCR_EN; +} + +void TFT_SPI::Abort() { + __HAL_DMA_DISABLE(&DMAtx); + DataTransferEnd(); +} + +void TFT_SPI::Transmit(uint16_t Data) { + #if TFT_MISO_PIN == TFT_MOSI_PIN + SPI_1LINE_TX(&SPIx); + #endif + + __HAL_SPI_ENABLE(&SPIx); + + SPIx.Instance->DR = Data; + + while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} + while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {} + + #if TFT_MISO_PIN != TFT_MOSI_PIN + __HAL_SPI_CLEAR_OVRFLAG(&SPIx); /* Clear overrun flag in 2 Lines communication mode because received is not read */ + #endif +} + +void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + DMAtx.Init.MemInc = MemoryIncrease; + HAL_DMA_Init(&DMAtx); + + DataTransferBegin(); + + #if TFT_MISO_PIN == TFT_MOSI_PIN + SPI_1LINE_TX(&SPIx); + #endif + + DMAtx.DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << DMAtx.ChannelIndex); + DMAtx.Instance->CNDTR = Count; + DMAtx.Instance->CPAR = (uint32_t)&(SPIx.Instance->DR); + DMAtx.Instance->CMAR = (uint32_t)Data; + __HAL_DMA_ENABLE(&DMAtx); + __HAL_SPI_ENABLE(&SPIx); + + SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ +} + +#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.h b/Marlin/src/HAL/STM32/tft/tft_spi.h new file mode 100644 index 000000000000..1eed45a709cc --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/tft_spi.h @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef STM32F1xx + #include "stm32f1xx_hal.h" +#elif defined(STM32F4xx) + #include "stm32f4xx_hal.h" +#else + #error SPI TFT is currently only supported on STM32F1 and STM32F4 hardware. +#endif + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#define DATASIZE_8BIT SPI_DATASIZE_8BIT +#define DATASIZE_16BIT SPI_DATASIZE_16BIT +#define TFT_IO TFT_SPI + +class TFT_SPI { +private: + static SPI_HandleTypeDef SPIx; + static DMA_HandleTypeDef DMAtx; + + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + +public: + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort(); + + static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT); + static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); }; + static void DataTransferAbort(); + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg) { WRITE(TFT_A0_PIN, LOW); Transmit(Reg); WRITE(TFT_A0_PIN, HIGH); } + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } +}; diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp new file mode 100644 index 000000000000..49e64da6a113 --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp @@ -0,0 +1,185 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TFT_XPT2046 + +#include "xpt2046.h" +#include "pinconfig.h" + +uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } + +SPI_HandleTypeDef XPT2046::SPIx; +DMA_HandleTypeDef XPT2046::DMAtx; + +void XPT2046::Init() { + SPI_TypeDef *spiInstance; + + OUT_WRITE(TOUCH_CS_PIN, HIGH); + + #if PIN_EXISTS(TOUCH_INT) + // Optional Pendrive interrupt pin + SET_INPUT(TOUCH_INT_PIN); + #endif + + spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_SCK_PIN), PinMap_SPI_SCLK); + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_MOSI_PIN), PinMap_SPI_MOSI)) spiInstance = NP; + if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO)) spiInstance = NP; + + SPIx.Instance = spiInstance; + + if (SPIx.Instance) { + SPIx.State = HAL_SPI_STATE_RESET; + SPIx.Init.NSS = SPI_NSS_SOFT; + SPIx.Init.Mode = SPI_MODE_MASTER; + SPIx.Init.Direction = SPI_DIRECTION_2LINES; + SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; + SPIx.Init.CLKPhase = SPI_PHASE_2EDGE; + SPIx.Init.CLKPolarity = SPI_POLARITY_HIGH; + SPIx.Init.DataSize = SPI_DATASIZE_8BIT; + SPIx.Init.FirstBit = SPI_FIRSTBIT_MSB; + SPIx.Init.TIMode = SPI_TIMODE_DISABLE; + SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + SPIx.Init.CRCPolynomial = 10; + + pinmap_pinout(digitalPinToPinName(TOUCH_SCK_PIN), PinMap_SPI_SCLK); + pinmap_pinout(digitalPinToPinName(TOUCH_MOSI_PIN), PinMap_SPI_MOSI); + pinmap_pinout(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO); + + #ifdef SPI1_BASE + if (SPIx.Instance == SPI1) { + __HAL_RCC_SPI1_CLK_ENABLE(); + SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + #ifdef STM32F1xx + DMAtx.Instance = DMA1_Channel3; + #elif defined(STM32F4xx) + DMAtx.Instance = DMA2_Stream3; // DMA2_Stream5 + #endif + //SERIAL_ECHO_MSG(" Touch Screen on SPI1"); + } + #endif + #ifdef SPI2_BASE + if (SPIx.Instance == SPI2) { + __HAL_RCC_SPI2_CLK_ENABLE(); + #ifdef STM32F1xx + DMAtx.Instance = DMA1_Channel5; + #elif defined(STM32F4xx) + DMAtx.Instance = DMA1_Stream4; + #endif + //SERIAL_ECHO_MSG(" Touch Screen on SPI2"); + } + #endif + #ifdef SPI3_BASE + if (SPIx.Instance == SPI3) { + __HAL_RCC_SPI3_CLK_ENABLE(); + #ifdef STM32F1xx + DMAtx.Instance = DMA2_Channel2; + #elif defined(STM32F4xx) + DMAtx.Instance = DMA1_Stream5; // DMA1_Stream7 + #endif + //SERIAL_ECHO_MSG(" Touch Screen on SPI3"); + } + #endif + } + else { + SPIx.Instance = NULL; + SET_INPUT(TOUCH_MISO_PIN); + SET_OUTPUT(TOUCH_MOSI_PIN); + SET_OUTPUT(TOUCH_SCK_PIN); + //SERIAL_ECHO_MSG(" Touch Screen on Software SPI"); + } + + getRawData(XPT2046_Z1); +} + +bool XPT2046::isTouched() { + return isBusy() ? false : ( + #if PIN_EXISTS(TOUCH_INT) + READ(TOUCH_INT_PIN) != HIGH + #else + getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD + #endif + ); +} + +bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { + if (isBusy()) return false; + if (!isTouched()) return false; + *x = getRawData(XPT2046_X); + *y = getRawData(XPT2046_Y); + return isTouched(); +} + +uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { + uint16_t data[3]; + + DataTransferBegin(); + + for (uint16_t i = 0; i < 3 ; i++) { + IO(coordinate); + data[i] = (IO() << 4) | (IO() >> 4); + } + + DataTransferEnd(); + + uint16_t delta01 = delta(data[0], data[1]); + uint16_t delta02 = delta(data[0], data[2]); + uint16_t delta12 = delta(data[1], data[2]); + + if (delta01 > delta02 || delta01 > delta12) { + if (delta02 > delta12) + data[0] = data[2]; + else + data[1] = data[2]; + } + + return (data[0] + data[1]) >> 1; +} + +uint16_t XPT2046::HardwareIO(uint16_t data) { + __HAL_SPI_ENABLE(&SPIx); + while((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} + SPIx.Instance->DR = data; + while((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} + __HAL_SPI_DISABLE(&SPIx); + + return SPIx.Instance->DR; +} + +uint16_t XPT2046::SoftwareIO(uint16_t data) { + uint16_t result = 0; + + for (uint8_t j = 0x80; j > 0; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + __DSB(); + WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); + __DSB(); + if (READ(TOUCH_MISO_PIN)) result |= j; + __DSB(); + WRITE(TOUCH_SCK_PIN, HIGH); + __DSB(); + } + WRITE(TOUCH_SCK_PIN, LOW); + __DSB(); + + return result; +} + +#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h new file mode 100644 index 000000000000..7a6d8439c59c --- /dev/null +++ b/Marlin/src/HAL/STM32/tft/xpt2046.h @@ -0,0 +1,86 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifdef STM32F1xx + #include +#elif defined(STM32F4xx) + #include +#endif + +#include "../../../inc/MarlinConfig.h" + +// Not using regular SPI interface by default to avoid SPI mode conflicts with other SPI devices + +#if !PIN_EXISTS(TOUCH_MISO) + #error "TOUCH_MISO_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_MOSI) + #error "TOUCH_MOSI_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_SCK) + #error "TOUCH_SCK_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_CS) + #error "TOUCH_CS_PIN is not defined." +#endif + +#ifndef TOUCH_INT_PIN + #define TOUCH_INT_PIN -1 +#endif + +#define XPT2046_DFR_MODE 0x00 +#define XPT2046_SER_MODE 0x04 +#define XPT2046_CONTROL 0x80 + +enum XPTCoordinate : uint8_t { + XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, +}; + +#if !defined(XPT2046_Z1_THRESHOLD) + #define XPT2046_Z1_THRESHOLD 10 +#endif + +#ifdef STM32F1xx + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) +#elif defined(STM32F4xx) + #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) +#endif + + +class XPT2046 { +private: + static SPI_HandleTypeDef SPIx; + static DMA_HandleTypeDef DMAtx; + + static bool isBusy() { return SPIx.Instance ? __IS_DMA_ENABLED(&DMAtx) : false; } + + static uint16_t getRawData(const XPTCoordinate coordinate); + static bool isTouched(); + + static inline void DataTransferBegin() { if (SPIx.Instance) { HAL_SPI_Init(&SPIx); } WRITE(TOUCH_CS_PIN, LOW); }; + static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + static uint16_t HardwareIO(uint16_t data); + static uint16_t SoftwareIO(uint16_t data); + static uint16_t IO(uint16_t data = 0) { return SPIx.Instance ? HardwareIO(data) : SoftwareIO(data); } + +public: + static void Init(); + static bool getRawPoint(int16_t *x, int16_t *y); +}; diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp index 80095ba1dce8..423772dbc948 100644 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -277,7 +277,7 @@ void SPIClass::read(uint8_t *buf, uint32_t len) { regs->DR = 0x00FF; // write the first byte // main loop while (--len) { - while(!(regs->SR & SPI_SR_TXE)) { /* nada */ } // wait for TXE flag + while (!(regs->SR & SPI_SR_TXE)) { /* nada */ } // wait for TXE flag noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. while (!(regs->SR & SPI_SR_RXNE)) { /* nada */ } // wait till data is available in the DR register diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index f52e6fec2b1e..14977381e16b 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -25,3 +25,14 @@ //#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE." #undef SD_CHECK_AND_RETRY #endif + +#if HAS_GRAPHICAL_TFT + #error "Sorry! TFT displays are not available for HAL/STM32F1." +#endif + +// This platform has 'touch/xpt2046', not 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) + #undef TOUCH_SCREEN + #undef TOUCH_SCREEN_CALIBRATION + #define HAS_TOUCH_XPT2046 1 +#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h index 5f1c4b16019d..a9f1b5822215 100644 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/STM32F4_F7." +#endif diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h index 5f1c4b16019d..54ec16664354 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/TEENSY31_32." +#endif diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h index 5f1c4b16019d..632ee533acac 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h @@ -20,3 +20,7 @@ * */ #pragma once + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/TEENSY35_36." +#endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 00ea51b058ea..98f4527eee57 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -80,7 +80,7 @@ #include "feature/direct_stepping.h" #endif -#if ENABLED(TOUCH_BUTTONS) +#if HAS_TOUCH_XPT2046 #include "feature/touch/xpt2046.h" #endif @@ -1006,7 +1006,7 @@ void setup() { SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults) // This also updates variables in the planner, elsewhere - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 SETUP_RUN(touch.init()); #endif diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 6e57a43747f0..eb33258e26b8 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -366,6 +366,11 @@ // #define BOARD_AGCM4_RAMPS_144 6100 // RAMPS 1.4.4 +// +// Custom board +// +#define BOARD_CUSTOM 9998 // Custom pins definition for development and/or rare boards + // // Simulations // diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/feature/touch/xpt2046.cpp index d613fbc89a98..b75f3ee2f220 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/feature/touch/xpt2046.cpp @@ -17,22 +17,21 @@ * */ -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(TOUCH_BUTTONS) - -#include "xpt2046.h" #include "../../inc/MarlinConfig.h" +#if HAS_TOUCH_XPT2046 + #if TFT_SCALED_DOGLCD #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. #endif +#include "xpt2046.h" + #ifndef XPT2046_Z1_THRESHOLD #define XPT2046_Z1_THRESHOLD 10 #endif -/* +/** * Draw and Touch processing * * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. @@ -245,4 +244,4 @@ bool XPT2046::getTouchPoint(uint16_t &x, uint16_t &y) { return isTouched(); } -#endif // TOUCH_BUTTONS +#endif // HAS_TOUCH_XPT2046 diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 438a619242d7..2399f207bfa2 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -405,7 +405,7 @@ inline bool turn_on_heaters() { inline bool prime_nozzle() { const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; - #if HAS_LCD_MENU && DISABLED(TOUCH_BUTTONS) // ui.button_pressed issue with touchscreen + #if HAS_LCD_MENU && !HAS_TOUCH_XPT2046 // ui.button_pressed issue with touchscreen #if ENABLED(PREVENT_LENGTHY_EXTRUDE) float Total_Prime = 0.0; #endif diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 7f00ec5a3401..8d103d52b165 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -871,6 +871,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + case 995: M995(); break; // M995: Touch screen calibration for TFT display + #endif + #if ENABLED(PLATFORM_M997_SUPPORT) case 997: M997(); break; // M997: Perform in-application firmware update #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index b3f339e295ec..7c469458cd3c 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -276,6 +276,7 @@ * ************ Custom codes - This can change to suit future G-code regulations * G425 - Calibrate using a conductive object. (Requires CALIBRATION_GCODE) * M928 - Start SD logging: "M928 filename.gco". Stop with M29. (Requires SDSUPPORT) + * M995 - Touch screen calibration for TFT display * M997 - Perform in-application firmware update * M999 - Restart after being stopped by error * @@ -843,6 +844,8 @@ class GcodeSuite { TERN_(MAGNETIC_PARKING_EXTRUDER, static void M951()); + TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); + TERN_(PLATFORM_M997_SUPPORT, static void M997()); static void M999(); diff --git a/Marlin/src/gcode/lcd/M995.cpp b/Marlin/src/gcode/lcd/M995.cpp new file mode 100644 index 000000000000..72d0d29f7683 --- /dev/null +++ b/Marlin/src/gcode/lcd/M995.cpp @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + +#include "../gcode.h" +#include "../../lcd/menu/menu.h" + +/** + * M995: Touch screen calibration for TFT display + */ +void GcodeSuite::M995() { + + ui.goto_screen(touch_screen_calibration); + +} + +#endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 1605ced3c8a0..c309822f92c9 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -255,7 +255,7 @@ #define IS_ULTIPANEL #endif -// LVGL UI, SPI or FSMC +// FSMC/SPI TFT Panels (LVGL) #if EITHER(TFT_LVGL_UI_SPI, TFT_LVGL_UI_FSMC) #define HAS_TFT_LVGL_UI 1 #endif @@ -273,6 +273,27 @@ #define DELAYED_BACKLIGHT_INIT #endif +// FSMC/SPI TFT Panels (HAL STM32) +#if EITHER(TFT_320x240, TFT_480x320) + #define HAS_FSMC_TFT 1 +#elif EITHER(TFT_320x240_SPI, TFT_480x320_SPI) + #define HAS_SPI_TFT 1 +#endif + +#if HAS_FSMC_TFT || HAS_SPI_TFT + #define HAS_GRAPHICAL_TFT 1 + #define IS_ULTIPANEL +#endif + +// Fewer lines with touch buttons on-screen +#if EITHER(TFT_320x240, TFT_320x240_SPI) + #define HAS_UI_320x240 1 + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) +#elif EITHER(TFT_480x320, TFT_480x320_SPI) + #define HAS_UI_480x320 1 + #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) +#endif + /** * I2C Panels */ @@ -329,7 +350,7 @@ #endif #ifndef STD_ENCODER_PULSES_PER_STEP - #if ENABLED(TOUCH_BUTTONS) + #if ENABLED(TOUCH_SCREEN) #define STD_ENCODER_PULSES_PER_STEP 2 #else #define STD_ENCODER_PULSES_PER_STEP 5 @@ -398,13 +419,14 @@ // Aliases for LCD features #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) #define HAS_DISPLAY 1 - #if ENABLED(ULTRA_LCD) - #define HAS_SPI_LCD 1 - #if ENABLED(DOGLCD) - #define HAS_GRAPHICAL_LCD 1 - #else - #define HAS_CHARACTER_LCD 1 - #endif +#endif + +#if ENABLED(ULTRA_LCD) + #define HAS_SPI_LCD 1 + #if ENABLED(DOGLCD) + #define HAS_GRAPHICAL_LCD 1 + #elif DISABLED(HAS_GRAPHICAL_TFT) + #define HAS_CHARACTER_LCD 1 #endif #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 85cb26dadb51..7b35dc77557c 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -251,6 +251,17 @@ #define EARLY_WATCHDOG 1 #endif +// Full Touch Screen needs 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) + #define HAS_TFT_XPT2046 1 +#endif + +// Touch Screen or "Touch Buttons" need XPT2046 pins +// but they use different components +#if EITHER(HAS_TFT_XPT2046, HAS_TOUCH_XPT2046) + #define NEED_TOUCH_PINS 1 +#endif + // Extensible UI pin mapping for RepRapDiscount #if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(AO_EXP1_PINMAP, AO_EXP2_PINMAP, CR10_TFT_PINMAP) #define TOUCH_UI_ULTIPANEL 1 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index c7171b06d806..b7f92fcb2560 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -373,7 +373,7 @@ #endif -#if ANY(LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) +#if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) #define NO_LCD_REINIT 1 // Suppress LCD re-initialization #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1db779b31e58..03b869aa6e2c 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -513,6 +513,8 @@ #error "[XYZ]_HOME_BUMP_MM is now HOMING_BUMP_MM. Please update Configuration_adv.h." #elif defined(DIGIPOT_I2C) #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." +#elif defined(TOUCH_BUTTONS) + #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." #endif #ifdef FIL_RUNOUT_INVERTING @@ -687,8 +689,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif PROGRESS_MSG_EXPIRE < 0 #error "PROGRESS_MSG_EXPIRE must be greater than or equal to 0." #endif -#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_GRAPHICAL_LCD, EXTENSIBLE_UI) - #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Graphical LCD, or EXTENSIBLE_UI." +#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_GRAPHICAL_LCD, HAS_GRAPHICAL_TFT, EXTENSIBLE_UI) + #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Graphical LCD, TFT, or EXTENSIBLE_UI." #endif #if !HAS_LCD_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE) @@ -2224,6 +2226,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(DGUS_LCD_UI_HIPRECY) \ + ENABLED(MALYAN_LCD) \ + ENABLED(TOUCH_UI_FTDI_EVE) \ + + ENABLED(TFT_320x240) \ + + ENABLED(TFT_320x240_SPI) \ + ENABLED(FSMC_GRAPHICAL_TFT) \ + ENABLED(TFT_LVGL_UI_FSMC) \ + ENABLED(TFT_LVGL_UI_SPI) @@ -3043,18 +3047,18 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) /** * Touch Buttons */ -#if ENABLED(TOUCH_BUTTONS) +#if ENABLED(TOUCH_SCREEN) #ifndef XPT2046_X_CALIBRATION - #error "XPT2046_X_CALIBRATION must be defined with TOUCH_BUTTONS." + #error "XPT2046_X_CALIBRATION must be defined with TOUCH_SCREEN." #endif #ifndef XPT2046_Y_CALIBRATION - #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_BUTTONS." + #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_SCREEN." #endif #ifndef XPT2046_X_OFFSET - #error "XPT2046_X_OFFSET must be defined with TOUCH_BUTTONS." + #error "XPT2046_X_OFFSET must be defined with TOUCH_SCREEN." #endif #ifndef XPT2046_Y_OFFSET - #error "XPT2046_Y_OFFSET must be defined with TOUCH_BUTTONS." + #error "XPT2046_Y_OFFSET must be defined with TOUCH_SCREEN." #endif #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 33cd5ecca6d2..d081541c5ae6 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -403,7 +403,7 @@ static const uint16_t st9677_init[] = { ESC_END }; -#if ENABLED(TOUCH_BUTTONS) +#if HAS_TOUCH_XPT2046 static const uint8_t buttonD[] = { B01111111,B11111111,B11111111,B11111110, @@ -595,7 +595,7 @@ static const uint16_t st9677_init[] = { } } -#endif // TOUCH_BUTTONS +#endif // HAS_TOUCH_XPT2046 // Used to fill RGB565 (16bits) background inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { @@ -670,7 +670,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u #endif // Bottom buttons - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR); @@ -682,7 +682,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR); - #endif // TOUCH_BUTTONS + #endif // HAS_TOUCH_XPT2046 return 0; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index e8ac3f351914..a039cbe0cb1c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -24,104 +24,104 @@ #if HAS_TFT_LVGL_UI - #if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs - - #include - #include - #include - #include - -/* Timing configuration */ - #define FSMC_ADDRESS_SETUP_TIME 15// AddressSetupTime - #define FSMC_DATA_SETUP_TIME 15// DataSetupTime - - void LCD_IO_Init(uint8_t cs, uint8_t rs); - void LCD_IO_WriteData(uint16_t RegValue); - void LCD_IO_WriteReg(uint16_t Reg); - uint16_t LCD_IO_ReadData(uint16_t RegValue); - uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); - uint16_t ILI9488_ReadRAM(); - #ifdef LCD_USE_DMA_FSMC - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); - #endif - -/** - * FSMC LCD IO - */ - #define __ASM __asm - #define __STATIC_INLINE static inline - - __attribute__((always_inline)) __STATIC_INLINE void __DSB() {__ASM volatile ("dsb 0xF" ::: "memory");} - - #define FSMC_CS_NE1 PD7 - - #if ENABLED(STM32_XL_DENSITY) - #define FSMC_CS_NE2 PG9 - #define FSMC_CS_NE3 PG10 - #define FSMC_CS_NE4 PG12 - - #define FSMC_RS_A0 PF0 - #define FSMC_RS_A1 PF1 - #define FSMC_RS_A2 PF2 - #define FSMC_RS_A3 PF3 - #define FSMC_RS_A4 PF4 - #define FSMC_RS_A5 PF5 - #define FSMC_RS_A6 PF12 - #define FSMC_RS_A7 PF13 - #define FSMC_RS_A8 PF14 - #define FSMC_RS_A9 PF15 - #define FSMC_RS_A10 PG0 - #define FSMC_RS_A11 PG1 - #define FSMC_RS_A12 PG2 - #define FSMC_RS_A13 PG3 - #define FSMC_RS_A14 PG4 - #define FSMC_RS_A15 PG5 - #endif - - #define FSMC_RS_A16 PD11 - #define FSMC_RS_A17 PD12 - #define FSMC_RS_A18 PD13 - #define FSMC_RS_A19 PE3 - #define FSMC_RS_A20 PE4 - #define FSMC_RS_A21 PE5 - #define FSMC_RS_A22 PE6 - #define FSMC_RS_A23 PE2 - - #if ENABLED(STM32_XL_DENSITY) - #define FSMC_RS_A24 PG13 - #define FSMC_RS_A25 PG14 - #endif - - static uint8_t fsmcInit = 0; - - typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; - } LCD_CONTROLLER_TypeDef; - - LCD_CONTROLLER_TypeDef *LCD; - - void LCD_IO_Init(uint8_t cs, uint8_t rs) { - uint32_t controllerAddress; - - if (fsmcInit) return; - fsmcInit = 1; - - switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break; - #if ENABLED(STM32_XL_DENSITY) +#if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs + + #include + #include + #include + #include + + /* Timing configuration */ + #define FSMC_ADDRESS_SETUP_TIME 15// AddressSetupTime + #define FSMC_DATA_SETUP_TIME 15// DataSetupTime + + void LCD_IO_Init(uint8_t cs, uint8_t rs); + void LCD_IO_WriteData(uint16_t RegValue); + void LCD_IO_WriteReg(uint16_t Reg); + uint16_t LCD_IO_ReadData(uint16_t RegValue); + uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); + uint16_t ILI9488_ReadRAM(); + #ifdef LCD_USE_DMA_FSMC + void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); + #endif + + /** + * FSMC LCD IO + */ + #define __ASM __asm + #define __STATIC_INLINE static inline + + __attribute__((always_inline)) __STATIC_INLINE void __DSB() {__ASM volatile ("dsb 0xF" ::: "memory");} + + #define FSMC_CS_NE1 PD7 + + #if ENABLED(STM32_XL_DENSITY) + #define FSMC_CS_NE2 PG9 + #define FSMC_CS_NE3 PG10 + #define FSMC_CS_NE4 PG12 + + #define FSMC_RS_A0 PF0 + #define FSMC_RS_A1 PF1 + #define FSMC_RS_A2 PF2 + #define FSMC_RS_A3 PF3 + #define FSMC_RS_A4 PF4 + #define FSMC_RS_A5 PF5 + #define FSMC_RS_A6 PF12 + #define FSMC_RS_A7 PF13 + #define FSMC_RS_A8 PF14 + #define FSMC_RS_A9 PF15 + #define FSMC_RS_A10 PG0 + #define FSMC_RS_A11 PG1 + #define FSMC_RS_A12 PG2 + #define FSMC_RS_A13 PG3 + #define FSMC_RS_A14 PG4 + #define FSMC_RS_A15 PG5 + #endif + + #define FSMC_RS_A16 PD11 + #define FSMC_RS_A17 PD12 + #define FSMC_RS_A18 PD13 + #define FSMC_RS_A19 PE3 + #define FSMC_RS_A20 PE4 + #define FSMC_RS_A21 PE5 + #define FSMC_RS_A22 PE6 + #define FSMC_RS_A23 PE2 + + #if ENABLED(STM32_XL_DENSITY) + #define FSMC_RS_A24 PG13 + #define FSMC_RS_A25 PG14 + #endif + + static uint8_t fsmcInit = 0; + + typedef struct { + __IO uint16_t REG; + __IO uint16_t RAM; + } LCD_CONTROLLER_TypeDef; + + LCD_CONTROLLER_TypeDef *LCD; + + void LCD_IO_Init(uint8_t cs, uint8_t rs) { + uint32_t controllerAddress; + + if (fsmcInit) return; + fsmcInit = 1; + + switch (cs) { + case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break; + #if ENABLED(STM32_XL_DENSITY) case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; break; case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; break; case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; break; - #endif - default: return; - } + #endif + default: return; + } - #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) + #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) - switch (rs) { - #if ENABLED(STM32_XL_DENSITY) + switch (rs) { + #if ENABLED(STM32_XL_DENSITY) case FSMC_RS_A0: _ORADDR( 1); break; case FSMC_RS_A1: _ORADDR( 2); break; case FSMC_RS_A2: _ORADDR( 3); break; @@ -138,99 +138,99 @@ case FSMC_RS_A13: _ORADDR(14); break; case FSMC_RS_A14: _ORADDR(15); break; case FSMC_RS_A15: _ORADDR(16); break; - #endif - case FSMC_RS_A16: _ORADDR(17); break; - case FSMC_RS_A17: _ORADDR(18); break; - case FSMC_RS_A18: _ORADDR(19); break; - case FSMC_RS_A19: _ORADDR(20); break; - case FSMC_RS_A20: _ORADDR(21); break; - case FSMC_RS_A21: _ORADDR(22); break; - case FSMC_RS_A22: _ORADDR(23); break; - case FSMC_RS_A23: _ORADDR(24); break; - #if ENABLED(STM32_XL_DENSITY) + #endif + case FSMC_RS_A16: _ORADDR(17); break; + case FSMC_RS_A17: _ORADDR(18); break; + case FSMC_RS_A18: _ORADDR(19); break; + case FSMC_RS_A19: _ORADDR(20); break; + case FSMC_RS_A20: _ORADDR(21); break; + case FSMC_RS_A21: _ORADDR(22); break; + case FSMC_RS_A22: _ORADDR(23); break; + case FSMC_RS_A23: _ORADDR(24); break; + #if ENABLED(STM32_XL_DENSITY) case FSMC_RS_A24: _ORADDR(25); break; case FSMC_RS_A25: _ORADDR(26); break; - #endif - default: return; - } + #endif + default: return; + } - rcc_clk_enable(RCC_FSMC); - - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP);// FSMC_D02 - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP);// FSMC_D03 - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP);// FSMC_D04 - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP);// FSMC_D05 - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP);// FSMC_D06 - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP);// FSMC_D13 - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP);// FSMC_D14 - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 - - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP);// FSMC_NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP);// FSMC_NWE - - gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx - gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax + rcc_clk_enable(RCC_FSMC); + + gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 + gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 + gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP);// FSMC_D02 + gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP);// FSMC_D03 + gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP);// FSMC_D04 + gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP);// FSMC_D05 + gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP);// FSMC_D06 + gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 + gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 + gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 + gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 + gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 + gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 + gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP);// FSMC_D13 + gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP);// FSMC_D14 + gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 + + gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP);// FSMC_NOE + gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP);// FSMC_NWE + + gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx + gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - #if ENABLED(STM32_XL_DENSITY) - FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #else // PSRAM1 for STM32F103V (high density) - FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #endif + #if ENABLED(STM32_XL_DENSITY) + FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; + #else // PSRAM1 for STM32F103V (high density) + FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; + #endif - afio_remap(AFIO_REMAP_FSMC_NADV); + afio_remap(AFIO_REMAP_FSMC_NADV); - LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; - } + LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; + } - void LCD_IO_WriteData(uint16_t RegValue) { - LCD->RAM = RegValue; - __DSB(); - } + void LCD_IO_WriteData(uint16_t RegValue) { + LCD->RAM = RegValue; + __DSB(); + } - void LCD_IO_WriteReg(uint16_t Reg) { - LCD->REG = Reg; - __DSB(); - } + void LCD_IO_WriteReg(uint16_t Reg) { + LCD->REG = Reg; + __DSB(); + } - uint16_t LCD_IO_ReadData(uint16_t RegValue) { - LCD->REG = RegValue; - __DSB(); + uint16_t LCD_IO_ReadData(uint16_t RegValue) { + LCD->REG = RegValue; + __DSB(); - return LCD->RAM; - } + return LCD->RAM; + } - uint16_t ILI9488_ReadRAM() { - uint16_t data; - data = LCD->RAM; - return data; - } + uint16_t ILI9488_ReadRAM() { + uint16_t data; + data = LCD->RAM; + return data; + } - uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - volatile uint32_t data; - LCD->REG = RegValue; - __DSB(); + uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { + volatile uint32_t data; + LCD->REG = RegValue; + __DSB(); - data = LCD->RAM; // dummy read - data = LCD->RAM & 0x00FF; + data = LCD->RAM; // dummy read + data = LCD->RAM & 0x00FF; - while (--ReadSize) { - data <<= 8; - data |= (LCD->RAM & 0x00FF); - } - return uint32_t(data); + while (--ReadSize) { + data <<= 8; + data |= (LCD->RAM & 0x00FF); } + return uint32_t(data); + } - #ifdef LCD_USE_DMA_FSMC + #ifdef LCD_USE_DMA_FSMC void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { while (count > 0) { @@ -268,6 +268,7 @@ dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); } - #endif // LCD_USE_DMA_FSMC - #endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN + #endif // LCD_USE_DMA_FSMC + +#endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index f24f08e98e3a..96eedd32964f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -429,7 +429,7 @@ void tft_lvgl_init() { //spi_flash_read_test(); - TERN_(TOUCH_BUTTONS, touch.init()); + TERN_(HAS_TOUCH_XPT2046, touch.init()); lv_init(); @@ -660,7 +660,7 @@ void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { SPI_TFT.spi_read_write_byte(CHY); x_addata[i] = SPI2_ReadWrite2Bytes(); WRITE(TOUCH_CS_PIN, HIGH); - #else // #if ENABLED(TOUCH_BUTTONS) + #else // #if HAS_TOUCH_XPT2046 OUT_WRITE(TOUCH_CS_PIN, LOW); W25QXX.spi_flash_read_write_byte(CHX); y_addata[i] = SPI2_ReadWrite2Bytes(); @@ -729,7 +729,7 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { /*Save the pressed coordinates and the state*/ if (diffTime > 10) { //use marlin touch code if enabled - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 touch.getTouchPoint(reinterpret_cast(last_x), reinterpret_cast(last_y)); #else XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y); diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 2a9e4766d846..373051fd4eb0 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -86,7 +86,7 @@ void MarlinUI::save_previous_screen() { void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back/*=false*/)) { TERN(TURBO_BACK_MENU_ITEM,,constexpr bool is_back = false); - TERN_(TOUCH_BUTTONS, on_edit_screen = false); + TERN_(HAS_TOUCH_XPT2046, on_edit_screen = false); if (screen_history_depth > 0) { menuPosition &sh = screen_history[--screen_history_depth]; goto_screen(sh.menu_function, @@ -133,7 +133,7 @@ void MenuItem_gcode::action(PGM_P const, PGM_P const pgcode) { queue.inject_P(pg * MenuItem_int3::draw(encoderLine == _thisItemNr, _lcdLineNr, plabel, &feedrate_percentage, 10, 999) */ void MenuEditItemBase::edit_screen(strfunc_t strfunc, loadfunc_t loadfunc) { - TERN_(TOUCH_BUTTONS, ui.repeat_delay = BUTTON_DELAY_EDIT); + TERN_(HAS_TOUCH_XPT2046, ui.repeat_delay = BUTTON_DELAY_EDIT); if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = 0; if (int32_t(ui.encoderPosition) > maxEditValue) ui.encoderPosition = maxEditValue; if (ui.should_draw()) @@ -155,7 +155,7 @@ void MenuEditItemBase::goto_edit_screen( const screenFunc_t cb, // Callback after edit const bool le // Flag to call cb() during editing ) { - TERN_(TOUCH_BUTTONS, ui.on_edit_screen = true); + TERN_(HAS_TOUCH_XPT2046, ui.on_edit_screen = true); ui.screen_changed = true; ui.save_previous_screen(); ui.refresh(); @@ -214,7 +214,7 @@ bool printer_busy() { void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, const uint8_t top/*=0*/, const uint8_t items/*=0*/) { if (currentScreen != screen) { - TERN_(TOUCH_BUTTONS, repeat_delay = BUTTON_DELAY_MENU); + TERN_(HAS_TOUCH_XPT2046, repeat_delay = BUTTON_DELAY_MENU); TERN_(LCD_SET_PROGRESS_MANUALLY, progress_reset()); diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index e8edea76d16b..d298376ce26d 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -652,3 +652,7 @@ void _lcd_draw_homing(); #if ENABLED(POWER_LOSS_RECOVERY) void menu_job_recovery(); #endif + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + void touch_screen_calibration(); +#endif diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 869935b59a51..b430e0448bda 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -220,7 +220,7 @@ static PGM_P pause_header() { #define HOTEND_STATUS_ITEM() do { \ if (_menuLineNr == _thisItemNr) { \ if (ui.should_draw()) { \ - MenuItem_static::draw(_lcdLineNr, GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT); \ + TERN(HAS_GRAPHICAL_TFT,, MenuItem_static::draw(_lcdLineNr, GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT)); \ ui.draw_hotend_status(_lcdLineNr, hotend_status_extruder); \ } \ if (_skipStatic && encoderLine <= _thisItemNr) { \ diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 9c49a3cdb7dd..5887bf9d4aac 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -195,16 +195,21 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_CHARACTER_LCD)); - char tmp[20], numstr[10]; - // Determine digits needed right of decimal - const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + char tmp[20], numstr[10]; + // Determine digits needed right of decimal + const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + + #if DISABLED(HAS_GRAPHICAL_TFT) + extern const char NUL_STR[]; + SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_CHARACTER_LCD)); lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); + MENU_ITEM_ADDON_END(); + #else + SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + #endif } } END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp new file mode 100644 index 000000000000..1f315f181a9a --- /dev/null +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -0,0 +1,34 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + +#include "menu.h" +#include "../ultralcd.h" + +void touch_screen_calibration() { + ui.touch_calibration(); +} + +#endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 705b19869a8b..8a5095c88fe7 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -68,6 +68,7 @@ static void _lcd_mesh_fine_tune(PGM_P const msg) { const float rounded_f = rounded_mesh_value(); MenuEditItemBase::draw_edit_screen(msg, ftostr43sign(rounded_f)); TERN_(MESH_EDIT_GFX_OVERLAY, _lcd_zoffset_overlay_gfx(rounded_f)); + TERN_(HAS_GRAPHICAL_TFT, ui.refresh(LCDVIEW_NONE)); } } @@ -77,6 +78,7 @@ static void _lcd_mesh_fine_tune(PGM_P const msg) { float lcd_mesh_edit() { return rounded_mesh_value(); } void lcd_mesh_edit_setup(const float &initial) { + TERN_(HAS_GRAPHICAL_TFT, ui.clear_lcd()); mesh_edit_accumulator = initial; ui.goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); } @@ -456,8 +458,8 @@ void ubl_map_screen() { do { // Now, keep the encoder position within range - if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = GRID_MAX_POINTS - 1; - if (int32_t(ui.encoderPosition) > GRID_MAX_POINTS - 1) ui.encoderPosition = 0; + if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = GRID_MAX_POINTS + TERN(TOUCH_SCREEN, ui.encoderPosition, -1); + if (int32_t(ui.encoderPosition) > GRID_MAX_POINTS - 1) ui.encoderPosition = TERN(TOUCH_SCREEN, ui.encoderPosition - GRID_MAX_POINTS, 0); // Draw the grid point based on the encoder x = ui.encoderPosition % (GRID_MAX_POINTS_X); diff --git a/Marlin/src/lcd/tft/bitmaps/back.bmp b/Marlin/src/lcd/tft/bitmaps/back.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5ad1f82542fb70779ed91bce77de3ee29299cce5 GIT binary patch literal 3126 zcmeH|y-s356vx?qA7INZ_X+HG`+WlW5Ct`A0s#aBloe?#OlY96FciE5l<)!?2o{C} zY!HE{@uL7E`&-XuGF&bQ?3!$`H{oXPoio4lKmR#*`1XC_qviEl;Qoc*=ik2%mQReh znEz^(pS-YGe*C}89Eiu`dwY9kGbZl{HhDY#mBeQpPwHe zABRFAJ=v@Cn}D-Zte!W-6P_K0ZFavIlo}cZhd59H#N2ywmAOF!#&LOP!C&NR39L?4!@; zgM4*$rGgopoSaZE=1_%Z$*&=vaJAcQJ)ZqV&&I|EK)>I=v$Jz}c$mxOPESwuFd4I7 zh*?@%8r?6*2-B6z5(+PsN|j0lqnLeuejdfDH|ca5{_5(gK|FBuw^}U~Ime(}F5?WH zNh9gzi*mK0bC6l`@bG|#Z0qLcrY>HT8$6#Q1>WKe-xM99#Pc$lO!5WI0o0eU+9=8f_+oAA(y0J`OVFZ zGD^<3wY4>lENYbYo>H@c&!ehBrI7QP#uh8)CaYYM0>QVpw^T9t{8y`H8b}KM7W@5v zv)RP?asMwfVfA3O7wG5I`s;jhVK^Jgc}UN^2VYV^Mn8Ynf4;N2KWdCo9E0x!S6Tke F!B0sxQ3?P6 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/bed.bmp b/Marlin/src/lcd/tft/bitmaps/bed.bmp new file mode 100644 index 0000000000000000000000000000000000000000..842174f82081429e5f914f27cfad78a722f067fd GIT binary patch literal 12342 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 B);a(H literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/confirm.bmp b/Marlin/src/lcd/tft/bitmaps/confirm.bmp new file mode 100644 index 0000000000000000000000000000000000000000..076fa57897deb90f8ec673b42d73fdd92c062cd0 GIT binary patch literal 12410 zcmeI0$xa(V5Qd#R1&@(ONVxa_W-%N9<-&zU^34apW=U9tkl+>Agajw{GYAke%MEek zMG#x^g-S}TZo>@YF_}T#l1)$BO#k)&e^uAGF<1JMc^)O+3%tJmeSOL_Fk|rfx9{?j zg-oU~n=k&GhyDB6`r;2iJOiEq&wyvZGvFEcC=5(ZO-)WtrZJkI&trIaxLhtXO;-p2 zhW0|Ckk99PdU}S2h7ckxAqe=v!NF`c+tk#Q%jLSeyAdK4ApjnnfbZ<=1an76M{{#? zOG`^CLJ;Qr`}v za5}$pkEFI~YikR%jT-_+T3J~^0<)-2Pfx#3gQ4I_SgrFe$k$iYNM;D{pn`zskc!5< z85BlZU0oFwq^Q=r%~R&XfQR9mn;R3bJFlujo!UGFPr~l*?z&*i6}ZJ(V`F2dr>Ew+ zJ0}E+Diy4*ZJr4}Fkwkg$|FGW?)g}8D7@Qjd$l-LI51-#V5(a}*ZFE1}G&aF%HbdIq{qNedMBK^Fz zqjd>*`X39tgn$Z60z=>qR3uy^MykEphI!cQ?d{#%+_ccTms?v~Y8!!VzKfC0&d%I_ zG*?JxJ=$tl0o`Y3XHQN}%q`qG(!a#K8A3E8)zYc*(?|GfV|w0%ZO%igAh{q$s^zI| ze0+R zsuR*VmRw*v&U7mTz`vDwGY}*|+)AZV6}c|5i#FS8qzIj=s{(lufq658km=0PCPpG1 z2tm?0LZ_-KP~r{`54nUu6HkOWDv&sVr!z*<2T$!(sqJswk?rQ@=GNEOu~Y5fWq0n$ zBru&-1?jgrQX@#fMr>E3ZCuhs%D{9+cTQ)1D8NE=hSBi5yT`HuEeINDB=UM;VWC(o zCJMYTKnUc*>lNwv_;_Y!CKkr(aTAP06fdc8aBx6V%@^vibzJup72I3^eC&A_7iQ}| zgka^u(a{m$B1$C87g1b*(2VbO1 z`qQL~WDs(1pl}Y{#2C3b`S=qT&*81`n~)w~Y26*ym2g8x6ng)Dby$ZJg0Oga@&1nI zK3`8Rd`BPv0SG_<0uX=z1Rwwb2tWV=5P$##*a;*_@^PuKYkk~_ihG`CS=New*6TG{ zvHc2ZnmUf7Y1$Ld=(>A!xztNHXB7z znD_U6zpm>&|Fmr@NfM9#Wm)pCzu)b4vMi(j@KrfIsa%l7_7^S|A0zxk){`!EdYUOD*zp8qn-vQPfW^Zfj(CwGYB_>F&}C_4G+ hI0*p=KmY;|fB*y_009U<00Izz00bZa0SH`P;0K*ldIJCe literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/directory.bmp b/Marlin/src/lcd/tft/bitmaps/directory.bmp new file mode 100644 index 0000000000000000000000000000000000000000..994abc70db0e527afe43b672db0e19fe4a63d080 GIT binary patch literal 3194 zcmZ?rt>R$-gDN1I1H=kY%*Y@CWB~zC-Z2J(Ap#5xPVPa)FgCF?6Pm(?;RPBS8=EKt zKof8U2~euCvNE4CP*hX|bRbqMDk>^!Yim0@J3Gh)ZEbByNlAHmd6-rJP2RR`+kc9| zxpU`$Rx~#^qj{max|(9Mp#~%*Bn*i8|Ni}>iWhLXf7EbmtX=&0$aLtX?=Y?TIB-d5@~)*OAAmXFtOnRz literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/down.bmp b/Marlin/src/lcd/tft/bitmaps/down.bmp new file mode 100644 index 0000000000000000000000000000000000000000..42ff4e5cafcd9ba7e72e12d05c91892e4daeb061 GIT binary patch literal 3126 zcmeH{xvFA85Qd$69$>-==K=I0ijKP&OrY^32BL|P;J$BQ;D!r|A|irI;2W5V8wkFP zqUhWo>mtSRDvl!)*>IXV-PPY;U0vOpUvFPUr}l>a2fptg-xtw0SZJ76|E7-yM55@c zy)wWukVqur@i-fJrWp!_tX8Yj>4eHNxzT7O5<%EDn@uW}s?}<**ZV{Xz};?lzu#Z2 zRvL{)sZ<&a2A|LOltcmU@p$U>`kzyqOeQ~1O{dcZ0)c;&Ab7P}B{=od=~O0@K?HjV zhr<*?iBHsC0gSS*Gh%jL2_0u_Zz2MMFmcuj)fh*JRXbUG*!%mR)#0R|*W zrPASW;GVPD3~maA0+C!wT!Z7zVhOMWr#FWr3WWma!$zV=0$0!BaPWJ9%RU;71pb4; zKrWZVjl;P_Hk%bJ!Eu|-W~{PUEXib&oYA{nuI+ZqodHK-d2=~! z1%ttKI=$I!$hp_+U5or25*bJ}m&jx?TCFyfN^v-O;(}mDyWMU)9wPuaT>1#$XNi11 zkHEU!uE}J&R-ZUENWc@uon+#}AIFE|#_#Qg@I<1}e;VhF!G{;#V7{ha8Tbzwcn25a BkSPEF literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan0.bmp b/Marlin/src/lcd/tft/bitmaps/fan0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..558dbe4f8fea2eab1ba5caebe31737c560b11154 GIT binary patch literal 12410 zcmeI&g^pay5e8r8|>#`mgHh9{*Oe;I9=5TY=B+{{Hs+-=8Y{#gpd!-&=&g z&{3hnZea4YyJ^#=0|ySwdlgIs zc))-G9XodXM`7#KsS|-Z^OhN77w~jJUa?}us#UAPU!z8i)~#EcLSxLtB40r`Y}hc! z$*ESYTJ`GHYu2n;t5&W0_3L-&(1DkNbw$q2qjU7=(f#`Mt5c^AKVeRej96 zYp(7x-Yl-DQl(0R1`V1uYX&weID|}AG;G+gZ{NOwT6v(2Od*Ff>c);8d+pk_@87?_ zfB$~MgbAERUAuPea>8#gvP0OaRjc{)=N~z8k|zs928y?Yy+ z$Ks~r2cGA7Y0;uZU;`i8#fujkH*U-XpYSBqVwk}eap=&YSFc|EL)h>C-nemN(xgd< zr11=oF#&*dJUKm^YoYmS@#4i1T^~MtfJ7kB64pA2Wd7{dt(%EYo;-;N3|~Kg{=9PK zO0*0n@SC8^X?;^L%ql1-Xw<0Dym|A!e*K!MZques{IAJKNxa1Qg9i`h`TO_pXG%-& z*}Qo(w_p(~TDEM--aJg8PGsRZpQH;piiw3Kg)eE_CUpFVb|M~@z5)AHrZ7kLSVXz9|WOT3F{m)r5stZV|)`#*j9G;!j@ z5Y9}H@sju_*hQD*?DOW$o9Qw$pZD(FE2(mn7>Q4$VY3#YnL@Jlh!OE?eaW|1Vo|~+ zFcKKpvPn+$zkU0*fB*heSb}(>BG~HHt5XvbKAb*%8aeF?&!*UnP90P>d-WT!_-ygv9jUzI|JMgI_KUlH-?P#E20#k*80e#>kAkx_kF-_wL<; z3Aoy%NfY4~B8a;<1o@90I~JLh{3|?xqEbq+QH(t6)~!n}JdCs*BM%b-k*tM?W)xp> z$oTQ&i_Q5l8j*oOo>5@L^M|htIDh_pjI?a8Zr!>yX3Q9hWK`~w`kFUyP9TTaQWK`l zB85MG{5VCSu&miAWT9uyocZk8vm)gb+xhY1$6dR2Q9+$>LsuC?ARIq_yx6%h1ML1* zkV6!8(j9@>@YA?_`SNTVZj6fbSJZ9Ww#{15r8RX)NDYHaim}KCDnl(Hh z{AM9kgO@H{N=KE`^SE*2;Fp8lSE}J{_{FSKRZ57|N@>VQcCl1{ zt`9S2%xKY~1ufZvSHGp7GiT15H*azkF1;(U_y_)zCr?JEtC?*F5{RHyGNr#&q)EIo zwo{~P=gO5UHe9=B`dQC-d-s9`3%Iw~{BOHCbm&mJiX_i8_UzeHwvp&wzkVH=0yDd8 zKuY50&z}c8BHczgefo4paUI8MxJ?3AFIlo=%a$z%4<0;w_UxH6XN-)Yefo;P@0`vX z;xPgv+gJHk2_fg$KH!PC&a8Lu-ibbe;3&tId-v`wTegf+>Dr3Z7{G^5Uv=8`Gy=g! zcs<^xxUV)_w3oTYSk*Rtt{32oVi;G+W=K+#V(-@o53*{ z!Yi1Ab;XX13^0)jE9;75?b@}rkN*_59Xoc|AXcnc;kskWlqt;opPLH7z|TwS2Sh^Y zl+`S?C(5f%?zo}xPek2M`pWhIugFg@($|zNdK91Hv~%aq4zOI!XlB~W^xHsv+Kv-4 zxde@ZGu4U|>#e9+x^yWg!!KLfvj7&eo+W?H(&(`Z;8N+EP$cYBXRt0@rgiPwHDr5+ zfDN#R`ie7csd^nEDr+(9$S*PckbL#H8~5E zCU_AIzfv;^!k95CJr{KFmoj+xWgbeU&2X6$12Wqy_nEGD^1EBemJ)O7XM)rEtXZ>M z_zQ&0JD+UGonlQ~Au|<%&k<;&b&=@AO-K>(r z@Pl%~LcqhHZf?QDYJ~wOA3l88iNK*)lJv8V+a&gCru?ANpD`UOjTI1zN*hGTElkr> S7TEGLtS*;X?tx$Bf&T*c{D|HF literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan1.bmp b/Marlin/src/lcd/tft/bitmaps/fan1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6da6f3294e63d813e55ced63e2b51bbc38451c5c GIT binary patch literal 12410 zcmeI&^^P3N6$fA^Pm#ySBP3TcGcz+Y#t<{JC8Lb83^K}=nItpGB$-iWW{mCR%hpZb zQO``zEM(VzY)RX$uC6-gcd$;?__vzF{#v1+4fE{b?{B~V{i(uV^fcf9-Xi>kfeICV zt6Z=D|N8m<`{&rif0nm$4U}u3 zC8!|O#*ZIAXU?3}t5C=njKTDP@Y2LiK%!6Rj0Tps( z0sQ~suTrH7)jfIgB!g!27?L&{H*P#|;K0&UevlPM`1yaWTD24gd4P>ixqkh6`}Xa7 z_wLOV3#q>nn2ssdb?VfqR;?Ox-@bi|<4b)1`t|FiNt3#F?_MV00j7WHx#Q@Dqd=2}avl5P>5p zO8-^RoD;cvj~+b$Rw+Gw`jiw7#lIB(AcC`iN=7cy7=j4XrcKl5RE(mLORziqo;Y!W zyjo<$U!lW`L}jyP%>sU~HJBO2NR1jb^hv?fR;*aT$FkusknHzIDa#dhgeFaz0PM+a zRHys)?K^w+?50hdx^(FRzj3E^E*D{g)d=%tYo&Is0Yg<23L8m@!>0!Fy?gh1_3Fj7 zM1-h^DgY)6FP*=_egz z#u1odu!KuQ#x)Ye@ijEB0V*OZSFUt7_3`6J7eR8-kRe0VIWau4DA)+jm@xz9jDTZH z!mA^az!x<*W&|7?1lulo;lhQB7cU+?dersK^5x5C&z{XUd#aU+LC+pzAzI?oHlIO&~;quCw<;UuF91wD>)uNejNLn^Yz1r5A)~GXYo|P zu|D0lXwibIb5hGT!I3s(dj}l89Zi$=-Q2?O)QO8DO!O)LjzCD*`#3zN^y5M!f10tG z!qzSjlD|NhH*cN`I-%XFRjUC52Eec6K6&zFY*n7GJ9g|4SuveQuY9{>$ByuuQ{?+h zNcQjF53M~*qwR_nD|&YB+?na+)va5%7Wv8|Cw^RPl=POf5>D2b<2lV!HAB>^SI=H1 z=SZz0J$YgBR~tmK{xPz}*g$O`$)s|Ab+6)pCfjfuLG8ArnAg1WtvxZ}?7;u=a*`5& z5?wLb*{u*1vp9C>(4k$scKpYMf6*eBx?a6{RWbG+j}M#;h{4;xlN52!v8X-+Pm#yFbB=Rk8GeUv$?fn2qH|LJlXwov?{s784yf%9_#`y z;YRnbEC|yTMqImQFu)2Za^7tcffq4> zjLO_rr4mW)`*n#bq!f^{p-mqrsiu|)B2bhAY%1AoeKm8xe*Mx3#zuhQV4O45Do$7# z3EFVQxM~oX7=@g#k)r}nQEC|XHW|4@gL1wQQ=jC+jtI6$_%#(>L?r6i{T<~RHEKjs zU~&RZpJ0_Acf#EuDHLO_{<0nV#E7VIJ(4Fc_*sftxR8bEiIg9T5s^|T&xuK4t@y=- zBN0KfiHOihOQEA!rFpp>l6;hpi)khY7xGNqj-B<~#?zZ(yExzj7y2ZEqK+47!dZdg zy2EcS;WEt?hiad$;K@_@K}#m9PHBb<@$+y;dh6CL=X4rlonnFyTqp`1)F6Z(JNp7D zNF=go$xezLLl+7>;^te$Ez#6uJg;Gcrg?cO04V;G2zWVoI-LbWa3o421-_j+b&{M5 z3m&TAY5o%eg`gu4oYbg7(3ObhV}e77queg9(vk)_UO~FpcS%=Dlkn>@4pYqHBhdBUrGc2 E0l_+m-T(jq literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp b/Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bd0de9a1eb3cdb55b92cac26b2322453fef25a28 GIT binary patch literal 12410 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 ZAXzvXjWi?1s}=Qq{&x#}w?K{s{tbONfS&*W literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp b/Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6da67fa44eaa086144192ff4bf9860c455f8ebd8 GIT binary patch literal 12410 zcmeI&*RB=I5e8uFr|@I=5$tp0E8h@BMr1_BWXoWJ$cT){A{vnq8Ichg0Vary$cQX5 zBHACj%y=|w?OC(;0nWalC5B!-J=K3z{Z(Dv@XKEZ|FK?G8|>N5pFjQY&+qE}K~MAk z&n@Cl4AiUl%U|mM?Q6g2-@ngH{O8a1(*kwO0z-!m9WrFdKdRc_zcwSr>lo53oPZ7I z$dMz*jvYI3;>0Oarc9eQZPKJkqehJ~PA7A+pZ(Uq0b}ODg9ih-Xwjl=+qRuNdGf}M z8xJ2oeDUJN+qZ8YKYo1n?Ah(xw=Y?;gkFON4KkT7b-^P6W7e!$`}gm^b?ervSFb*Q z{`{YE&G_rruW#SJed5H4)vH%eo;;c1DgGO3VfFFj#~(a+5U_HPs~!9F>C?-XFDWu- z&YW=HkJkc|fxmwJdbKDEyx^}rd-hD9KAkUqaA@E#0~WwoVTu?zckbNAjT>2m3O~RR z!-fs()2GjvF=JS-0=P=A5lN(9y?WL2@ZrPr=FKDgyE-D|w`kEqGO2{F^80)D?s4Mj z)2FXoxpMR7&GYBauU)&AWxk&ZBSwtq+O=!Lh7IMA%J_0;JbU)+-&GBM4R|VCzI=Jp zrcI+qkN!?7uz!aR9U3%fAl2uhtMF3FLioD`*|&^f$4pES_&av&*r-vX zcJ10BZ33xy$417;$B!S+Aor8~vB-w9bLY;zd-u+qIkVO*0$x3^a^=chyLPQuu|hvY z(WP6rZcUmrp@Q+^u#=gO9z9ZEAbuMEnKNe~#~iSiFJF#7I!cjo?Ce_>Ubk)?7ZAlPUXeq!wr$&T0TpT*#dq%9Vf@7M%pOs^W5*8i z=@w!$;P z&+L40=+Gg~UAlCsg}!3{^0%K-^uB%jz>q5#t%wVlyVPWzh%o71a^oh5(U8=z@|=}$|h+!p#p2* zlDDkUzkh#G5Gsh2j~_o)RKac=#^*BN(WBJt$)c#Mi3pW>7_FlHxe0SRb?PMdMjR#5 zbf~al!v-oyZrH^jX2KtV;8jKZiX1sVQVq*zz(dR9Yu2nmSMJuq0Wjvyohx-z1Rt^4 zzI}U>Sw{H7oLM4N5D2^=*67PwqCjiasud>Zs37fMyLJtJoIi5p2vM+weF8R*1H5qI zLTTUG6O%<5Jf0Q7n_xaln9pT4CjOPs(9c3?e)`EcILWP>H*a=~@(C}fh{W=-W5+^; zH*enDzkgqDf!R?d2H9WcWPi>InQRU={1^y8@7}#hYu>zhvu4e>l}wVQYp;r^U}I%c z@@0weG5~f%4rQyv7gR7JpB8-KDF$)COi|#ePc_UZgbigdM@u>C`Sa(J zs+WGKol52`?~_^diOKw#x^^;}LS)y{PL1i00zRiIQ2U=`2RU#MEUw>~B#f z5^G?n%mtuC5v^2(WQ5scCL=$6`c&-n>eY+IAj#l2fvHgl!C+bnt0U8`kjUCW$@!U-lm0kC1puO-r}mQE&aAg-=b13 zl9XjpVt?ru`HKiFJI9VDr2vUVJTBY2AYu@_Qq#(iUP+#1zpXgvLwi|1ekrsxbySp` zOn?@J>{;Oj*1&c}g@(O?%iEfgKN0REsJzL+&uA!Qm#p=zg0*BJSy3Ee5iM*_#4^61 zRz{ZQr37BZj;vK3{>Y!KWJS^Eio2q;oC%^sK6l<1O>!pT$d8t#NhwE2<`tQQU|?DM zTY`O5!thHGzlK7wE(_RX)okiynO5#{Y|lWd(NC0cHJY=LQGw-c0aQStvKglMifT)o z;c-QgO~h_xD-_7JCcjg^x+15RfM4yTga`_iCh+3m-G?(2IZApJ9Y@$x?1LO(E3D~# zORTGI%-O$?3Vu(;NmN-%;^KfaGZ~y6BvRQ%$?cdXuZjpN@PZw@Nac{0Y5PE)eEgw; zs#^+TI-6as!_DbT5U~RP z|M06tf!7>!JYCqr&jp%TD43hwdOnc;+BaUQvPd;Mas<{*_2Z9VZSY776fEUkCrCApFMx zQ7p8p%>U&Pft-<$`RQSw(L)pL!6b=`C$S7c|a^zh3^;q zLV(TF_yr~lmz8FakJtg2;>HgJgGCPDRA5GfMd}s|aUS=r0Qe*X zz>`jG7G?3fgdt7&M_>`Nr{@6RtM1*qqfqR~e&!!KlnVYWK#KFNCjVGn@(J<;fA|9C z1V3G>i(+dryYe-prLh(4`w$p3-~vrB3L@SwYb&=9W{Or{(NqWs92Y@}@zeMd3QbF=j=_M%0x9ZLfmG*(x0E$q^2TZh$49 zAWs^9+Wry6X>vO9MD&F#OHtKm1ei$XRZjR43tAjQ;)+#Yg)hp?q_0LkHKourd2;Xz z0j0I-)KOZ|qK2fqMZ+33LR)q+NK7G)P=XdBf(qyqO`RZ2d>F_*mFNQBMNm>XgbU=K z;D5p&#@Ba!;jY!$3Sjc-4tz)}i>DTYq-j{q+O&Wfo$PTqAKBj95Uaz0+<|87pO8n# zh;R_UFryI6kZWRR!h{LL@+0}*gf^u*eo>&RA!q#S669aU{tw>jj889VhqYt#^^6XU zBpjD8aX-oCVmuB_@KfBnWR|Y}tws{SX|^ZAy`>!_yo3KLUN*NWV9ugNiyVq=XPQHS z>xjrvad|7=gYe%Ke1fyOj@6-Je=&l|l9B{2eR*QFs7y9Qu!Ro>iXAG4HL4T)!^Ytc z{s{00^K_)^NArqmkUNj~MEhX~D=q|#=zvWmiULhXI7?qhg5jE?8oR21*CFJIYKpf~ clLlHm(aKIpKCcU%K%05i1zV1n;~6jlmd^MMh*q78#Kd8IeUsWJDGjkr7$I z_!GyJTHUw%_MN$7W{eJEIvEy^=^!&r$PyhXW*YSg%X8z~j<1Yp} zI{N+c+n-((h#reNo*;%a_)ARIq_{E{V0VBWK5&+gs3ckSA>fB*i~ zt5**hGNjM4K<1sDog+t%T)K2AfkO`V&Ye5;<8|Z4jb{5M{(%Dr!nSJFs)Gj)?%lf= z?1Vh<)54}rn>a#!`~)&+(4fCQH}v)E?`>`~rSKxq9{Lr%#`{y1LGvKhJUk zc6!3UdGqEmW5(3P0PxVELl-StL>h+=A4X^H+_}upcufjl09O4Q;GOdH=~Kv~y?ghL zwdYs}{59oI z!yVX(#L>n#1~JDu}x-@ZMuP}6=w^3R?< zE7D9OtQ0kJ=m`rBnl)=ynUp?${CM=}(X0tM(d*c;V=Ls(Ln-Ly&6^2oMTdOgub@_; z0TwuE(xiL$?p4sge*JnDf5g%W6DE`i4HEdVSwS;9MGI@!uI+{|I7LYy$YiM%`!8O+ zfO*@tZDB&fDHo7}%kV=oefsoQuU-{Nm5n%po3n%pQRk+@>cq4%n%VKwr%&_QNCbgj zm@UIkEXR%=%WkjJzjf=Dm}YMdXW1($&6qKxq0bhNd-CK7`D?)f`Acvp7mYUDwk6@G z;|?4+0DqBYk%bVx*q-(_?VLGth6=)j*fw6ca83ot5)1B{Qfs*2{rmT7tvXhO&B>D| zR|mJ;5k$Ig-#(ca3t>VF7A(lg3Rz6uy?ZyexBlye3l}8ooLGwT$D@!^pKPpr@ZbUP zk_~Qzlhb9A>Zn=fcJHJ`IsS(~_Xm zEVR^d?bA0|q`s8kQmE}U8cG~`Z z+i`q^af%gj_j&&OIS*w&OvSi35XJwwbLS$9Rp5^)Txbl8rNwOm`@#hSt7g9`<=g_) zgdI@`eZt9=-^Htt(3HYdj#Tj#3+PLT+@Etf1xM}0Pxyio@SKafbNEvT%69mOU9c4a zHynwT6vxxs4qh0Eut3X1RHuBB^88*Vj@1WaW$2T#to@l}}dq z(U%03!C2_V(LLW13Kgzl4)C0m@WnU4if9{-$m~(C_8d=r3L$o;$f3e)Qi|lfN}B4@ zH^<1KLx(s*eJiSuv*F4lc7DnS;ZNWxLaS*!i3??wtS7TKJg$v{M5Kvh;yHs6Z4&b6 zFrJeqPqrld;6kz!RYEdt1e_%Wxri-Df*Nr$3!deZJj-wClW9@`mVKC2W@JxnZ(qeI z2|^BJ7P&s~Vh+o{apOjU)N04Yq`k2*%Rb>td7ws|$>H~^&;p=U%-Qv>25RqKG9mcc zr^L-+i{MFKol`6lvhbSrnGmP{^i_MZJDcgBK1>RO@Zkve;5_K8`a z0@{8hNtkmTzJLqvpnz-(eqU)^NqRN@=UDKH1y9#29~P1ryU}q?W03!636yxj0--7X z`0e$Z J1ip#{{skjZ8zle$ literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp b/Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..79d284b722553bf2a00577b1e24f37fbd1a468b1 GIT binary patch literal 12410 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 DyH+S5 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/flowrate.bmp b/Marlin/src/lcd/tft/bitmaps/flowrate.bmp new file mode 100644 index 0000000000000000000000000000000000000000..739375bd72a7ca2592a603e07288049be3983509 GIT binary patch literal 3194 zcmds&$4lKo5XVif$tkBC^S5}(DVH4Vy({)7mS>AWA}V&ojs>xSD53`y1$#lTS46Rk zieRs3KD;r@@_dS-rwqJxe!H{ZnVtF0X#K(VfB7Uo*|4&* z{{GYOPk-s(k7kCy-XIAH2~kl|Mx*f!7*AeJN=k~3j&^f%^YrvY;qyt;*B^iuA0O}T z?(X2=;OOWW5D@Ub_+$pj&d&Dn@o{o;a&>hjQSayiw8Fx|o12@gtSozbdtCVY`zIzQ zzCIHcZV-7yM8x9a;{E;o?CdOAB1O*5&LJTouX+N;gajI^ei886+S=ROTkw&hq9UF^ zA-ui4bu$Z*nYOSI2@MVP@bK{R@`52?$|hwcCwqH)0?xXS@qBU{(kOKWwBTIfq{WI z;-##TVY~<{z{k79qr+O%$HvCM=i>DAGzQ>H#z;|SW@c4YRc>ysq>(b=Lh=J=c+SSg zhK@@6E^wz z`Jf-$TJd=my6WheZ1o&lTWsEog^)S#64-XmIxB!;gO-)Vh@9!&{=H_P72np#j zQYTPydT?++W~g{?Z!bHHP}*5t)RoT8PVz(F4Gj(H`=o`6P$}Xh2FM1ZAdhZCbHRUh z7(Sw)Z*FelOYvlVeVu1Mg-`r+E`yyna?1?Ap`oF#uMfUmv)svGGF=Hk9z#@1dhMt}tbwoQrp`4r?!9k$}atg7TNUB&PBO{bm_(Li4 z^72%Di53@hG}UBwsVmeM=1UXN*T5DO6oiF^(UmFyrSLR@7yf{gmX^k(Ri`LtXJ?E@ zeP>}|0p{~4=COCXm}@h0hg7d^z?M93{*=? zOJ!xH!h{BlK{jc+$;nA{5EMQGfpp1#UNH5rb$oOJfQOI)@0ig?@&xKgcx>X7|169| zNv!0vwY8P8iM<(`#ZO+Lp2nPniU{o^0n=-O13m(2IprVO3&G7ia!Uj#vm^O@{?y_X XeUl8E!hGPEek8gWus%NepLYHN7OGr} literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/hotend.bmp b/Marlin/src/lcd/tft/bitmaps/hotend.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ed24b6011e70cacc01b06f32b300402f8c3ca9b1 GIT binary patch literal 12410 zcmeI1NlRN%6vxwkihhiKgw{=0RgANy8pYX))i}nfRdFZcfQX2w3#W?1LO~Z!2#Sas zH}2GpSZ728MQne~tuef(&*Z*mjO8A9$;+M2|NQU&o_CUjeRjXMdCbl0SFR8Lt~a)K z++p;8bcjnd*lb~+?5?|ef8XC~27Xtj7*Gr-1{4E|0mXohfge7m>kRbVq)Us8 z>1jtt2O}{;z`VyH_#1&oG=q{;Qc{paPfyRq#f1*Cw&CXHW_)~{)Fh4rA#famuO*=w z{G#^M)YRG8SuIe*&+F^!VPs=3n4HKR*x5y>+9frlukyBFx}# zX=yQ&9!-WaIXS8DEB>Wb^xE|^F)|i8O&GCr(dKQ`D7|l*r-d zcboS1_Or7ylQ5*GFD)%m+{%Hc-k?sPzU8a;=;-LrI~yJzrdE-LWH51VZjNfUyStl5 zu&~a~PU<(g%16wi$iFK*|Gu*$6rT$V3kEQxyFhEV+j&}fJwl)v@cOwdh^?-!N`o|* z*x%nziI|<8?e#0I9PbL68-agiWyJu7beF=fVO#%E@o%6mr60XuG%ZR$#`@v6pv=rn zL7L^slVyX+zrwE(zvACO{B&vZ=WEo@t3JPdeSQ3L$e%bc{~Y8C{ZmnIY-|`SL9TaZ zW`^Qif9Nc10X)WkbNs_)xuJg+w-D`PONnnWaAmFWwdFC7s$DUl7*Gr-1|%4Grf0DP K5;f)jW8e>u78A|@ literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/increase.bmp b/Marlin/src/lcd/tft/bitmaps/increase.bmp new file mode 100644 index 0000000000000000000000000000000000000000..53d71d0c5afd45c53ab5fe015d3056f24abe1ac6 GIT binary patch literal 12342 zcmeI0yJ`Ya5QfcLR&;iE&VRlg_ss73#mTW{trL76VLScY4lIZG24Vl%rM77S zi{*~R1egF5U;<2l2`~W@5V+qZ6L=&oz$g?H%wI2n1X%*Of?a zw;NM4zkm3=7724Qv;RaQQ7)Hfv)PMC^?Kdubeh?JJRWZ}8gGR9{l3HDFuDI)twz{? z>vTHof3No^)DQFDD`9zZ<}c@?e=nBK2U@uQ<0db^|M>m>WHL$T_}GI{ApLH)GoV7y z-cUksQ>j$s{?Qgiqfsh@7LUbZ+e7P&00{7Uy)B|tX7fdL5ZnNT*HEtktt{#&gU4iKLBJ&1{53K$E8q?7r^>7`QXNveE4-|coO z|Ksr(2S^h<6$%9um~#KOYb_QF%A3MC$fJE#%U|<9pU)Ng6sB6OR^f1%{clu0^A}dj zcJLq6Pbd_^?etIof3Zqpp;x$mY4yKcF1N3^@<=wDh53y?p#Gnj0v-ULr5X;0lgWgd z(R4a(x7)p5Z!{WFX^?`0%m6HCOC&w41=0Kn{%4*fUktbxxli;aU8v`Unxf|8PBhUVl`N7$Gq4cx4y+L!}Zt zFR8Ebckd6}gKxhz%H?vcRx6cCKOwMEsU#AKP$-m2r9h-C1pxE;yv1U%*=&BlA4^bh z6#&m>vrs;t&ovs2-EI#CgT-P|5ef$Ga=EtK?d^7JwOTrz&T6%Sj&2bH_jE%Dp5JArBEoC&1O#d>2zu| z8t|NGOFEs_>-C$>My~vPJ~x|9VnSgoA{vb@mrFS~l*i-oWHL$IN3aEJKO7EnaE!y@ zuvV)@H$$~kC?Fmbv2Xg3gp7)^Py-dMj;odsD8iCQ6LxWd<+BvFp3h4VlWtR6tme3M?)+Yqv&VC z7zH+(oZ@&qqT^wTB3^ozTLr-Xe}wb^eZVM2qtW$xWrwd);w5bWM3=^wA+#$FF0uTQ F!8>#{kj?-A literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/leveling.bmp b/Marlin/src/lcd/tft/bitmaps/leveling.bmp new file mode 100644 index 0000000000000000000000000000000000000000..34866402701c02c0a73accb772d6d27aba595e2f GIT binary patch literal 3126 zcmeH|Jx`iZ6vye_574n=KY@F@5iBni2u8pV%AmXxh$twvU?ji*CM1RpLc#_EgJA`n zG|>;h;Nn&wG0fOsyyS++^AMZJR8I2f@!WHN_uT(E&*Qi68y__w%XmPWhma3k%n!~hBhGYjK{PZPjV6JcndO6LV`Y7%nd_Y0Y3T*xA|PPtH0%J{G6Qjf~3O-JRWTx7lnm zsOCUUr_-@mOt07X`~CU8hr?l=PPe_ijR=gir~v`<`8;XOW^;3M6B*gQ1n%?stX3;^ z(zbcH@GF&yR;#5QySuxb0w)j%OePbt$`z223o7!_jgp*BCkcyW8R2C?2eaAi_xow+ z&CQKmq9l%kqsRxF%jIP9awi&%?(gplF_B0Z$_UZa_}OfBIaaPxJbZx641NFcV(4bE zSQtw+{@d#>7K_x(mFx97yUxze&d<*ag#vw1yMmZoK6kZRP1d>S+}_?&tbm|@tJRV@ zynXwRMHE4HLQ$_e>WEw7j$sZN~ID_gfoxAr>gmg Zq$xTaF&k*5UvI2ak-QGB75G;L{sIvY2vz_9 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png new file mode 100644 index 0000000000000000000000000000000000000000..d94d3efd2c4ebbcb06c3b3ad5f09e30a0e873268 GIT binary patch literal 387923 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

-0&{SE1&dD0s(jCk)J=t{sisbySlwriS;95A>q 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⪼YIxYN+B8$BT>CrXDag0ye( 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 z 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


!ngOXchG4G?N>;nx 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

H)1@8SFKm0f?4T~aKu3ek} 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

*!-gnMJ0a~ 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

jRpd2Fvnca9TV5|=x$t{0?~V}Q)k^QqCbB; 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 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png new file mode 100644 index 0000000000000000000000000000000000000000..f68708a8a2ce949083700dba7a1ac5542712d007 GIT binary patch literal 7940 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 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png new file mode 100644 index 0000000000000000000000000000000000000000..744ba0e8b3b59e5a79f71146b5a17dbf3edfff57 GIT binary patch literal 97523 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 z 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 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png new file mode 100644 index 0000000000000000000000000000000000000000..4959ca672279a92827a1e2a6ca7aa50b7e877e2a GIT binary patch literal 168816 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 literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/pause.bmp b/Marlin/src/lcd/tft/bitmaps/pause.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9c42f006d37ac65fc06040e3ff239ee345338440 GIT binary patch literal 12410 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 Vx})Ugo5+&2$6FR zB8r^Z{g_&p+C4q*^~`%S>%){ZJ=N9KRo`Fw{(jZ(pa1&#r+VMo&#wRQ_sjqOzN`16 zp62-v--o|2P_N!^b*)YVbsDJCKshupdi3bAW5@pft?8Fz$=X;0R1NY`qek`X*ROBi zzOExij2JU!jPcq)P^~>+3kXM!964mjklwv}ckI})RjXG2{?u7u-mn3*SvZ2CQX|B`mMQb)259pE0hucAG)Z}^5{OiMB9*qG;rX+sO=Ul zS~P3c%$2qmEn2i?%a%EF=D3Al>(i%?SMqF8cn$#8apj@_#Ac*`mxibDMX=KT5dA3uKl6ZK#IPn4Jlampp-DIyk&~=lyY|M78*ksfegFRbmoHy*?%cTpk~t94 zQe+IbV28J+O`B$p7qcN28|6aq4zK zyroN*3Rs#?x*c<$V}B}Z2WI@}pG9d+@DVGS=p%V*^8#gY66D=TB>1orZO?mK397m2E zS+;DM1({D$lO}=^DBt>|POxz^jU%g9i^L$CG_?q<)Em z1)Zd%=EjX1H)zm6CRKqb2pHUg7?~qEjUX1`EeP%9%a({Ss@!`V_;fd&g80h{w6mTKp2(c#ELOC>5l2*QX$*!ixqBVJM#m<6e=6}=3R ze3ZX05a>!!m+1TfKWhS`rYZ`+2?d$+e5OxE$Gdm$oVko}c)6qKI?}yGEL9f#7GVO7 z^IX4vJ#%-`$z`I0-^xw9cI^t&o;`b}wwXSCx*!URunyvq&NA0Ac>DHkOpCPy9Y(dg zmU8K;-de#@;JM2F$B!T9C$udVupfBb6>_8`t8Ux2Enrh=&|#!UJ*uUBXC+u z5Ypiv_%%d|ML9s}A`sakmZC-&;ECGC*mA4XV@~{}pz7npCS%}=>LLjBg37g0_}8sl z7goccL~uoAr6+bwpXM8u+L3hHcmhr1j zRl-68wgUbiT+y7_vu9V9=>q<;`@c;K=pU~FFZ2W;wlD0r{D0oOc`3EWTlmG1BD}o( z1HV&A+$GgPKI$L-Pj4cf2r2H0w?ur~}Ijo{ZSQb?)4`O3h66^GU>kF`RH!GC_f20g}){ zUt*#Phn*y5eaCI-PadZw;^)+A{%J69NYtl!Yvsz76)OS9t561n?+lJS$_9dj3@&#| zthgoS>nH-`rtv*<%I-NS87T)I2VsY@2q1JEuapN$i(mzA90Um`^zfP5C+pN(ZuwsQ z`t^m6qh(S0O5v&MEkjTdDKfnX7(Nh6J9uKlt~~JK#fufe8zGbl+z;*N$skq5oSe^# zSUDD)nRpzgKw=9&L-1!`0~jk-N|~=v3t@9+kR+a}_C=p>3x$u9nFtFH5|9Z5etBuX zqIB?AEFcSG%kz|VtX$KxW`7y_t zz>BGxp#4nQg9xt5wupf^l7i|zd{~R)$&S;d*b)25+#%8(YHFHxQi1?4ktqfoihX_Z zQ>hWz3W4w5y*r6H_I;29QWju7q@;vEQ+_j2Ez~mjAPd04Eu1nyg2A|s+EOBmuw%!E z6!gwd!i#45sf*9on%ksI;1&|Q2jt-?ag1bs@L?Al=)5J5<$+W*DLOO&PV^*RmIX`oI6nHu;n3OrP< literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/bitmaps/up.bmp b/Marlin/src/lcd/tft/bitmaps/up.bmp new file mode 100644 index 0000000000000000000000000000000000000000..94afd1255bea1635e23962c6e3d834156224b38f GIT binary patch literal 3126 zcmeHGyQ*426g7Q5AZ5z5A|9Xk!Z${LAgx-6g^Ggj_(H+bT2WMN6cI!OQ4sMn{0kcu z^e*lW!!YqiuenW#1Lv^MoVC|ld+!;`cj>e2bxC-C!}Imm^GWsv5f=WNf6zl4GTG1P zdUoKS>Oi4TfM0sQ%XqO^yqTEK=R={8$Ky$-(}cfM0*Qe@z~}QJxatl2nM|fut63}- zgTdf(xpKMOJrYQSnM$Q%GMSL*^?JcCBoYSv`~7}0nMjfZu*2cFSuX&|WU^YVUM`nL zqd|#ow>uV#@l}8s7?1;oH6D-Ua=F=Twpy*FQi(?j?MkIm*r6=EA)!zxj7B3Gg^Cy$ za_94z!4S-5GbRC;P%kBd9EI~)h^N!3UayZtB76#J91I2ml1ZRZzt7?-`Fg#E^K3SY zs+oBNu#re4dcEFN3CzOjbRvr^0SrIoa#;W`mrI+?hF`pMra}_^eqYGKEHE{+6jP%^ z3kDps)9J(`7mEcvyhTnbZ&fiGjWik!NkpU3dcA%)9NtULOLV(kJ{|FJIMiyjN~JO! z4j+$4{x6){?RJdgYFk);SU^>DIvt(_F-T(iq&eR)9F5h z93<2zHjDXuu2QLRogZ!sbIt;iz!BZ;cEMl}72SCh8NyiZC{N^+M H&pYq}#5Inx literal 0 HcmV?d00001 diff --git a/Marlin/src/lcd/tft/canvas.cpp b/Marlin/src/lcd/tft/canvas.cpp new file mode 100644 index 000000000000..f6a5046b8d04 --- /dev/null +++ b/Marlin/src/lcd/tft/canvas.cpp @@ -0,0 +1,179 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_GRAPHICAL_TFT + +#include "canvas.h" + +uint16_t CANVAS::width, CANVAS::height; +uint16_t CANVAS::startLine, CANVAS::endLine; +uint16_t *CANVAS::buffer = TFT::buffer; + +void CANVAS::New(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { + CANVAS::width = width; + CANVAS::height = height; + startLine = 0; + endLine = 0; + + tft.set_window(x, y, x + width - 1, y + height - 1); +} + +void CANVAS::Continue() { + startLine = endLine; + endLine = TFT_BUFFER_SIZE < width * (height - startLine) ? startLine + TFT_BUFFER_SIZE / width : height; +} + +bool CANVAS::ToScreen() { + tft.write_sequence(buffer, width * (endLine - startLine)); + return endLine == height; +} + +void CANVAS::SetBackground(uint16_t color) { + /* TODO: test and optimize perfomance */ + /* + uint32_t count = (endLine - startLine) * width; + uint16_t *pixel = buffer; + while (count--) + *pixel++ = color; + */ + const uint32_t two_pixels = (((uint32_t )color) << 16) | color; + uint32_t count = ((endLine - startLine) * width + 1) >> 1; + uint32_t *pointer = (uint32_t *)buffer; + while (count--) *pointer++ = two_pixels; +} + +void CANVAS::AddText(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth) { + if (endLine < y || startLine > y + GetFontHeight()) return; + + if (maxWidth == 0) maxWidth = width - x; + + uint16_t stringWidth = 0; + for (uint16_t i = 0 ; *(string + i) ; i++) { + glyph_t *glyph = Glyph(string + i); + if (stringWidth + glyph->BBXWidth > maxWidth) break; + AddImage(x + stringWidth + glyph->BBXOffsetX, y + Font()->FontAscent - glyph->BBXHeight - glyph->BBXOffsetY, glyph->BBXWidth, glyph->BBXHeight, GREYSCALE1, ((uint8_t *)glyph) + sizeof(glyph_t), &color); + stringWidth += glyph->DWidth; + } +} + +void CANVAS::AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { + uint16_t *data = (uint16_t *)Images[image].data; + if (data == NULL) return; + + uint16_t image_width = Images[image].width, + image_height = Images[image].height; + colorMode_t color_mode = Images[image].colorMode; + + if (color_mode != HIGHCOLOR) + return AddImage(x, y, image_width, image_height, color_mode, (uint8_t *)data, colors); + + // HIGHCOLOR - 16 bits per pixel + + for (int16_t i = 0; i < image_height; i++) { + int16_t line = y + i; + if (line >= startLine && line < endLine) { + uint16_t *pixel = buffer + x + (line - startLine) * width; + for (int16_t j = 0; j < image_width; j++) { + if ((x + j >= 0) && (x + j < width)) *pixel = *data; + pixel++; + data++; + } + } + else + data += image_width; + } +} + +void CANVAS::AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors) { + uint8_t bitsPerPixel; + switch (color_mode) { + case GREYSCALE1: bitsPerPixel = 1; break; + case GREYSCALE2: bitsPerPixel = 2; break; + case GREYSCALE4: bitsPerPixel = 4; break; + default: return; + } + + uint8_t mask = 0xFF >> (8 - bitsPerPixel), + pixelsPerByte = 8 / bitsPerPixel; + + colors--; + + for (int16_t i = 0; i < image_height; i++) { + int16_t line = y + i; + if (line >= startLine && line < endLine) { + uint16_t *pixel = buffer + x + (line - startLine) * width; + uint8_t offset = 8 - bitsPerPixel; + for (int16_t j = 0; j < image_width; j++) { + if (offset > 8) { + data++; + offset = 8 - bitsPerPixel; + } + if ((x + j >= 0) && (x + j < width)) { + const uint8_t color = ((*data) >> offset) & mask; + if (color) *pixel = *(colors + color); + } + pixel++; + offset -= bitsPerPixel; + } + data++; + } + else + data += (image_width + pixelsPerByte - 1) / pixelsPerByte; + } +} + +void CANVAS::AddRectangle(uint16_t x, uint16_t y, uint16_t rectangleWidth, uint16_t rectangleHeight, uint16_t color) { + if (endLine < y || startLine > y + rectangleHeight) return; + + for (uint16_t i = 0; i < rectangleHeight; i++) { + uint16_t line = y + i; + if (line >= startLine && line < endLine) { + uint16_t *pixel = buffer + x + (line - startLine) * width; + if (i == 0 || i == rectangleHeight - 1) { + for (uint16_t j = 0; j < rectangleWidth; j++) *pixel++ = color; + } + else { + *pixel = color; + pixel += rectangleWidth - 1; + *pixel = color; + } + } + } +} + +void CANVAS::AddBar(uint16_t x, uint16_t y, uint16_t barWidth, uint16_t barHeight, uint16_t color) { + if (endLine < y || startLine > y + barHeight) return; + + for (uint16_t i = 0; i < barHeight; i++) { + uint16_t line = y + i; + if (line >= startLine && line < endLine) { + uint16_t *pixel = buffer + x + (line - startLine) * width; + for (uint16_t j = 0; j < barWidth; j++) *pixel++ = color; + } + } +} + +CANVAS Canvas; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/canvas.h b/Marlin/src/lcd/tft/canvas.h new file mode 100644 index 000000000000..295ea038e3e8 --- /dev/null +++ b/Marlin/src/lcd/tft/canvas.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft_color.h" +#include "tft_string.h" +#include "tft_image.h" +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +class CANVAS { + private: + static uint16_t width, height; + static uint16_t startLine, endLine; + static uint16_t *buffer; + + inline static font_t *Font() { return TFT_String::font(); } + inline static glyph_t *Glyph(uint8_t *character) { return TFT_String::glyph(character); } + inline static uint16_t GetFontHeight() { return TFT_String::font_height(); } + + static void AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors); + static void AddImage(uint16_t x, uint16_t y, uint16_t imageWidth, uint16_t imageHeight, uint16_t color, uint16_t bgColor, uint8_t *image); + + public: + static void New(uint16_t x, uint16_t y, uint16_t width, uint16_t height); + static void Continue(); + static bool ToScreen(); + + static void SetBackground(uint16_t color); + static void AddText(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth); + static void AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors); + + static void AddRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); + static void AddBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); +}; + +extern CANVAS Canvas; diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp new file mode 100644 index 000000000000..cc328e885d41 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp @@ -0,0 +1,257 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* + Fontname: -Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1 + Copyright: Public domain font. Share and enjoy. + Capital A Height: 13, '1' Height: 13 + Calculated Max Values w= 9 h=17 x= 4 y=16 dx=10 dy= 0 ascent=16 len=26 + Font Bounding box w=10 h=20 x= 0 y=-4 + Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 + Pure Font ascent =13 descent=-4 + X Font ascent =13 descent=-4 + Max Font ascent =16 descent=-4 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +extern const uint8_t font10x20[3453] = { + 0,10,20,0,252,13,2,74,4,153,32,255,252,16,252,13, + 252,0,0,0,10,0,16,2,13,13,10,4,0,192,192,192, + 192,192,192,192,192,192,192,0,192,192,6,4,4,10,2,9, + 204,204,204,72,9,11,22,10,1,1,27,0,27,0,27,0, + 127,128,54,0,54,0,54,0,255,0,108,0,108,0,108,0, + 8,13,13,10,1,0,24,126,219,216,216,216,126,27,27,27, + 219,126,24,9,12,24,10,1,0,115,0,219,0,222,0,118, + 0,12,0,12,0,24,0,24,0,55,0,61,128,109,128,103, + 0,9,13,26,10,1,0,56,0,108,0,108,0,108,0,120, + 0,48,0,112,0,216,0,205,128,199,0,198,0,239,0,121, + 128,2,5,5,10,4,8,192,192,192,192,128,5,13,13,10, + 3,0,24,48,96,96,192,192,192,192,192,96,96,48,24,5, + 13,13,10,2,0,192,96,48,48,24,24,24,24,24,48,48, + 96,192,8,7,7,10,1,3,102,102,60,255,60,102,102,8, + 7,7,10,1,3,24,24,24,255,24,24,24,4,3,3,10, + 3,255,112,112,224,8,1,1,10,1,6,255,3,3,3,10, + 4,0,224,224,224,7,12,12,10,2,0,6,6,12,12,24, + 24,48,48,96,96,192,192,8,13,13,10,1,0,24,60,102, + 102,195,195,195,195,195,102,102,60,24,8,13,13,10,1,0, + 24,56,120,216,24,24,24,24,24,24,24,24,255,8,13,13, + 10,1,0,60,102,195,195,3,3,6,28,48,96,192,192,255, + 8,13,13,10,1,0,60,102,195,195,3,6,28,6,3,195, + 195,102,60,8,13,13,10,1,0,2,6,14,30,54,102,198, + 198,255,6,6,6,6,8,13,13,10,1,0,255,192,192,192, + 192,220,230,3,3,3,195,102,60,8,13,13,10,1,0,60, + 102,194,192,192,220,230,195,195,195,195,102,60,8,13,13,10, + 1,0,255,3,3,6,6,12,12,24,24,48,48,96,96,8, + 13,13,10,1,0,60,102,195,195,195,102,60,102,195,195,195, + 102,60,8,13,13,10,1,0,60,102,195,195,195,195,103,59, + 3,3,67,102,60,3,8,8,10,4,0,224,224,0,0,0, + 0,224,224,4,9,9,10,3,255,112,112,0,0,0,0,112, + 112,224,7,13,13,10,1,0,2,6,12,24,48,96,192,96, + 48,24,12,6,2,8,6,6,10,1,3,255,0,0,0,0, + 255,7,13,13,10,2,0,128,192,96,48,24,12,6,12,24, + 48,96,192,128,8,13,13,10,1,0,60,102,195,195,195,6, + 12,24,24,24,0,24,24,8,13,13,10,1,0,60,102,195, + 207,223,219,219,219,222,204,192,99,62,8,13,13,10,1,0, + 24,60,102,102,195,195,195,255,195,195,195,195,195,8,13,13, + 10,1,0,248,204,198,198,198,204,252,198,195,195,195,198,252, + 8,13,13,10,1,0,60,102,195,192,192,192,192,192,192,192, + 195,102,60,8,13,13,10,1,0,252,198,195,195,195,195,195, + 195,195,195,195,198,252,8,13,13,10,1,0,255,192,192,192, + 192,192,252,192,192,192,192,192,255,8,13,13,10,1,0,255, + 192,192,192,192,192,252,192,192,192,192,192,192,8,13,13,10, + 1,0,60,102,195,192,192,192,207,195,195,195,195,103,61,8, + 13,13,10,1,0,195,195,195,195,195,195,255,195,195,195,195, + 195,195,8,13,13,10,1,0,255,24,24,24,24,24,24,24, + 24,24,24,24,255,9,13,26,10,1,0,31,128,6,0,6, + 0,6,0,6,0,6,0,6,0,6,0,6,0,198,0,198, + 0,108,0,56,0,8,13,13,10,1,0,195,195,198,198,204, + 204,248,204,204,198,198,195,195,8,13,13,10,1,0,192,192, + 192,192,192,192,192,192,192,192,192,192,255,8,13,13,10,1, + 0,195,195,231,231,255,219,219,219,219,195,195,195,195,8,13, + 13,10,1,0,195,227,227,243,243,219,219,207,207,199,199,195, + 195,8,13,13,10,1,0,60,102,195,195,195,195,195,195,195, + 195,195,102,60,8,13,13,10,1,0,252,198,195,195,195,195, + 198,252,192,192,192,192,192,8,14,14,10,1,255,60,102,195, + 195,195,195,195,195,195,219,207,102,62,3,8,13,13,10,1, + 0,252,198,195,195,195,195,198,252,204,198,198,195,195,8,13, + 13,10,1,0,60,102,195,192,192,96,60,6,3,3,195,102, + 60,8,13,13,10,1,0,255,24,24,24,24,24,24,24,24, + 24,24,24,24,8,13,13,10,1,0,195,195,195,195,195,195, + 195,195,195,195,195,102,60,8,13,13,10,1,0,195,195,195, + 195,102,102,102,60,60,60,24,24,24,8,13,13,10,1,0, + 195,195,195,195,195,219,219,219,219,231,231,195,195,8,13,13, + 10,1,0,195,195,102,102,60,60,24,60,60,102,102,195,195, + 8,13,13,10,1,0,195,195,102,102,60,60,24,24,24,24, + 24,24,24,8,13,13,10,1,0,255,3,3,6,12,12,24, + 48,48,96,192,192,255,6,13,13,10,2,0,252,192,192,192, + 192,192,192,192,192,192,192,192,252,7,12,12,10,2,0,192, + 192,96,96,48,48,24,24,12,12,6,6,6,13,13,10,2, + 0,252,12,12,12,12,12,12,12,12,12,12,12,252,8,4, + 4,10,1,9,24,60,102,195,9,1,2,10,1,255,255,128, + 4,3,3,10,3,10,192,96,48,8,8,8,10,1,0,62, + 99,3,127,195,195,195,125,8,13,13,10,1,0,192,192,192, + 192,192,220,230,195,195,195,195,230,220,8,8,8,10,1,0, + 62,99,192,192,192,192,99,62,8,13,13,10,1,0,3,3, + 3,3,3,59,103,195,195,195,195,103,59,8,8,8,10,1, + 0,60,102,195,255,192,192,99,62,8,13,13,10,1,0,30, + 51,51,48,48,252,48,48,48,48,48,48,48,8,12,12,10, + 1,252,125,199,198,198,198,124,192,126,195,195,195,126,8,13, + 13,10,1,0,192,192,192,192,192,220,230,195,195,195,195,195, + 195,8,11,11,10,1,0,24,24,0,120,24,24,24,24,24, + 24,255,7,15,15,10,2,252,6,6,0,30,6,6,6,6, + 6,6,6,198,198,198,124,8,13,13,10,1,0,192,192,192, + 192,192,198,204,216,240,248,204,198,195,8,13,13,10,1,0, + 120,24,24,24,24,24,24,24,24,24,24,24,255,8,8,8, + 10,1,0,182,255,219,219,219,219,219,219,8,8,8,10,1, + 0,220,230,195,195,195,195,195,195,8,8,8,10,1,0,60, + 102,195,195,195,195,102,60,8,12,12,10,1,252,220,230,195, + 195,195,195,230,220,192,192,192,192,8,12,12,10,1,252,59, + 103,195,195,195,195,103,59,3,3,3,3,8,8,8,10,1, + 0,222,115,96,96,96,96,96,96,8,8,8,10,1,0,126, + 195,192,126,3,3,195,126,8,11,11,10,1,0,48,48,48, + 252,48,48,48,48,48,51,30,8,8,8,10,1,0,195,195, + 195,195,195,195,103,59,8,8,8,10,1,0,195,195,102,102, + 60,60,24,24,8,8,8,10,1,0,195,195,195,219,219,219, + 255,102,8,8,8,10,1,0,195,102,60,24,24,60,102,195, + 8,12,12,10,1,252,195,195,195,195,195,195,103,59,3,195, + 102,60,7,8,8,10,2,0,254,6,12,24,48,96,192,254, + 8,13,13,10,1,0,15,24,24,24,24,24,240,24,24,24, + 24,24,15,2,13,13,10,4,0,192,192,192,192,192,192,192, + 192,192,192,192,192,192,8,13,13,10,1,0,240,24,24,24, + 24,24,15,24,24,24,24,24,240,8,3,3,10,1,10,115, + 219,206,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,0,0,0,10,0,16,2,13,13,10,4,0,192, + 192,0,192,192,192,192,192,192,192,192,192,192,7,12,12,10, + 1,0,24,24,60,102,194,192,192,194,102,60,24,24,9,12, + 24,10,1,0,30,0,51,0,51,0,48,0,48,0,252,0, + 48,0,48,0,48,0,248,0,173,128,231,0,9,9,18,10, + 0,1,128,128,221,128,127,0,99,0,99,0,99,0,127,0, + 221,128,128,128,8,11,11,10,1,0,129,195,102,60,126,24, + 126,24,24,24,24,2,13,13,10,4,0,192,192,192,192,192, + 0,0,0,192,192,192,192,192,8,13,13,10,1,0,60,102, + 198,96,120,204,102,51,30,6,99,102,60,6,2,2,10,2, + 11,204,204,8,11,11,10,1,0,60,102,195,189,165,161,165, + 189,195,102,60,8,9,9,10,1,4,62,67,3,127,195,195, + 125,0,255,9,11,22,10,0,0,4,128,13,128,27,0,54, + 0,108,0,216,0,108,0,54,0,27,0,13,128,4,128,8, + 4,4,10,1,4,255,255,3,3,6,1,1,10,2,6,252, + 8,11,11,10,1,0,60,102,195,189,165,189,169,173,195,102, + 60,8,1,1,10,1,13,255,6,6,6,10,2,7,48,120, + 204,204,120,48,8,7,7,10,1,2,24,24,255,24,24,0, + 255,5,7,7,10,2,6,112,216,24,48,96,192,248,5,7, + 7,10,2,6,112,216,24,48,24,216,112,4,3,3,10,3, + 10,48,96,192,7,10,10,10,1,253,198,198,198,198,198,238, + 250,192,192,192,8,13,13,10,1,0,127,255,251,251,251,123, + 27,27,27,27,27,27,27,3,3,3,10,4,5,224,224,224, + 5,4,4,10,2,252,48,24,216,112,4,7,7,10,2,6, + 96,224,96,96,96,96,240,7,9,9,10,1,4,56,108,198, + 198,198,108,56,0,254,9,11,22,10,1,0,144,0,216,0, + 108,0,54,0,27,0,13,128,27,0,54,0,108,0,216,0, + 144,0,8,12,12,10,1,1,64,192,65,66,228,8,18,38, + 74,158,2,2,8,12,12,10,1,1,64,192,65,66,228,8, + 22,41,65,130,4,15,8,12,12,10,1,1,224,16,97,18, + 228,8,18,38,74,159,2,2,8,13,13,10,1,0,24,24, + 0,24,24,24,48,96,195,195,195,102,60,8,15,15,10,1, + 0,96,48,24,0,24,60,102,195,195,195,255,195,195,195,195, + 8,15,15,10,1,0,6,12,24,0,24,60,102,195,195,195, + 255,195,195,195,195,8,15,15,10,1,0,24,60,102,0,24, + 60,102,195,195,195,255,195,195,195,195,8,15,15,10,1,0, + 50,126,76,0,24,60,102,195,195,195,255,195,195,195,195,8, + 15,15,10,1,0,102,102,0,24,60,102,102,195,195,195,255, + 195,195,195,195,8,16,16,10,1,0,60,102,102,60,0,24, + 60,102,195,195,195,255,195,195,195,195,8,13,13,10,1,0, + 31,60,108,108,204,204,255,204,204,204,204,204,207,8,17,17, + 10,1,252,60,102,195,192,192,192,192,192,192,192,195,102,60, + 24,12,108,56,8,15,15,10,1,0,96,48,24,0,255,192, + 192,192,192,252,192,192,192,192,255,8,15,15,10,1,0,12, + 24,48,0,255,192,192,192,192,252,192,192,192,192,255,8,15, + 15,10,1,0,24,60,102,0,255,192,192,192,192,252,192,192, + 192,192,255,8,15,15,10,1,0,102,102,0,0,255,192,192, + 192,192,252,192,192,192,192,255,6,15,15,10,2,0,96,48, + 24,0,252,48,48,48,48,48,48,48,48,48,252,6,15,15, + 10,2,0,24,48,96,0,252,48,48,48,48,48,48,48,48, + 48,252,6,15,15,10,2,0,48,120,204,0,252,48,48,48, + 48,48,48,48,48,48,252,6,15,15,10,2,0,204,204,0, + 252,48,48,48,48,48,48,48,48,48,48,252,9,13,26,10, + 0,0,126,0,99,0,97,128,97,128,97,128,97,128,249,128, + 97,128,97,128,97,128,97,128,99,0,126,0,8,15,15,10, + 1,0,50,126,76,0,195,227,243,243,219,219,207,207,199,195, + 195,8,15,15,10,1,0,48,24,12,0,60,102,195,195,195, + 195,195,195,195,102,60,8,15,15,10,1,0,12,24,48,0, + 60,102,195,195,195,195,195,195,195,102,60,8,15,15,10,1, + 0,24,60,102,0,60,102,195,195,195,195,195,195,195,102,60, + 8,15,15,10,1,0,50,126,76,0,60,102,195,195,195,195, + 195,195,195,102,60,8,15,15,10,1,0,102,102,0,60,102, + 195,195,195,195,195,195,195,195,102,60,7,8,8,10,1,0, + 130,198,108,56,56,108,198,130,8,15,15,10,1,255,1,62, + 102,199,199,203,203,203,211,211,211,227,102,124,128,8,15,15, + 10,1,0,48,24,12,0,195,195,195,195,195,195,195,195,195, + 102,60,8,15,15,10,1,0,12,24,48,0,195,195,195,195, + 195,195,195,195,195,102,60,8,15,15,10,1,0,24,60,102, + 0,195,195,195,195,195,195,195,195,195,102,60,8,15,15,10, + 1,0,102,102,0,195,195,195,195,195,195,195,195,195,195,102, + 60,8,15,15,10,1,0,12,24,48,0,195,195,102,102,60, + 60,24,24,24,24,24,7,13,13,10,2,0,192,192,192,252, + 198,198,198,198,198,252,192,192,192,8,13,13,10,1,0,28, + 54,99,99,102,236,108,102,99,99,99,102,108,8,12,12,10, + 1,0,48,24,12,0,126,195,3,127,195,195,195,125,8,12, + 12,10,1,0,12,24,48,0,126,195,3,127,195,195,195,125, + 8,12,12,10,1,0,24,60,102,0,126,195,3,127,195,195, + 195,125,8,12,12,10,1,0,50,126,76,0,126,195,3,127, + 195,195,195,125,8,11,11,10,1,0,102,102,0,126,195,3, + 127,195,195,195,125,8,13,13,10,1,0,60,102,102,60,0, + 126,195,3,127,195,195,195,125,8,8,8,10,1,0,118,155, + 27,30,120,216,217,110,8,12,12,10,1,252,62,99,192,192, + 192,192,99,62,24,12,108,56,8,12,12,10,1,0,96,48, + 24,0,60,102,195,255,192,192,99,62,8,12,12,10,1,0, + 6,12,24,0,60,102,195,255,192,192,99,62,8,12,12,10, + 1,0,24,60,102,0,60,102,195,255,192,192,99,62,8,11, + 11,10,1,0,102,102,0,60,102,195,255,192,192,99,62,8, + 12,12,10,1,0,96,48,24,0,120,24,24,24,24,24,24, + 255,8,12,12,10,1,0,12,24,48,0,120,24,24,24,24, + 24,24,255,8,12,12,10,1,0,24,60,102,0,120,24,24, + 24,24,24,24,255,8,11,11,10,1,0,102,102,0,120,24, + 24,24,24,24,24,255,8,13,13,10,1,0,136,216,112,112, + 216,140,62,103,195,195,195,102,60,8,12,12,10,1,0,50, + 126,76,0,220,230,195,195,195,195,195,195,8,12,12,10,1, + 0,96,48,24,0,60,102,195,195,195,195,102,60,8,12,12, + 10,1,0,6,12,24,0,60,102,195,195,195,195,102,60,8, + 12,12,10,1,0,24,60,102,0,60,102,195,195,195,195,102, + 60,8,12,12,10,1,0,50,126,76,0,60,102,195,195,195, + 195,102,60,8,11,11,10,1,0,102,102,0,60,102,195,195, + 195,195,102,60,8,10,10,10,1,1,24,24,0,0,255,255, + 0,0,24,24,8,10,10,10,1,255,1,62,102,203,203,211, + 211,102,124,128,8,12,12,10,1,0,48,24,12,0,195,195, + 195,195,195,195,103,59,8,12,12,10,1,0,6,12,24,0, + 195,195,195,195,195,195,103,59,8,12,12,10,1,0,24,60, + 102,0,195,195,195,195,195,195,103,59,8,11,11,10,1,0, + 102,102,0,195,195,195,195,195,195,103,59,8,16,16,10,1, + 252,12,24,48,0,195,195,195,195,195,195,103,59,3,195,102, + 60,7,17,17,10,2,252,192,192,192,192,192,192,248,204,198, + 198,198,204,248,192,192,192,192,8,15,15,10,1,252,102,102, + 0,195,195,195,195,195,195,103,59,3,195,102,60 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp new file mode 100644 index 000000000000..1694986091e0 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp @@ -0,0 +1,314 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +#define STM32_NOT_EXTENDED_ISO10646_1_5X7 + +#if ENABLED(STM32_NOT_EXTENDED_ISO10646_1_5X7) + // reduced font (only symbols 1 - 127) - saves about 1278 bytes of FLASH + +/* + Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 + Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Capital A Height: 7, '1' Height: 7 + Calculated Max Values w= 5 h=10 x= 5 y= 5 dx= 6 dy= 0 ascent= 8 len=10 + Font Bounding box w=12 h=13 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 7 descent=-2 + X Font ascent = 8 descent=-2 + Max Font ascent = 8 descent=-2 +*/ +extern const uint8_t ISO10646_1_5x7[1325] = { + 0x00,0x0c,0x0d,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0x7f,0xfe,0x0a,0xfe,0x08, + 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, + 0xb8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a, + 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8, + 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70, + 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xa0,0x40,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,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, + 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8, + 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20, + 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68, + 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20, + 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40, + 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70, + 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02, + 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02, + 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, + 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88, + 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, + 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0, + 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05, + 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00, + 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8, + 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0, + 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, + 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, + 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0, + 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, + 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, + 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8, + 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, + 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, + 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0, + 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, + 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01, + 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, + 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, + 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, + 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, + 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40, + 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40, + 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff +}; + +#else // !STM32_NOT_EXTENDED_ISO10646_1_5X7 + + // extended (original) font (symbols 1 - 255) + +/* + Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 + Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Capital A Height: 7, '1' Height: 7 + Calculated Max Values w= 6 h=10 x= 5 y= 7 dx= 6 dy= 0 ascent=10 len=10 + Font Bounding box w=12 h=13 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 7 descent=-2 + X Font ascent = 8 descent=-2 + Max Font ascent =10 descent=-2 +*/ +extern const uint8_t ISO10646_1_5x7[2648] = { + 0x00,0x0c,0x0d,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0xff,0xfe,0x0a,0xfe,0x08, + 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, + 0xb8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a, + 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8, + 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70, + 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xa0,0x40,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,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, + 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8, + 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20, + 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68, + 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20, + 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40, + 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70, + 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02, + 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02, + 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, + 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88, + 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, + 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0, + 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05, + 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00, + 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8, + 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0, + 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, + 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, + 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0, + 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, + 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, + 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8, + 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, + 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, + 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0, + 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, + 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, + 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07, + 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01, + 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, + 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, + 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, + 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, + 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40, + 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40, + 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,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,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00, + 0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80, + 0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05,0x06,0x00,0x00, + 0xa8,0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xf8,0x20,0xf8, + 0x20,0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04, + 0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0,0x03,0x01,0x01, + 0x06,0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,0xb4,0x84, + 0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05,0x05,0x05,0x06, + 0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x08,0x08, + 0x03,0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4, + 0xa4,0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04,0x04,0x06,0x01, + 0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20, + 0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xa0,0x20,0x40,0xe0,0x03,0x05,0x05, + 0x06,0x01,0x04,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40, + 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x08, + 0x08,0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06, + 0x02,0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03,0x05,0x05,0x06, + 0x01,0x04,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x40, + 0x00,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10,0x05,0x07,0x07, + 0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00, + 0x40,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, + 0x10,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, + 0x20,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00, + 0x68,0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00, + 0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, + 0x50,0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78, + 0xa0,0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x80, + 0x80,0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80, + 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80, + 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0xf8,0x80, + 0x80,0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80, + 0xf0,0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00,0xe0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xe0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00,0xe0,0x40,0x40, + 0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40, + 0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8,0x48,0x48,0x70, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, + 0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xff, + 0x08,0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, + 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, + 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20, + 0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50, + 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xe0, + 0x90,0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xa0,0x90, + 0x88,0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78, + 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08, + 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06, + 0x00,0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20, + 0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xa0,0x78, + 0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08, + 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00, + 0x00,0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20, + 0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70, + 0x88,0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40, + 0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0, + 0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,0x07, + 0x07,0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09,0x09,0x06,0x00, + 0x00,0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00, + 0x68,0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20, + 0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70, + 0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88, + 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98, + 0xa8,0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05, + 0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07, + 0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe, + 0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xfe, + 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x50, + 0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80 +}; + +#endif // !STM32_NOT_EXTENDED_ISO10646_1_5X7 + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp new file mode 100644 index 000000000000..12efb3ba4947 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp @@ -0,0 +1,302 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* + Fontname: Helvetica + Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. + Capital A Height: 12, '1' Height: 12 + Calculated Max Values w=14 h=17 x= 2 y=10 dx=16 dy= 0 ascent=14 len=32 + Font Bounding box w=16 h=17 x= 0 y=-4 + Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 + Pure Font ascent =12 descent=-4 + X Font ascent =12 descent=-4 + Max Font ascent =14 descent=-4 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +extern const uint8_t Helvetica12Bold[4172] = { + 0,16,17,0,252,12,2,74,5,106,32,255,252,14,252,12, + 252,0,0,0,5,0,0,2,12,12,6,2,0,192,192,192, + 192,192,192,192,192,192,0,192,192,5,4,4,8,1,8,216, + 216,216,72,9,12,24,9,0,0,27,0,27,0,27,0,127, + 128,127,128,54,0,54,0,255,0,255,0,108,0,108,0,108, + 0,7,14,14,9,1,255,16,124,254,214,208,240,120,60,30, + 22,214,254,124,16,13,12,24,14,0,0,48,64,120,128,204, + 128,205,0,121,0,50,0,2,96,4,240,5,152,9,152,8, + 240,16,96,10,12,24,12,1,0,60,0,126,0,102,0,102, + 0,60,0,56,192,125,192,207,128,199,0,199,0,127,128,57, + 192,2,4,4,4,1,8,192,192,192,64,4,15,15,6,1, + 253,48,112,96,192,192,192,192,192,192,192,192,192,96,112,48, + 4,15,15,6,0,253,192,224,96,48,48,48,48,48,48,48, + 48,48,96,224,192,5,5,5,6,0,7,32,168,112,112,136, + 8,8,8,10,1,0,24,24,24,255,255,24,24,24,2,5, + 5,4,1,253,192,192,64,64,128,4,2,2,5,0,3,240, + 240,2,2,2,4,1,0,192,192,4,12,12,5,0,0,16, + 16,48,32,32,96,64,64,192,128,128,128,8,12,12,9,0, + 0,60,126,231,195,195,195,195,195,195,231,126,60,5,12,12, + 9,1,0,8,24,248,248,24,24,24,24,24,24,24,24,8, + 12,12,9,0,0,60,126,231,195,195,7,14,28,56,112,255, + 255,8,12,12,9,0,0,60,126,231,195,7,30,30,7,195, + 231,126,60,8,12,12,9,0,0,14,30,54,54,102,102,198, + 255,255,6,6,6,8,12,12,9,0,0,63,63,48,48,124, + 126,71,3,3,231,126,60,8,12,12,9,0,0,60,126,231, + 192,220,254,231,195,195,231,126,60,8,12,12,9,0,0,255, + 255,6,6,12,12,24,24,24,48,48,48,8,12,12,9,0, + 0,60,126,231,195,102,60,126,231,195,231,126,60,8,12,12, + 9,0,0,60,126,231,195,195,231,127,59,3,231,126,60,2, + 8,8,5,2,0,192,192,0,0,0,0,192,192,2,11,11, + 5,2,253,192,192,0,0,0,0,192,192,64,64,128,8,8, + 8,10,1,0,3,15,60,224,224,60,15,3,8,6,6,10, + 1,1,255,255,0,0,255,255,8,8,8,10,1,0,192,240, + 60,7,7,60,240,192,7,12,12,10,1,0,124,254,198,198, + 6,14,12,24,24,0,24,24,13,14,28,16,1,254,15,192, + 56,96,96,16,71,216,204,72,136,200,152,200,152,136,153,152, + 201,144,70,96,96,0,56,192,15,128,11,12,24,12,0,0, + 14,0,14,0,31,0,27,0,59,128,49,128,113,192,96,192, + 127,192,255,224,192,96,192,96,9,12,24,11,1,0,254,0, + 255,0,195,128,193,128,195,128,255,0,255,0,195,128,193,128, + 195,128,255,0,254,0,10,12,24,12,1,0,31,0,63,128, + 113,192,96,192,224,0,192,0,192,0,224,0,96,192,113,192, + 63,128,31,0,10,12,24,12,1,0,252,0,255,0,195,128, + 193,128,193,192,192,192,192,192,193,192,193,128,195,128,255,0, + 252,0,8,12,12,10,1,0,255,255,192,192,192,254,254,192, + 192,192,255,255,8,12,12,10,1,0,255,255,192,192,192,254, + 254,192,192,192,192,192,10,12,24,12,1,0,31,0,63,128, + 113,192,96,192,224,0,192,0,195,192,227,192,96,192,113,192, + 63,192,30,192,10,12,24,12,1,0,192,192,192,192,192,192, + 192,192,255,192,255,192,192,192,192,192,192,192,192,192,192,192, + 192,192,2,12,12,4,1,0,192,192,192,192,192,192,192,192, + 192,192,192,192,7,12,12,9,1,0,6,6,6,6,6,6, + 6,6,198,198,254,124,10,12,24,12,1,0,193,192,195,128, + 199,0,206,0,220,0,248,0,252,0,206,0,199,0,195,128, + 193,192,192,192,8,12,12,10,1,0,192,192,192,192,192,192, + 192,192,192,192,255,255,11,12,24,13,1,0,224,224,224,224, + 224,224,241,224,241,224,209,96,219,96,219,96,202,96,206,96, + 206,96,196,96,10,12,24,12,1,0,224,192,240,192,240,192, + 216,192,216,192,204,192,204,192,198,192,198,192,195,192,195,192, + 193,192,11,12,24,13,1,0,31,0,63,128,113,192,96,192, + 224,224,192,96,192,96,224,224,96,192,113,192,63,128,31,0, + 9,12,24,11,1,0,254,0,255,0,195,128,193,128,193,128, + 195,128,255,0,254,0,192,0,192,0,192,0,192,0,11,13, + 26,13,1,255,31,0,63,128,113,192,96,192,224,224,192,96, + 192,96,226,96,103,192,115,192,63,128,31,192,0,128,10,12, + 24,12,1,0,255,0,255,128,193,128,193,128,195,128,255,0, + 255,0,195,128,193,128,193,128,193,192,193,192,9,12,24,11, + 1,0,62,0,127,0,227,128,193,128,240,0,126,0,31,0, + 3,128,193,128,227,128,127,0,62,0,10,12,24,10,0,0, + 255,192,255,192,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,12,0,12,0,10,12,24,12,1,0,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 225,192,127,128,63,0,10,12,24,11,0,0,192,192,192,192, + 97,128,97,128,97,128,51,0,51,0,51,0,30,0,30,0, + 12,0,12,0,14,12,24,15,0,0,195,12,195,12,195,12, + 99,24,103,152,103,152,52,176,60,240,60,240,24,96,24,96, + 24,96,9,12,24,11,1,0,193,128,227,128,99,0,54,0, + 62,0,28,0,28,0,62,0,54,0,99,0,227,128,193,128, + 10,12,24,11,0,0,192,192,225,192,97,128,51,0,51,0, + 30,0,30,0,12,0,12,0,12,0,12,0,12,0,8,12, + 12,10,1,0,255,255,7,6,12,28,56,48,96,224,255,255, + 4,15,15,6,1,253,240,240,192,192,192,192,192,192,192,192, + 192,192,192,240,240,4,12,12,5,0,0,128,128,192,64,64, + 96,32,32,48,16,16,16,4,15,15,6,0,253,240,240,48, + 48,48,48,48,48,48,48,48,48,48,240,240,8,7,7,10, + 1,5,24,24,60,102,102,195,195,9,1,2,9,0,253,255, + 128,3,3,3,6,2,10,128,192,32,8,9,9,9,1,0, + 124,254,198,14,126,230,198,254,119,8,12,12,10,1,0,192, + 192,192,220,254,231,195,195,195,231,254,220,8,9,9,9,1, + 0,60,126,231,192,192,192,231,126,60,8,12,12,10,1,0, + 3,3,3,63,127,231,195,195,195,231,127,59,8,9,9,10, + 1,0,60,126,195,255,255,192,231,126,60,4,12,12,6,1, + 0,48,112,96,240,240,96,96,96,96,96,96,96,8,13,13, + 10,1,252,59,127,231,195,195,195,231,127,59,3,231,126,60, + 8,12,12,10,1,0,192,192,192,222,255,227,195,195,195,195, + 195,195,2,12,12,4,1,0,192,192,0,192,192,192,192,192, + 192,192,192,192,3,16,16,5,1,252,96,96,0,96,96,96, + 96,96,96,96,96,96,96,96,224,192,8,12,12,9,1,0, + 192,192,192,199,206,220,248,252,236,206,198,199,2,12,12,4, + 1,0,192,192,192,192,192,192,192,192,192,192,192,192,12,9, + 18,14,1,0,222,224,255,240,231,48,198,48,198,48,198,48, + 198,48,198,48,198,48,8,9,9,10,1,0,222,255,227,195, + 195,195,195,195,195,8,9,9,10,1,0,60,126,231,195,195, + 195,231,126,60,8,13,13,10,1,252,220,254,231,195,195,195, + 231,254,220,192,192,192,192,8,13,13,10,1,252,59,127,231, + 195,195,195,231,127,59,3,3,3,3,5,9,9,6,1,0, + 216,248,224,192,192,192,192,192,192,7,9,9,9,1,0,124, + 254,198,240,124,14,198,254,124,4,11,11,6,1,0,96,96, + 240,240,96,96,96,96,96,112,48,8,9,9,10,1,0,195, + 195,195,195,195,195,199,255,123,8,9,9,9,0,0,195,195, + 102,102,102,60,60,24,24,12,9,18,13,0,0,198,48,198, + 48,102,96,102,96,111,96,63,192,57,192,25,128,25,128,7, + 9,9,9,1,0,198,198,108,124,56,124,108,198,198,8,13, + 13,9,0,252,195,195,99,102,54,54,60,28,24,24,24,112, + 96,7,9,9,8,0,0,254,254,14,28,24,56,112,254,254, + 4,15,15,6,1,253,48,112,96,96,96,96,96,192,96,96, + 96,96,96,112,48,1,16,16,4,1,252,128,128,128,128,128, + 128,128,128,128,128,128,128,128,128,128,128,4,15,15,6,1, + 253,192,224,96,96,96,96,96,48,96,96,96,96,96,224,192, + 8,3,3,10,1,3,113,153,142,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,5,0,0,2,12,12,6,1,253,192,192,0,64,64, + 64,192,192,192,192,192,192,8,11,11,9,0,255,4,60,126, + 239,200,216,208,247,126,60,32,8,12,12,9,0,0,28,62, + 99,99,96,48,124,48,48,32,127,255,7,7,7,9,1,2, + 186,124,198,198,198,124,186,8,12,12,9,0,0,195,195,102, + 102,60,24,126,24,126,24,24,24,1,16,16,5,2,252,128, + 128,128,128,128,128,128,0,0,128,128,128,128,128,128,128,8, + 15,15,9,0,253,60,126,102,96,120,126,199,195,243,126,30, + 6,102,126,60,5,2,2,6,0,10,216,216,12,12,24,12, + 0,0,15,0,57,192,96,96,79,32,217,176,144,16,144,16, + 217,176,79,32,96,32,57,192,15,0,5,7,7,6,1,5, + 96,144,112,144,120,0,248,8,6,6,9,0,2,51,102,204, + 204,102,51,8,5,5,10,0,2,255,255,3,3,3,4,2, + 2,5,0,3,240,240,12,12,24,12,0,0,15,0,57,192, + 96,96,95,32,217,176,153,144,158,16,219,48,91,32,96,96, + 57,192,15,0,5,1,1,6,0,10,248,4,5,5,7,1, + 7,96,144,144,144,96,8,11,11,10,1,0,24,24,24,255, + 255,24,24,24,0,255,255,5,7,7,6,0,5,112,216,216, + 48,96,248,248,5,7,7,6,0,5,112,216,24,48,24,216, + 112,3,3,3,6,1,10,32,96,128,8,12,12,10,1,253, + 195,195,195,195,195,195,199,255,251,192,192,192,8,15,15,9, + 0,253,127,242,242,242,242,242,114,18,18,18,18,18,18,18, + 18,2,2,2,5,1,4,192,192,5,4,4,6,0,252,32, + 48,152,112,4,7,7,6,1,5,48,240,240,48,48,48,48, + 5,7,7,6,0,5,112,216,136,216,112,0,248,8,6,6, + 9,1,2,204,102,51,51,102,204,13,12,24,14,1,0,48, + 192,240,128,241,128,49,0,51,48,50,112,54,240,4,176,13, + 176,9,248,24,48,16,48,12,12,24,14,0,0,48,128,241, + 128,241,0,51,0,50,0,54,224,53,176,13,176,8,96,24, + 192,17,240,49,240,13,12,24,14,0,0,112,64,216,192,24, + 128,49,128,25,48,219,112,114,240,6,176,5,176,13,248,8, + 48,24,48,7,12,12,10,1,253,48,48,0,48,48,96,224, + 192,198,198,254,124,11,14,28,12,0,0,4,0,0,0,14, + 0,14,0,31,0,27,0,59,128,49,128,113,192,96,192,127, + 192,255,224,192,96,192,96,11,14,28,12,0,0,8,0,0, + 0,14,0,14,0,31,0,27,0,59,128,49,128,113,192,96, + 192,127,192,255,224,192,96,192,96,11,14,28,12,0,0,17, + 0,0,0,14,0,14,0,31,0,27,0,59,128,49,128,113, + 192,96,192,127,192,255,224,192,96,192,96,11,14,28,12,0, + 0,23,0,0,0,14,0,14,0,31,0,27,0,59,128,49, + 128,113,192,96,192,127,192,255,224,192,96,192,96,11,14,28, + 12,0,0,49,128,0,0,14,0,14,0,31,0,27,0,59, + 128,49,128,113,192,96,192,127,192,255,224,192,96,192,96,11, + 14,28,12,0,0,18,0,12,0,14,0,14,0,31,0,27, + 0,59,128,49,128,113,192,96,192,127,192,255,224,192,96,192, + 96,14,12,24,15,0,0,31,252,31,252,27,0,51,0,51, + 0,51,248,99,248,127,0,127,0,195,0,195,252,195,252,10, + 16,32,12,1,252,31,0,63,128,113,192,96,192,224,0,192, + 0,192,0,224,0,96,192,113,192,63,128,31,0,4,0,6, + 0,19,0,14,0,8,14,14,10,1,0,8,0,255,255,192, + 192,192,254,254,192,192,192,255,255,8,14,14,10,1,0,16, + 0,255,255,192,192,192,254,254,192,192,192,255,255,8,14,14, + 10,1,0,34,0,255,255,192,192,192,254,254,192,192,192,255, + 255,8,14,14,10,1,0,102,0,255,255,192,192,192,254,254, + 192,192,192,255,255,2,14,14,4,1,0,64,0,192,192,192, + 192,192,192,192,192,192,192,192,192,2,14,14,4,1,0,128, + 0,192,192,192,192,192,192,192,192,192,192,192,192,5,14,14, + 5,0,0,136,0,96,96,96,96,96,96,96,96,96,96,96, + 96,5,14,14,5,0,0,152,0,96,96,96,96,96,96,96, + 96,96,96,96,96,12,12,24,12,0,0,63,0,63,192,48, + 224,48,96,48,112,252,48,252,48,48,112,48,96,48,224,63, + 192,63,0,10,14,28,12,1,0,46,0,0,0,224,192,240, + 192,240,192,216,192,216,192,204,192,204,192,198,192,198,192,195, + 192,195,192,193,192,11,14,28,13,1,0,2,0,0,0,31, + 0,63,128,113,192,96,192,224,224,192,96,192,96,224,224,96, + 192,113,192,63,128,31,0,11,14,28,13,1,0,4,0,0, + 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,224, + 224,96,192,113,192,63,128,31,0,11,14,28,13,1,0,17, + 0,0,0,31,0,63,128,113,192,96,192,224,224,192,96,192, + 96,224,224,96,192,113,192,63,128,31,0,11,14,28,13,1, + 0,23,0,0,0,31,0,63,128,113,192,96,192,224,224,192, + 96,192,96,224,224,96,192,113,192,63,128,31,0,11,14,28, + 13,1,0,25,128,0,0,31,0,63,128,113,192,96,192,224, + 224,192,96,192,96,224,224,96,192,113,192,63,128,31,0,9, + 9,18,10,0,0,65,0,227,128,119,0,62,0,28,0,62, + 0,119,0,227,128,65,0,11,12,24,13,1,0,31,32,63, + 192,112,192,97,192,227,96,198,96,204,96,216,224,112,192,97, + 192,127,128,159,0,10,14,28,12,1,0,4,0,0,0,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,225,192,127,128,63,0,10,14,28,12,1,0,8,0,0, + 0,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,225,192,127,128,63,0,10,14,28,12,1,0,17, + 0,0,0,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,225,192,127,128,63,0,10,14,28,12,1, + 0,51,0,0,0,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,225,192,127,128,63,0,10,14,28, + 11,0,0,8,0,0,0,192,192,225,192,97,128,51,0,51, + 0,30,0,30,0,12,0,12,0,12,0,12,0,12,0,9, + 12,24,11,1,0,192,0,254,0,255,0,195,128,193,128,193, + 128,195,128,255,0,254,0,192,0,192,0,192,0,8,12,12, + 10,1,0,124,254,198,198,220,222,195,195,195,195,222,220,8, + 13,13,9,1,0,32,48,8,0,124,254,198,14,126,230,198, + 254,119,8,13,13,9,1,0,4,12,16,0,124,254,198,14, + 126,230,198,254,119,8,13,13,9,1,0,16,56,68,0,124, + 254,198,14,126,230,198,254,119,8,12,12,9,1,0,58,92, + 0,124,254,198,14,126,230,198,254,119,8,12,12,9,1,0, + 108,108,0,124,254,198,14,126,230,198,254,119,8,13,13,9, + 1,0,24,36,36,24,124,254,198,14,126,230,198,254,119,13, + 9,18,15,1,0,125,224,255,240,198,24,15,248,127,248,230, + 0,207,56,255,240,121,224,8,13,13,9,1,252,60,126,231, + 192,192,192,231,126,60,16,24,76,56,8,13,13,10,1,0, + 32,48,8,0,60,126,195,255,255,192,231,126,60,8,13,13, + 10,1,0,4,12,16,0,60,126,195,255,255,192,231,126,60, + 8,13,13,10,1,0,8,28,34,0,60,126,195,255,255,192, + 231,126,60,8,12,12,10,1,0,54,54,0,60,126,195,255, + 255,192,231,126,60,3,13,13,4,0,0,128,192,32,0,96, + 96,96,96,96,96,96,96,96,3,13,13,4,1,0,32,96, + 128,0,192,192,192,192,192,192,192,192,192,5,13,13,5,0, + 0,32,112,136,0,96,96,96,96,96,96,96,96,96,5,12, + 12,5,0,0,216,216,0,96,96,96,96,96,96,96,96,96, + 8,12,12,10,1,0,96,124,248,28,126,231,195,195,195,231, + 126,60,8,12,12,10,1,0,58,92,0,222,255,227,195,195, + 195,195,195,195,8,13,13,10,1,0,32,48,8,0,60,126, + 231,195,195,195,231,126,60,8,13,13,10,1,0,8,24,32, + 0,60,126,231,195,195,195,231,126,60,8,13,13,10,1,0, + 16,56,68,0,60,126,231,195,195,195,231,126,60,8,12,12, + 10,1,0,58,92,0,60,126,231,195,195,195,231,126,60,8, + 12,12,10,1,0,108,108,0,60,126,231,195,195,195,231,126, + 60,8,8,8,10,1,0,24,24,0,255,255,0,24,24,8, + 9,9,10,1,0,61,127,231,207,219,243,231,254,188,8,13, + 13,10,1,0,32,48,8,0,195,195,195,195,195,195,199,255, + 123,8,13,13,10,1,0,8,24,32,0,195,195,195,195,195, + 195,199,255,123,8,13,13,10,1,0,16,56,68,0,195,195, + 195,195,195,195,199,255,123,8,12,12,10,1,0,108,108,0, + 195,195,195,195,195,195,199,255,123,8,17,17,9,0,252,4, + 12,16,0,195,195,99,102,54,54,60,28,24,24,24,112,96, + 8,16,16,10,1,252,192,192,192,220,254,231,195,195,195,231, + 254,220,192,192,192,192,8,16,16,9,0,252,54,54,0,195, + 195,99,102,54,54,60,28,24,24,24,112,96 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp new file mode 100644 index 000000000000..a27ea4369793 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp @@ -0,0 +1,378 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* + Fontname: Helvetica + Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. + Capital A Height: 14, '1' Height: 13 + Calculated Max Values w=16 h=18 x= 2 y=12 dx=18 dy= 0 ascent=16 len=36 + Font Bounding box w=18 h=19 x= 0 y=-4 + Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 + Pure Font ascent =14 descent=-4 + X Font ascent =14 descent=-4 + Max Font ascent =16 descent=-4 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +/* +typedef struct __attribute__((__packed__)) { + uint8_t BBXWidth; + uint8_t BBXHeight; + uint8_t DataSize; + int8_t DWidth; + int8_t BBXOffsetX; + int8_t BBXOffsetY; +} tGlyph; +*/ + +extern const uint8_t Helvetica14_symbols[63] = { + 0,18,19,0,252,14,0,0,0,0,1,9,252,16,252,14,252, // tFont + 0,0,0,0,0,0, // 0x01 - LCD_STR_REFRESH + 0,0,0,0,0,0, // 0x02 - LCD_STR_FOLDER + 255, // 0x03 - LCD_STR_ARROW_RIGHT + 255, // 0x04 - LCD_STR_UPLEVEL + 255, // 0x05 - LCD_STR_CLOCK + 255, // 0x06 - LCD_STR_FEEDRATE + 255, // 0x07 - LCD_STR_BEDTEMP + 5,12,12,6,0,1,32,80,80,80,80,80,80,80,136,136,136,112, // 0x08 - LCD_STR_THERMOMETER + 5,5,5,5,0,11,112,216,136,216,112, // 0x09 - LCD_STR_DEGREE +}; + +extern const uint8_t Helvetica14[5005] = { + 0,18,19,0,252,14,2,150,6,83,32,255,252,16,252,14,252, // tFont + 0,0,0,5,0,0,2,14,14,6,2,0,192,192,192, + 192,192,192,192,192,192,192,0,0,192,192,5,5,5,5,0, + 9,216,216,216,216,216,10,13,26,10,0,0,9,0,9,0, + 9,0,127,192,127,192,18,0,18,0,18,0,255,128,255,128, + 36,0,36,0,36,0,9,16,32,10,1,254,8,0,62,0, + 127,0,203,0,200,0,232,0,120,0,62,0,15,0,9,128, + 201,128,235,128,127,0,62,0,8,0,8,0,14,13,26,16, + 1,0,120,96,204,192,204,192,205,128,205,128,123,0,3,0, + 6,120,6,204,12,204,12,204,24,204,24,120,12,13,26,13, + 1,0,60,0,126,0,102,0,102,0,60,0,124,0,238,192, + 198,192,195,192,195,128,231,192,126,224,60,112,2,5,5,4, + 1,9,192,192,192,192,192,4,18,18,6,0,252,16,48,96, + 96,192,192,192,192,192,192,192,192,192,192,96,96,48,16,4, + 18,18,6,1,252,128,192,96,96,48,48,48,48,48,48,48, + 48,48,48,96,96,192,128,5,7,7,7,1,7,32,168,248, + 32,248,168,32,8,10,10,10,1,0,24,24,24,24,255,255, + 24,24,24,24,2,5,5,5,1,253,192,192,64,64,128,5, + 2,2,6,0,4,248,248,2,2,2,5,1,0,192,192,5, + 14,14,5,0,0,24,24,24,24,48,48,48,96,96,96,192, + 192,192,192,8,13,13,10,1,0,60,126,102,195,195,195,195, + 195,195,195,102,126,60,5,13,13,10,2,0,24,248,248,24, + 24,24,24,24,24,24,24,24,24,8,13,13,10,1,0,60, + 254,195,3,7,14,28,56,112,224,192,255,255,8,13,13,10, + 1,0,62,127,195,195,6,28,30,7,3,195,199,126,60,9, + 13,26,10,0,0,3,0,7,0,15,0,27,0,51,0,51, + 0,99,0,195,0,255,128,255,128,3,0,3,0,3,0,8, + 13,13,10,1,0,254,254,192,192,252,254,199,3,3,195,199, + 254,124,8,13,13,10,1,0,60,127,99,192,192,220,254,195, + 195,195,227,126,60,8,13,13,10,1,0,255,255,3,6,12, + 12,24,24,48,48,96,96,96,8,13,13,10,1,0,60,126, + 231,195,195,102,126,231,195,195,231,126,60,8,13,13,10,1, + 0,60,126,199,195,195,195,127,59,3,3,198,254,124,2,10, + 10,5,1,0,192,192,0,0,0,0,0,0,192,192,2,13, + 13,5,1,253,192,192,0,0,0,0,0,0,192,192,64,64, + 128,8,9,9,10,1,0,3,15,60,112,192,112,60,15,3, + 7,5,5,11,2,2,254,254,0,254,254,8,9,9,10,1, + 0,192,240,60,14,3,14,60,240,192,7,14,14,10,1,0, + 124,254,198,198,14,28,56,48,48,48,0,0,48,48,16,17, + 34,18,1,253,3,240,15,252,28,14,48,6,99,211,103,115, + 198,51,204,99,204,102,204,102,204,204,207,248,103,112,112,0, + 56,0,31,240,7,224,12,14,28,13,0,0,6,0,6,0, + 15,0,15,0,25,128,25,128,48,192,48,192,63,192,127,224, + 96,96,96,96,192,48,192,48,11,14,28,13,1,0,255,0, + 255,128,193,192,192,192,192,192,193,128,255,128,255,192,192,224, + 192,96,192,96,192,224,255,192,255,128,12,14,28,14,1,0, + 15,128,63,224,112,112,96,48,224,0,192,0,192,0,192,0, + 192,0,224,0,96,48,112,112,63,224,15,128,12,14,28,14, + 1,0,255,128,255,192,192,224,192,96,192,48,192,48,192,48, + 192,48,192,48,192,48,192,96,192,224,255,192,255,128,10,14, + 28,13,2,0,255,192,255,192,192,0,192,0,192,0,192,0, + 255,128,255,128,192,0,192,0,192,0,192,0,255,192,255,192, + 9,14,28,12,2,0,255,128,255,128,192,0,192,0,192,0, + 192,0,255,0,255,0,192,0,192,0,192,0,192,0,192,0, + 192,0,13,14,28,15,1,0,15,192,63,240,112,56,96,24, + 224,24,192,0,192,0,192,248,192,248,224,24,96,24,112,56, + 63,248,15,216,11,14,28,14,1,0,192,96,192,96,192,96, + 192,96,192,96,192,96,255,224,255,224,192,96,192,96,192,96, + 192,96,192,96,192,96,2,14,14,6,2,0,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,8,14,14,10,0,0, + 3,3,3,3,3,3,3,3,3,195,195,231,126,60,11,14, + 28,14,2,0,192,224,193,192,195,128,199,0,206,0,220,0, + 248,0,252,0,206,0,199,0,195,128,193,192,192,224,192,96, + 9,14,28,11,1,0,192,0,192,0,192,0,192,0,192,0, + 192,0,192,0,192,0,192,0,192,0,192,0,192,0,255,128, + 255,128,14,14,28,16,1,0,192,12,192,12,224,28,224,28, + 240,60,240,60,216,108,216,108,204,204,204,204,196,140,199,140, + 195,12,195,12,11,14,28,14,1,0,192,96,224,96,240,96, + 240,96,216,96,204,96,204,96,198,96,198,96,195,96,193,224, + 193,224,192,224,192,96,13,14,28,15,1,0,15,128,63,224, + 112,112,96,48,224,56,192,24,192,24,192,24,192,24,224,56, + 96,48,112,112,63,224,15,128,10,14,28,13,2,0,255,0, + 255,128,193,192,192,192,192,192,193,192,255,128,255,0,192,0, + 192,0,192,0,192,0,192,0,192,0,13,15,30,15,1,255, + 15,128,63,224,112,112,96,48,224,56,192,24,192,24,192,24, + 192,24,225,184,97,176,112,240,63,224,15,176,0,48,11,14, + 28,14,1,0,255,128,255,192,192,224,192,96,192,96,192,224, + 255,192,255,128,192,192,192,192,192,96,192,96,192,96,192,96, + 10,14,28,13,1,0,30,0,127,128,225,192,192,192,224,0, + 124,0,31,0,3,128,1,192,0,192,192,192,225,192,127,128, + 63,0,10,14,28,12,1,0,255,192,255,192,12,0,12,0, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,11,14,28,14,1,0,192,96,192,96,192,96, + 192,96,192,96,192,96,192,96,192,96,192,96,192,96,192,96, + 96,192,127,192,31,0,12,14,28,13,0,0,192,48,192,48, + 96,96,96,96,96,96,48,192,48,192,48,192,25,128,25,128, + 25,128,15,0,15,0,6,0,16,14,28,18,1,0,193,131, + 193,131,193,131,195,195,99,198,98,70,102,102,102,102,54,108, + 54,108,52,44,28,56,24,24,24,24,11,14,28,13,1,0, + 192,96,192,96,96,192,113,192,49,128,27,0,14,0,14,0, + 27,0,49,128,113,192,96,192,192,96,192,96,12,14,28,13, + 0,0,192,48,192,48,96,96,96,96,48,192,57,192,25,128, + 15,0,6,0,6,0,6,0,6,0,6,0,6,0,10,14, + 28,12,1,0,255,192,255,192,0,192,1,128,3,0,6,0, + 12,0,28,0,24,0,48,0,96,0,192,0,255,192,255,192, + 4,18,18,5,0,252,240,240,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,240,240,5,14,14,5,0,0,192,192, + 192,96,96,96,48,48,48,48,24,24,24,24,4,18,18,5, + 0,252,240,240,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,240,240,7,6,6,9,1,7,16,56,108,108,198,198, + 11,2,4,11,0,252,255,224,255,224,4,3,3,4,0,11, + 192,96,48,9,10,20,11,1,0,126,0,231,0,195,0,7, + 0,127,0,227,0,195,0,195,0,231,128,121,128,9,14,28, + 11,1,0,192,0,192,0,192,0,192,0,222,0,255,0,227, + 0,193,128,193,128,193,128,193,128,227,0,255,0,222,0,8, + 10,10,10,1,0,62,127,99,192,192,192,192,99,127,62,9, + 14,28,11,1,0,1,128,1,128,1,128,1,128,61,128,127, + 128,99,128,193,128,193,128,193,128,193,128,99,128,127,128,61, + 128,8,10,10,10,1,0,60,126,195,195,255,192,192,227,127, + 60,6,14,14,6,0,0,28,60,48,48,252,252,48,48,48, + 48,48,48,48,48,9,14,28,11,1,252,61,128,127,128,97, + 128,193,128,193,128,193,128,193,128,99,128,127,128,61,128,1, + 128,99,0,127,0,28,0,8,14,14,10,1,0,192,192,192, + 192,222,255,227,195,195,195,195,195,195,195,2,14,14,4,1, + 0,192,192,0,0,192,192,192,192,192,192,192,192,192,192,3, + 18,18,4,0,252,96,96,0,0,96,96,96,96,96,96,96, + 96,96,96,96,96,224,192,8,14,14,9,1,0,192,192,192, + 192,198,204,216,240,248,216,204,206,198,199,2,14,14,4,1, + 0,192,192,192,192,192,192,192,192,192,192,192,192,192,192,14, + 10,20,16,1,0,222,120,255,252,227,140,195,12,195,12,195, + 12,195,12,195,12,195,12,195,12,8,10,10,10,1,0,222, + 255,227,195,195,195,195,195,195,195,9,10,20,11,1,0,62, + 0,127,0,99,0,193,128,193,128,193,128,193,128,99,0,127, + 0,62,0,9,14,28,11,1,252,222,0,255,0,227,0,193, + 128,193,128,193,128,193,128,227,0,255,0,222,0,192,0,192, + 0,192,0,192,0,9,14,28,11,1,252,61,128,127,128,99, + 128,193,128,193,128,193,128,193,128,99,128,127,128,61,128,1, + 128,1,128,1,128,1,128,5,10,10,6,1,0,216,216,224, + 192,192,192,192,192,192,192,7,10,10,9,1,0,60,126,198, + 192,252,62,6,198,252,120,6,13,13,6,0,0,48,48,48, + 252,252,48,48,48,48,48,48,60,28,8,10,10,10,1,0, + 195,195,195,195,195,195,195,199,255,123,8,10,10,10,1,0, + 195,195,195,102,102,102,36,60,24,24,12,10,20,14,1,0, + 198,48,198,48,198,48,102,96,102,96,105,96,41,64,57,192, + 25,128,25,128,8,10,10,10,1,0,195,231,102,60,24,24, + 60,102,231,195,8,14,14,10,1,252,195,195,195,102,102,102, + 36,60,24,24,24,24,112,112,7,10,10,9,1,0,254,254, + 6,12,24,48,96,192,254,254,5,18,18,6,0,252,24,48, + 96,96,96,96,96,192,128,192,96,96,96,96,96,96,48,24, + 2,18,18,5,1,252,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,6,18,18,6,0,252,192,96, + 48,48,48,48,48,24,12,24,48,48,48,48,48,48,96,192, + 8,3,3,10,1,4,115,255,206,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, + 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, + 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, + 0,0,5,0,0,2,14,14,6,2,252,192,192,0,0,64, + 64,192,192,192,192,192,192,192,192,8,14,14,10,1,254,4, + 4,62,127,107,200,200,200,200,107,127,62,16,16,9,13,26, + 10,0,0,30,0,63,0,97,128,97,128,96,0,48,0,126, + 0,24,0,24,0,48,0,96,128,255,128,223,0,8,7,7, + 10,1,3,195,255,102,102,102,255,195,8,13,13,10,1,0, + 195,195,102,102,102,60,255,24,255,24,24,24,24,2,18,18, + 5,1,252,192,192,192,192,192,192,192,0,0,0,0,192,192, + 192,192,192,192,192,8,18,18,10,1,252,60,126,195,195,240, + 124,110,199,195,227,115,62,14,7,195,195,126,60,5,2,2, + 6,0,12,216,216,13,14,28,15,1,0,15,128,48,96,64, + 16,71,16,136,136,144,136,144,8,144,8,144,8,136,136,71, + 16,64,16,48,96,15,128,5,8,8,7,1,6,112,152,56, + 72,216,104,0,248,7,6,6,9,1,2,54,108,216,216,108, + 54,9,5,10,11,1,3,255,128,255,128,1,128,1,128,1, + 128,5,1,1,6,0,5,248,13,14,28,14,0,0,15,128, + 48,96,64,16,79,144,136,72,136,72,136,72,143,136,137,8, + 136,136,72,80,64,16,48,96,15,128,5,1,1,5,0,12, + 248,5,5,5,7,1,8,112,216,136,216,112,8,11,11,10, + 1,0,24,24,24,255,255,24,24,24,0,255,255,5,8,8, + 6,0,5,112,248,152,24,48,96,248,248,5,8,8,6,0, + 5,112,248,152,48,48,152,248,112,4,3,3,4,0,11,48, + 96,192,8,14,14,10,1,252,195,195,195,195,195,195,195,231, + 255,219,192,192,192,192,8,18,18,10,1,252,63,114,242,242, + 242,242,242,114,50,18,18,18,18,18,18,18,18,18,2,2, + 2,4,1,4,192,192,5,5,5,5,0,252,96,112,24,216, + 240,4,8,8,6,0,5,48,240,240,48,48,48,48,48,5, + 8,8,7,1,6,112,216,136,136,216,112,0,248,7,6,6, + 9,1,2,216,108,54,54,108,216,14,13,26,15,0,0,48, + 48,240,48,240,96,48,192,48,192,49,136,49,24,51,56,6, + 120,6,216,12,252,24,24,24,24,14,13,26,15,0,0,48, + 48,240,48,240,96,48,192,48,192,49,184,49,124,51,76,6, + 12,6,24,12,48,24,124,24,124,14,13,26,15,0,0,112, + 48,248,48,152,96,48,192,48,192,153,136,249,24,115,56,6, + 120,6,216,12,252,24,24,24,24,7,14,14,10,1,252,24, + 24,0,0,24,24,24,56,112,224,198,198,254,124,12,16,32, + 13,0,0,6,0,0,0,6,0,6,0,15,0,15,0,25, + 128,25,128,48,192,48,192,63,192,127,224,96,96,96,96,192, + 48,192,48,12,16,32,13,0,0,6,0,0,0,6,0,6, + 0,15,0,15,0,25,128,25,128,48,192,48,192,63,192,127, + 224,96,96,96,96,192,48,192,48,12,16,32,13,0,0,25, + 128,0,0,6,0,6,0,15,0,15,0,25,128,25,128,48, + 192,48,192,63,192,127,224,96,96,96,96,192,48,192,48,12, + 16,32,13,0,0,19,0,0,0,6,0,6,0,15,0,15, + 0,25,128,25,128,48,192,48,192,63,192,127,224,96,96,96, + 96,192,48,192,48,12,16,32,13,0,0,25,128,0,0,6, + 0,6,0,15,0,15,0,25,128,25,128,48,192,48,192,63, + 192,127,224,96,96,96,96,192,48,192,48,12,16,32,13,0, + 0,9,0,9,0,6,0,6,0,15,0,15,0,25,128,25, + 128,48,192,48,192,63,192,127,224,96,96,96,96,192,48,192, + 48,16,14,28,18,1,0,7,255,7,255,13,128,13,128,25, + 128,25,128,49,254,49,254,63,128,127,128,97,128,97,128,193, + 255,193,255,12,18,36,14,1,252,15,128,63,224,112,112,96, + 48,224,0,192,0,192,0,192,0,192,0,224,0,96,48,112, + 112,63,224,15,128,6,0,3,0,27,0,30,0,10,16,32, + 13,2,0,12,0,0,0,255,192,255,192,192,0,192,0,192, + 0,192,0,255,128,255,128,192,0,192,0,192,0,192,0,255, + 192,255,192,10,16,32,13,2,0,12,0,0,0,255,192,255, + 192,192,0,192,0,192,0,192,0,255,128,255,128,192,0,192, + 0,192,0,192,0,255,192,255,192,10,16,32,13,2,0,51, + 0,0,0,255,192,255,192,192,0,192,0,192,0,192,0,255, + 128,255,128,192,0,192,0,192,0,192,0,255,192,255,192,10, + 16,32,13,2,0,51,0,0,0,255,192,255,192,192,0,192, + 0,192,0,192,0,255,128,255,128,192,0,192,0,192,0,192, + 0,255,192,255,192,2,16,16,6,2,0,192,0,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,2,16,16,6,2, + 0,192,0,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,6,16,16,6,0,0,132,0,48,48,48,48,48,48,48, + 48,48,48,48,48,48,48,6,16,16,6,0,0,204,0,48, + 48,48,48,48,48,48,48,48,48,48,48,48,48,13,14,28, + 14,0,0,127,192,127,224,96,112,96,48,96,24,96,24,252, + 24,252,24,96,24,96,24,96,48,96,112,127,224,127,192,11, + 16,32,14,1,0,19,0,0,0,192,96,224,96,240,96,240, + 96,216,96,204,96,204,96,198,96,198,96,195,96,193,224,193, + 224,192,224,192,96,13,16,32,15,1,0,6,0,0,0,15, + 128,63,224,112,112,96,48,224,56,192,24,192,24,192,24,192, + 24,224,56,96,48,112,112,63,224,15,128,13,16,32,15,1, + 0,6,0,0,0,15,128,63,224,112,112,96,48,224,56,192, + 24,192,24,192,24,192,24,224,56,96,48,112,112,63,224,15, + 128,13,16,32,15,1,0,12,192,0,0,15,128,63,224,112, + 112,96,48,224,56,192,24,192,24,192,24,192,24,224,56,96, + 48,112,112,63,224,15,128,13,16,32,15,1,0,9,128,0, + 0,15,128,63,224,112,112,96,48,224,56,192,24,192,24,192, + 24,192,24,224,56,96,48,112,112,63,224,15,128,13,16,32, + 15,1,0,12,192,0,0,15,128,63,224,112,112,96,48,224, + 56,192,24,192,24,192,24,192,24,224,56,96,48,112,112,63, + 224,15,128,10,9,18,10,0,0,192,192,97,128,51,0,30, + 0,12,0,30,0,51,0,97,128,192,192,14,14,28,15,0, + 0,7,204,31,248,56,48,48,120,112,220,97,140,99,12,98, + 12,102,12,108,28,56,24,56,56,111,240,199,192,11,16,32, + 14,1,0,6,0,0,0,192,96,192,96,192,96,192,96,192, + 96,192,96,192,96,192,96,192,96,192,96,192,96,96,192,127, + 192,31,0,11,16,32,14,1,0,12,0,0,0,192,96,192, + 96,192,96,192,96,192,96,192,96,192,96,192,96,192,96,192, + 96,192,96,96,192,127,192,31,0,11,16,32,14,1,0,25, + 128,0,0,192,96,192,96,192,96,192,96,192,96,192,96,192, + 96,192,96,192,96,192,96,192,96,96,192,127,192,31,0,11, + 16,32,14,1,0,49,128,0,0,192,96,192,96,192,96,192, + 96,192,96,192,96,192,96,192,96,192,96,192,96,192,96,96, + 192,127,192,31,0,12,16,32,13,0,0,6,0,0,0,192, + 48,192,48,96,96,96,96,48,192,57,192,25,128,15,0,6, + 0,6,0,6,0,6,0,6,0,6,0,10,14,28,12,1, + 0,192,0,192,0,192,0,255,0,255,128,193,192,192,192,192, + 192,193,192,255,128,255,0,192,0,192,0,192,0,7,14,14, + 9,1,0,56,124,198,198,198,198,220,220,198,198,198,198,222, + 220,9,14,28,11,1,0,48,0,24,0,12,0,0,0,126, + 0,231,0,195,0,7,0,127,0,227,0,195,0,195,0,231, + 128,121,128,9,14,28,11,1,0,12,0,24,0,48,0,0, + 0,126,0,231,0,195,0,7,0,127,0,227,0,195,0,195, + 0,231,128,121,128,9,14,28,11,1,0,24,0,60,0,102, + 0,0,0,126,0,231,0,195,0,7,0,127,0,227,0,195, + 0,195,0,231,128,121,128,9,14,28,11,1,0,50,0,90, + 0,76,0,0,0,126,0,231,0,195,0,7,0,127,0,227, + 0,195,0,195,0,231,128,121,128,9,14,28,11,1,0,102, + 0,102,0,0,0,0,0,126,0,231,0,195,0,7,0,127, + 0,227,0,195,0,195,0,231,128,121,128,9,14,28,11,1, + 0,24,0,36,0,36,0,24,0,126,0,231,0,195,0,7, + 0,127,0,227,0,195,0,195,0,231,128,121,128,14,10,20, + 17,2,0,126,240,231,248,195,12,7,12,127,252,227,0,195, + 0,195,140,231,252,122,240,8,14,14,10,1,252,62,127,99, + 192,192,192,192,99,127,62,24,12,108,120,8,14,14,10,1, + 0,48,24,12,0,60,126,195,195,255,192,192,227,127,60,8, + 14,14,10,1,0,12,24,48,0,60,126,195,195,255,192,192, + 227,127,60,8,14,14,10,1,0,24,60,102,0,60,126,195, + 195,255,192,192,227,127,60,8,14,14,10,1,0,102,102,0, + 0,60,126,195,195,255,192,192,227,127,60,4,14,14,4,0, + 0,192,96,48,0,96,96,96,96,96,96,96,96,96,96,4, + 14,14,4,0,0,48,96,192,0,96,96,96,96,96,96,96, + 96,96,96,5,14,14,5,0,0,96,240,152,0,96,96,96, + 96,96,96,96,96,96,96,5,14,14,5,0,0,216,216,0, + 0,96,96,96,96,96,96,96,96,96,96,9,14,28,11,1, + 0,96,0,54,0,56,0,76,0,62,0,127,0,99,0,193, + 128,193,128,193,128,193,128,99,0,127,0,62,0,8,14,14, + 10,1,0,50,90,76,0,222,255,227,195,195,195,195,195,195, + 195,9,14,28,11,1,0,48,0,24,0,12,0,0,0,62, + 0,127,0,99,0,193,128,193,128,193,128,193,128,99,0,127, + 0,62,0,9,14,28,11,1,0,6,0,12,0,24,0,0, + 0,62,0,127,0,99,0,193,128,193,128,193,128,193,128,99, + 0,127,0,62,0,9,14,28,11,1,0,24,0,60,0,102, + 0,0,0,62,0,127,0,99,0,193,128,193,128,193,128,193, + 128,99,0,127,0,62,0,9,14,28,11,1,0,50,0,90, + 0,76,0,0,0,62,0,127,0,99,0,193,128,193,128,193, + 128,193,128,99,0,127,0,62,0,9,14,28,11,1,0,51, + 0,51,0,0,0,0,0,62,0,127,0,99,0,193,128,193, + 128,193,128,193,128,99,0,127,0,62,0,8,8,8,10,1, + 1,24,24,0,255,255,0,24,24,11,10,20,11,0,0,14, + 96,63,192,49,128,99,192,102,192,108,192,120,192,49,128,127, + 128,206,0,8,14,14,10,1,0,48,24,12,0,195,195,195, + 195,195,195,195,199,255,123,8,14,14,10,1,0,6,12,24, + 0,195,195,195,195,195,195,195,199,255,123,8,14,14,10,1, + 0,24,60,102,0,195,195,195,195,195,195,195,199,255,123,8, + 14,14,10,1,0,102,102,0,0,195,195,195,195,195,195,195, + 199,255,123,8,18,18,10,1,252,6,12,24,0,195,195,195, + 102,102,102,36,60,24,24,24,24,112,112,9,18,36,11,1, + 252,192,0,192,0,192,0,192,0,222,0,255,0,227,0,193, + 128,193,128,193,128,193,128,227,0,255,0,222,0,192,0,192, + 0,192,0,192,0,8,18,18,10,1,252,102,102,0,0,195, + 195,195,102,102,102,36,60,24,24,24,24,112,112 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp new file mode 100644 index 000000000000..bb5f6ccf40f8 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp @@ -0,0 +1,492 @@ +/* + Fontname: -Adobe-Helvetica-Medium-R-Normal--25-180-100-100-P-130-ISO10646-1 + Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. + Capital A Height: 19, '1' Height: 18 + Calculated Max Values w=22 h=24 x= 3 y=16 dx=25 dy= 0 ascent=24 len=69 + Font Bounding box w=28 h=37 x=-3 y=-8 + Calculated Min Values x=-1 y=-5 dx= 0 dy= 0 + Pure Font ascent =19 descent=-5 + X Font ascent =19 descent=-5 + Max Font ascent =24 descent=-5 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +extern const uint8_t Helvetica18_symbols[71] = { + 0,28,37,253,248,19,4,37,9,49,1,9,251,24,251,19,251, // tFont + 0,0,0,0,0,0, // 0x01 - LCD_STR_REFRESH + 0,0,0,0,0,0, // 0x02 - LCD_STR_FOLDER + 255, // 0x03 - LCD_STR_ARROW_RIGHT + 255, // 0x04 - LCD_STR_UPLEVEL + 255, // 0x05 - LCD_STR_CLOCK + 255, // 0x06 - LCD_STR_FEEDRATE + 255, // 0x07 - LCD_STR_BEDTEMP + 7,18,18,8,0,1, 0,56, 68,68,68,68,68,84,84,84,84,84, 214,186,186,186,198,124, // 0x08 - LCD_STR_THERMOMETER + 7,7,7,7,0,15,56,124,198,198,198,124,56, // 0x09 - LCD_STR_DEGREE +}; + +extern const uint8_t Helvetica18[7307] = { + 0,28,37,253,248,19,4,37,9,49,32,255,251,24,251,19,251, // tFont + 0,0,0,6,0,1,2,19,19,6,2,0,192,192,192, + 192,192,192,192,192,192,192,192,192,128,128,0,0,192,192,192, + 6,6,6,8,1,13,204,204,204,204,204,68,11,17,34,14, + 2,0,12,192,12,192,12,192,25,128,255,224,255,224,25,128, + 25,128,51,0,51,0,255,224,255,224,51,0,51,0,102,0, + 102,0,102,0,11,22,44,13,1,254,6,0,6,0,31,128, + 63,192,118,224,102,96,102,96,102,0,118,0,62,0,62,0, + 15,128,7,192,6,224,6,96,198,96,198,96,230,224,127,192, + 63,128,6,0,6,0,19,18,54,22,1,0,0,6,0,60, + 12,0,126,12,0,195,24,0,195,24,0,195,48,0,195,48, + 0,126,96,0,60,96,0,0,192,0,0,199,128,1,143,192, + 1,152,96,3,24,96,3,24,96,6,24,96,6,15,192,4, + 7,128,14,18,36,17,2,0,15,0,31,128,57,192,48,192, + 48,192,48,192,25,128,15,0,30,0,63,24,115,152,97,216, + 192,240,192,96,192,240,225,216,127,156,30,0,2,6,6,6, + 2,13,192,192,192,192,192,64,5,24,24,8,2,251,24,24, + 48,48,96,96,96,192,192,192,192,192,192,192,192,192,192,96, + 96,96,48,48,24,24,5,24,24,8,1,251,192,192,96,96, + 48,48,48,24,24,24,24,24,24,24,24,24,24,48,48,48, + 96,96,192,192,7,7,7,10,1,12,16,16,214,124,56,108, + 68,12,12,24,14,1,1,6,0,6,0,6,0,6,0,6, + 0,255,240,255,240,6,0,6,0,6,0,6,0,6,0,2, + 6,6,6,2,253,192,192,192,64,64,128,6,2,2,8,1, + 6,252,252,2,3,3,6,2,0,192,192,192,7,19,19,7, + 0,0,6,4,12,12,8,24,24,16,16,48,48,32,96,96, + 64,192,192,128,128,11,18,36,13,1,0,31,0,63,128,113, + 192,96,192,96,192,224,224,192,96,192,96,192,96,192,96,192, + 96,192,96,224,224,96,192,96,192,113,192,63,128,31,0,6, + 18,18,13,2,0,12,12,28,252,252,12,12,12,12,12,12, + 12,12,12,12,12,12,12,11,18,36,13,1,0,30,0,127, + 128,97,192,192,192,192,96,192,96,0,224,0,192,1,192,3, + 128,15,0,28,0,56,0,112,0,224,0,192,0,255,224,255, + 224,11,18,36,13,1,0,31,0,127,128,97,128,192,192,192, + 192,192,192,0,192,1,128,15,0,15,192,0,192,0,96,0, + 96,192,96,192,192,97,192,127,128,31,0,11,18,36,13,1, + 0,1,128,3,128,3,128,7,128,15,128,13,128,25,128,57, + 128,49,128,97,128,225,128,193,128,255,224,255,224,1,128,1, + 128,1,128,1,128,11,18,36,13,1,0,127,192,127,192,96, + 0,96,0,96,0,96,0,126,0,127,128,113,192,0,192,0, + 224,0,96,0,96,192,224,192,192,225,192,127,128,30,0,11, + 18,36,13,1,0,15,0,63,192,112,192,96,96,224,96,192, + 0,192,0,207,0,223,128,241,192,224,192,192,96,192,96,192, + 96,224,224,113,192,127,192,31,0,11,18,36,13,1,0,255, + 224,255,224,0,224,0,192,1,128,1,128,3,0,3,0,6, + 0,6,0,12,0,12,0,28,0,24,0,24,0,56,0,48, + 0,48,0,11,18,36,13,1,0,14,0,63,128,49,128,96, + 192,96,192,96,192,49,128,31,0,63,128,113,192,96,192,192, + 96,192,96,192,96,192,96,96,192,127,192,31,0,11,18,36, + 13,1,0,31,0,127,192,113,192,224,192,192,96,192,96,192, + 96,192,96,224,224,113,224,127,96,30,96,0,96,0,224,192, + 192,225,192,127,128,30,0,2,14,14,6,2,0,192,192,192, + 0,0,0,0,0,0,0,0,192,192,192,2,17,17,6,2, + 253,192,192,192,0,0,0,0,0,0,0,0,192,192,192,64, + 64,128,12,12,24,15,1,1,0,48,0,240,3,192,15,0, + 60,0,224,0,224,0,60,0,15,0,3,192,0,240,0,48, + 10,5,10,15,2,5,255,192,255,192,0,0,255,192,255,192, + 12,12,24,15,1,1,192,0,240,0,60,0,15,0,3,192, + 0,112,0,112,3,192,15,0,60,0,240,0,192,0,10,19, + 38,12,1,0,31,0,127,128,113,192,224,192,192,192,193,192, + 1,128,3,128,7,0,6,0,12,0,12,0,12,0,12,0, + 0,0,0,0,12,0,12,0,12,0,22,23,69,25,2,252, + 0,255,0,3,255,192,15,1,224,28,0,112,56,0,24,48, + 0,24,96,115,12,96,251,12,193,199,12,195,134,12,195,6, + 12,198,6,12,198,12,28,198,12,24,198,12,56,231,28,112, + 99,247,224,113,227,128,56,0,0,28,0,0,15,3,0,7, + 255,0,0,252,0,15,19,38,17,1,0,3,128,3,128,6, + 192,6,192,12,64,12,96,12,96,24,48,24,48,24,48,48, + 24,63,248,63,248,96,12,96,12,96,12,192,6,192,6,192, + 6,14,19,38,17,2,0,255,192,255,240,192,112,192,24,192, + 24,192,24,192,24,192,48,255,224,255,240,192,24,192,12,192, + 12,192,12,192,12,192,28,192,120,255,240,255,192,15,19,38, + 18,1,0,7,224,31,248,60,60,112,14,96,6,224,6,192, + 0,192,0,192,0,192,0,192,0,192,0,192,0,224,6,96, + 6,112,14,60,60,31,248,7,224,15,19,38,18,2,0,255, + 192,255,240,192,120,192,28,192,12,192,14,192,6,192,6,192, + 6,192,6,192,6,192,6,192,6,192,14,192,12,192,28,192, + 120,255,240,255,192,12,19,38,16,2,0,255,240,255,240,192, + 0,192,0,192,0,192,0,192,0,192,0,255,224,255,224,192, + 0,192,0,192,0,192,0,192,0,192,0,192,0,255,240,255, + 240,11,19,38,14,2,0,255,224,255,224,192,0,192,0,192, + 0,192,0,192,0,192,0,255,192,255,192,192,0,192,0,192, + 0,192,0,192,0,192,0,192,0,192,0,192,0,16,19,38, + 19,1,0,7,224,31,248,60,60,112,14,96,6,224,6,192, + 0,192,0,192,0,192,127,192,127,192,3,192,3,224,3,96, + 7,112,15,60,63,31,251,7,227,14,19,38,18,2,0,192, + 12,192,12,192,12,192,12,192,12,192,12,192,12,192,12,255, + 252,255,252,192,12,192,12,192,12,192,12,192,12,192,12,192, + 12,192,12,192,12,2,19,19,8,3,0,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,10,19, + 38,13,1,0,0,192,0,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,192,0,192,0,192,0,192,192,192,192,192, + 192,192,192,192,97,128,127,128,63,0,13,19,38,18,3,0, + 192,56,192,112,192,224,193,192,195,128,199,0,206,0,220,0, + 252,0,254,0,231,0,195,128,193,128,193,192,192,224,192,96, + 192,112,192,56,192,24,11,19,38,14,2,0,192,0,192,0, + 192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0, + 192,0,192,0,192,0,192,0,192,0,192,0,192,0,255,224, + 255,224,17,19,57,21,2,0,192,1,128,224,3,128,224,3, + 128,240,7,128,240,7,128,216,13,128,216,13,128,216,13,128, + 204,25,128,204,25,128,204,25,128,198,49,128,198,49,128,198, + 49,128,195,97,128,195,97,128,195,97,128,193,193,128,193,193, + 128,14,19,38,18,2,0,224,12,240,12,240,12,216,12,220, + 12,204,12,206,12,198,12,199,12,195,12,195,140,193,140,193, + 204,192,204,192,236,192,108,192,60,192,60,192,28,16,19,38, + 18,1,0,7,224,31,248,60,60,112,14,96,6,224,7,192, + 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, + 6,112,14,60,60,31,248,7,224,13,19,38,16,2,0,255, + 224,255,240,192,48,192,24,192,24,192,24,192,24,192,48,255, + 240,255,224,192,0,192,0,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,16,19,38,18,1,0,7,224,31,248,60, + 60,112,14,96,6,224,7,192,3,192,3,192,3,192,3,192, + 3,192,3,192,3,224,7,96,230,112,126,60,28,31,254,7, + 231,13,19,38,17,2,0,255,224,255,240,192,48,192,24,192, + 24,192,24,192,24,192,48,255,240,255,224,192,112,192,48,192, + 24,192,24,192,24,192,24,192,24,192,24,192,24,13,19,38, + 16,2,0,15,128,63,224,96,96,192,48,192,48,192,0,224, + 0,124,0,63,128,7,224,0,240,0,56,0,24,0,24,192, + 24,192,56,240,112,127,224,31,128,14,19,38,16,1,0,255, + 252,255,252,3,0,3,0,3,0,3,0,3,0,3,0,3, + 0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3, + 0,3,0,3,0,14,19,38,18,2,0,192,12,192,12,192, + 12,192,12,192,12,192,12,192,12,192,12,192,12,192,12,192, + 12,192,12,192,12,192,12,192,12,96,24,112,56,63,240,15, + 192,15,19,38,17,1,0,192,6,192,6,224,14,96,12,112, + 28,48,24,48,24,56,56,24,48,24,48,28,112,12,96,12, + 96,14,224,6,192,6,192,3,128,3,128,3,128,20,19,57, + 22,1,0,192,96,48,192,96,48,192,96,48,192,240,48,96, + 240,96,97,152,96,97,152,96,97,152,96,97,152,96,49,152, + 192,51,12,192,51,12,192,51,12,192,27,13,128,27,13,128, + 30,7,128,14,7,0,12,3,0,12,3,0,15,19,38,17, + 1,0,192,6,224,14,112,28,48,24,24,48,28,112,14,224, + 7,192,3,128,3,128,7,192,14,224,12,96,28,112,56,56, + 48,24,96,12,224,14,192,6,14,19,38,16,1,0,192,12, + 224,28,96,24,112,56,48,48,56,112,24,96,28,224,12,192, + 15,192,7,128,7,128,3,0,3,0,3,0,3,0,3,0, + 3,0,3,0,13,19,38,15,1,0,255,248,255,248,0,56, + 0,112,0,224,1,192,1,192,3,128,7,0,7,0,14,0, + 28,0,28,0,56,0,112,0,112,0,224,0,255,248,255,248, + 4,24,24,7,2,251,240,240,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,240,240,8,19, + 19,7,0,0,192,64,64,96,32,32,48,16,16,16,24,8, + 8,12,4,4,6,2,3,4,24,24,7,1,251,240,240,48, + 48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,48,240,240,10,9,18,12,1,10,12,0,12,0,30, + 0,18,0,51,0,97,128,97,128,192,192,192,192,14,2,4, + 14,0,251,255,252,255,252,5,4,4,7,1,15,192,96,48, + 24,11,14,28,13,1,0,31,0,63,128,97,192,96,192,0, + 192,7,192,63,192,120,192,224,192,192,192,193,192,227,192,126, + 224,60,96,11,19,38,14,2,0,192,0,192,0,192,0,192, + 0,192,0,207,0,223,128,241,192,224,192,192,224,192,96,192, + 96,192,96,192,96,192,224,224,192,241,192,223,128,207,0,10, + 14,28,12,1,0,31,0,63,128,113,192,96,192,224,0,192, + 0,192,0,192,0,192,0,224,0,96,192,113,192,63,128,31, + 0,11,19,38,14,1,0,0,96,0,96,0,96,0,96,0, + 96,30,96,63,96,113,224,96,224,224,96,192,96,192,96,192, + 96,192,96,224,96,96,224,113,224,63,96,30,96,11,14,28, + 13,1,0,14,0,63,128,113,192,96,192,192,96,192,96,255, + 224,255,224,192,0,192,0,96,96,112,224,63,192,15,0,6, + 19,19,8,1,0,28,60,48,48,48,252,252,48,48,48,48, + 48,48,48,48,48,48,48,48,11,19,38,14,1,251,30,96, + 63,96,113,224,96,224,224,96,192,96,192,96,192,96,192,96, + 224,96,96,224,113,224,63,96,30,96,0,96,192,96,224,192, + 127,192,31,0,10,19,38,13,2,0,192,0,192,0,192,0, + 192,0,192,0,206,0,223,128,241,128,224,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 2,19,19,6,2,0,192,192,192,0,0,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,4,24,24,6,0,251,48, + 48,48,0,0,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,48,48,48,240,224,10,19,38,12,2,0,192,0,192, + 0,192,0,192,0,192,0,193,128,195,128,199,0,206,0,220, + 0,248,0,252,0,206,0,198,0,199,0,195,128,193,128,193, + 192,192,192,2,19,19,6,2,0,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,16,14,28,20, + 2,0,206,60,255,126,227,199,193,131,193,131,193,131,193,131, + 193,131,193,131,193,131,193,131,193,131,193,131,193,131,10,14, + 28,14,2,0,206,0,223,128,241,128,224,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 11,14,28,13,1,0,31,0,63,128,113,192,96,192,224,224, + 192,96,192,96,192,96,192,96,224,224,96,192,113,192,63,128, + 31,0,11,19,38,14,2,251,207,0,223,128,241,192,224,192, + 192,224,192,96,192,96,192,96,192,96,192,224,224,192,241,192, + 223,128,207,0,192,0,192,0,192,0,192,0,192,0,11,19, + 38,14,1,251,30,96,63,96,113,224,96,224,224,96,192,96, + 192,96,192,96,192,96,224,96,96,224,113,224,63,96,30,96, + 0,96,0,96,0,96,0,96,0,96,6,14,14,9,2,0, + 204,220,248,240,224,192,192,192,192,192,192,192,192,192,10,14, + 28,12,1,0,63,0,127,128,225,192,192,192,192,0,248,0, + 127,0,15,128,1,192,192,192,192,192,225,192,127,128,63,0, + 6,18,18,8,1,0,48,48,48,48,252,252,48,48,48,48, + 48,48,48,48,48,48,60,28,10,14,28,14,2,0,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,193,192,99,192,126,192,28,192,11,14,28,13,1,0, + 192,96,192,96,192,96,96,192,96,192,113,192,49,128,49,128, + 27,0,27,0,27,0,14,0,14,0,14,0,18,14,42,18, + 0,0,192,192,192,192,192,192,97,225,128,97,225,128,97,225, + 128,49,35,0,51,51,0,51,51,0,27,54,0,26,22,0, + 30,30,0,14,28,0,12,12,0,12,12,0,10,14,28,12, + 1,0,192,192,225,192,97,128,51,0,30,0,30,0,12,0, + 30,0,30,0,51,0,115,128,97,128,192,192,192,192,12,19, + 38,13,0,251,192,48,192,48,96,48,112,96,48,96,56,224, + 24,192,24,192,13,128,13,128,7,128,7,0,3,0,3,0, + 6,0,6,0,12,0,60,0,56,0,10,14,28,12,1,0, + 255,192,255,192,1,128,3,0,7,0,14,0,12,0,28,0, + 56,0,48,0,96,0,224,0,255,192,255,192,6,24,24,8, + 1,251,12,24,48,48,48,48,48,48,48,48,96,192,192,96, + 48,48,48,48,48,48,48,48,24,12,1,24,24,6,2,251, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 128,128,128,128,128,128,128,128,6,24,24,8,1,251,192,96, + 48,48,48,48,48,48,48,48,24,12,12,24,48,48,48,48, + 48,48,48,48,96,192,10,4,8,14,2,5,112,192,252,192, + 207,192,195,128,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,0,0,0,6,0,1,2,19,19,6,2, + 251,192,192,192,0,0,64,64,192,192,192,192,192,192,192,192, + 192,192,192,192,10,18,36,13,1,254,1,128,1,128,31,0, + 63,128,115,192,102,192,198,0,204,0,204,0,204,0,216,0, + 216,0,216,192,113,192,127,128,63,0,96,0,96,0,12,18, + 36,14,1,0,31,128,63,224,112,112,96,48,96,0,112,0, + 48,0,24,0,255,128,255,128,24,0,24,0,24,0,48,0, + 48,0,103,48,255,240,240,224,11,12,24,13,1,3,192,96, + 238,224,127,192,49,128,96,192,96,192,96,192,96,192,49,128, + 127,192,238,224,192,96,14,18,36,14,0,0,224,28,96,24, + 112,56,48,48,56,112,24,96,28,224,12,192,63,240,63,240, + 3,0,63,240,63,240,3,0,3,0,3,0,3,0,3,0, + 2,24,24,6,2,251,192,192,192,192,192,192,192,192,192,192, + 0,0,0,0,192,192,192,192,192,192,192,192,192,192,11,24, + 48,13,1,251,31,0,63,128,113,192,96,192,112,192,56,0, + 28,0,126,0,231,0,195,128,193,192,192,192,96,96,112,96, + 56,96,28,192,15,128,7,0,3,128,97,192,96,192,113,192, + 63,128,31,0,6,2,2,8,1,16,204,204,19,19,57,19, + 1,0,3,248,0,14,14,0,48,1,128,96,0,192,65,240, + 64,195,24,96,134,12,32,132,0,32,132,0,32,132,0,32, + 132,0,32,134,12,32,195,24,96,65,240,64,96,0,192,48, + 1,128,24,3,0,14,14,0,3,248,0,7,12,12,9,1, + 7,120,204,204,28,108,204,204,220,118,0,254,254,9,8,16, + 14,2,3,25,128,51,0,102,0,204,0,204,0,102,0,51, + 0,25,128,13,8,16,15,1,2,255,248,255,248,0,24,0, + 24,0,24,0,24,0,24,0,24,6,2,2,8,1,6,252, + 252,18,19,57,19,1,0,7,248,0,28,14,0,48,3,0, + 96,1,128,67,240,128,194,24,192,130,8,64,130,8,64,130, + 8,64,130,16,64,131,240,64,130,32,64,130,16,64,194,16, + 192,66,8,128,96,1,128,48,3,0,28,14,0,7,248,0, + 6,2,2,8,1,16,252,252,8,7,7,9,0,11,60,102, + 195,195,195,102,60,12,13,26,14,1,0,6,0,6,0,6, + 0,6,0,255,240,255,240,6,0,6,0,6,0,6,0,0, + 0,255,240,255,240,7,10,10,7,0,8,60,126,198,6,12, + 24,48,96,254,254,7,10,10,7,0,8,124,254,198,6,60, + 60,6,198,254,124,5,4,4,7,1,15,24,48,96,192,10, + 19,38,14,2,251,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,193,192,227,192,254,192,220, + 192,192,0,192,0,192,0,192,0,192,0,10,24,48,12,1, + 251,31,192,127,192,125,128,253,128,253,128,253,128,253,128,253, + 128,253,128,125,128,125,128,61,128,13,128,13,128,13,128,13, + 128,13,128,13,128,13,128,13,128,13,128,13,128,13,128,13, + 128,2,3,3,6,2,6,192,192,192,5,6,6,7,1,251, + 96,112,24,24,248,112,4,10,10,7,0,8,48,48,240,240, + 48,48,48,48,48,48,7,12,12,9,1,7,56,108,198,198, + 198,198,198,108,56,0,254,254,9,8,16,14,3,3,204,0, + 102,0,51,0,25,128,25,128,51,0,102,0,204,0,18,18, + 54,19,1,0,48,24,0,48,24,0,240,48,0,240,48,0, + 48,96,0,48,96,0,48,192,0,48,192,0,49,131,0,49, + 135,0,3,15,0,3,15,0,6,27,0,6,51,0,12,127, + 192,12,127,192,24,3,0,24,3,0,18,18,54,19,1,0, + 48,24,0,48,24,0,240,48,0,240,48,0,48,96,0,48, + 96,0,48,192,0,48,192,0,49,135,128,49,143,192,3,24, + 192,3,0,192,6,1,128,6,3,0,12,6,0,12,12,0, + 24,31,192,24,31,192,19,18,54,19,0,0,124,12,0,254, + 12,0,198,24,0,6,24,0,60,48,0,60,48,0,6,96, + 0,198,96,0,254,193,128,124,195,128,1,135,128,1,135,128, + 3,13,128,3,25,128,6,63,224,6,63,224,12,1,128,12, + 1,128,10,19,38,12,1,251,12,0,12,0,12,0,0,0, + 0,0,12,0,12,0,12,0,12,0,24,0,56,0,112,0, + 96,0,224,192,192,192,193,192,227,128,127,128,62,0,15,24, + 48,17,1,0,12,0,6,0,3,0,1,128,0,0,3,128, + 3,128,6,192,6,192,12,64,12,96,12,96,24,48,24,48, + 24,48,48,24,63,248,63,248,96,12,96,12,96,12,192,6, + 192,6,192,6,15,24,48,17,1,0,0,96,0,192,1,128, + 3,0,0,0,3,128,3,128,6,192,6,192,12,64,12,96, + 12,96,24,48,24,48,24,48,48,24,63,248,63,248,96,12, + 96,12,96,12,192,6,192,6,192,6,15,24,48,17,1,0, + 1,128,3,192,6,96,12,48,0,0,3,128,3,128,6,192, + 6,192,12,64,12,96,12,96,24,48,24,48,24,48,48,24, + 63,248,63,248,96,12,96,12,96,12,192,6,192,6,192,6, + 15,23,46,17,1,0,7,16,13,176,8,224,0,0,3,128, + 3,128,6,192,6,192,12,64,12,96,12,96,24,48,24,48, + 24,48,48,24,63,248,63,248,96,12,96,12,96,12,192,6, + 192,6,192,6,15,23,46,17,1,0,12,96,12,96,0,0, + 0,0,3,128,3,128,6,192,6,192,12,64,12,96,12,96, + 24,48,24,48,24,48,48,24,63,248,63,248,96,12,96,12, + 96,12,192,6,192,6,192,6,15,24,48,17,1,0,3,128, + 4,64,4,64,3,128,0,0,3,128,3,128,6,192,6,192, + 12,64,12,96,12,96,24,48,24,48,24,48,48,24,63,248, + 63,248,96,12,96,12,96,12,192,6,192,6,192,6,21,19, + 57,23,1,0,3,255,248,3,255,248,6,96,0,6,96,0, + 12,96,0,12,96,0,12,96,0,24,96,0,24,127,248,24, + 127,248,48,96,0,63,224,0,63,224,0,96,96,0,96,96, + 0,96,96,0,192,96,0,192,127,248,192,127,248,15,24,48, + 18,1,251,7,224,31,248,60,60,112,14,96,6,224,6,192, + 0,192,0,192,0,192,0,192,0,192,0,192,0,224,6,96, + 6,112,14,60,60,31,248,7,224,1,128,0,192,0,192,7, + 192,3,128,12,24,48,16,2,0,48,0,24,0,12,0,6, + 0,0,0,255,240,255,240,192,0,192,0,192,0,192,0,192, + 0,192,0,255,224,255,224,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,255,240,255,240,12,24,48,16,2,0,1, + 128,3,0,6,0,12,0,0,0,255,240,255,240,192,0,192, + 0,192,0,192,0,192,0,192,0,255,224,255,224,192,0,192, + 0,192,0,192,0,192,0,192,0,192,0,255,240,255,240,12, + 24,48,16,2,0,6,0,15,0,25,128,48,192,0,0,255, + 240,255,240,192,0,192,0,192,0,192,0,192,0,192,0,255, + 224,255,224,192,0,192,0,192,0,192,0,192,0,192,0,192, + 0,255,240,255,240,12,23,46,16,2,0,24,192,24,192,0, + 0,0,0,255,240,255,240,192,0,192,0,192,0,192,0,192, + 0,192,0,255,224,255,224,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,255,240,255,240,5,24,24,8,1,0,192, + 96,48,24,0,48,48,48,48,48,48,48,48,48,48,48,48, + 48,48,48,48,48,48,48,5,24,24,8,2,0,24,48,96, + 192,0,96,96,96,96,96,96,96,96,96,96,96,96,96,96, + 96,96,96,96,96,8,24,24,8,0,0,24,60,102,195,0, + 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24, + 24,24,24,6,23,23,8,1,0,204,204,0,0,48,48,48, + 48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48, + 18,19,57,18,255,0,31,248,0,31,254,0,24,15,0,24, + 3,128,24,1,128,24,1,192,24,0,192,24,0,192,255,128, + 192,255,128,192,24,0,192,24,0,192,24,0,192,24,1,192, + 24,1,128,24,3,128,24,15,0,31,254,0,31,248,0,14, + 23,46,18,2,0,14,32,27,96,17,192,0,0,224,12,240, + 12,240,12,216,12,220,12,204,12,206,12,198,12,199,12,195, + 12,195,140,193,140,193,204,192,204,192,236,192,108,192,60,192, + 60,192,28,16,24,48,18,1,0,12,0,6,0,3,0,1, + 128,0,0,7,224,31,248,60,60,112,14,96,6,224,7,192, + 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, + 6,112,14,60,60,31,248,7,224,16,24,48,18,1,0,0, + 48,0,96,0,192,1,128,0,0,7,224,31,248,60,60,112, + 14,96,6,224,7,192,3,192,3,192,3,192,3,192,3,192, + 3,192,3,224,7,96,6,112,14,60,60,31,248,7,224,16, + 24,48,18,1,0,0,192,1,224,3,48,6,24,0,0,7, + 224,31,248,60,60,112,14,96,6,224,7,192,3,192,3,192, + 3,192,3,192,3,192,3,192,3,224,7,96,6,112,14,60, + 60,31,248,7,224,16,23,46,18,1,0,3,136,6,216,4, + 112,0,0,7,224,31,248,60,60,112,14,96,6,224,7,192, + 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, + 6,112,14,60,60,31,248,7,224,16,23,46,18,1,0,6, + 48,6,48,0,0,0,0,7,224,31,248,60,60,112,14,96, + 6,224,7,192,3,192,3,192,3,192,3,192,3,192,3,192, + 3,224,7,96,6,112,14,60,60,31,248,7,224,13,12,24, + 14,0,1,192,24,96,48,48,96,24,192,13,128,7,0,7, + 0,13,128,24,192,48,96,96,48,192,24,18,19,57,18,0, + 0,3,240,192,15,253,192,30,31,128,56,7,0,48,15,0, + 112,29,128,96,57,128,96,113,128,96,225,128,97,193,128,99, + 129,128,103,1,128,110,1,128,124,3,128,56,3,0,56,7, + 0,126,30,0,239,252,0,195,240,0,14,24,48,18,2,0, + 24,0,12,0,6,0,3,0,0,0,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,96,24,112,56,63,240,15,192, + 14,24,48,18,2,0,0,96,0,192,1,128,3,0,0,0, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,96,24, + 112,56,63,240,15,192,14,24,48,18,2,0,3,0,7,128, + 12,192,24,96,0,0,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,96,24,112,56,63,240,15,192,14,23,46,18, + 2,0,24,192,24,192,0,0,0,0,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, + 192,12,192,12,192,12,192,12,96,24,112,56,63,240,15,192, + 14,24,48,16,1,0,0,96,0,192,1,128,3,0,0,0, + 192,12,224,28,96,24,112,56,48,48,56,112,24,96,28,224, + 12,192,15,192,7,128,7,128,3,0,3,0,3,0,3,0, + 3,0,3,0,3,0,13,19,38,16,2,0,192,0,192,0, + 192,0,192,0,255,224,255,240,192,48,192,24,192,24,192,24, + 192,24,192,48,255,240,255,224,192,0,192,0,192,0,192,0, + 192,0,10,19,38,15,3,0,28,0,127,0,227,0,193,128, + 193,128,193,128,195,0,199,0,206,0,207,0,195,128,193,128, + 192,192,192,192,192,192,193,128,195,128,207,0,206,0,11,19, + 38,13,1,0,24,0,12,0,6,0,3,0,0,0,31,0, + 63,128,97,192,96,192,0,192,7,192,63,192,120,192,224,192, + 192,192,193,192,227,192,126,224,60,96,11,19,38,13,1,0, + 1,128,3,0,6,0,12,0,0,0,31,0,63,128,97,192, + 96,192,0,192,7,192,63,192,120,192,224,192,192,192,193,192, + 227,192,126,224,60,96,11,19,38,13,1,0,12,0,30,0, + 51,0,97,128,0,0,31,0,63,128,97,192,96,192,0,192, + 7,192,63,192,120,192,224,192,192,192,193,192,227,192,126,224, + 60,96,11,18,36,13,1,0,28,64,54,192,35,128,0,0, + 31,0,63,128,97,192,96,192,0,192,7,192,63,192,120,192, + 224,192,192,192,193,192,227,192,126,224,60,96,11,18,36,13, + 1,0,51,0,51,0,0,0,0,0,31,0,63,128,97,192, + 96,192,0,192,7,192,63,192,120,192,224,192,192,192,193,192, + 227,192,126,224,60,96,11,19,38,13,1,0,6,0,9,0, + 9,0,6,0,0,0,31,0,63,128,97,192,96,192,0,192, + 7,192,63,192,120,192,224,192,192,192,193,192,227,192,126,224, + 60,96,19,14,42,21,1,0,31,14,0,63,191,128,97,241, + 192,96,224,192,0,192,96,7,192,96,63,255,224,120,255,224, + 224,192,0,192,192,0,193,224,96,227,240,224,126,63,192,60, + 15,0,10,19,38,12,1,251,31,0,63,128,113,192,96,192, + 224,0,192,0,192,0,192,0,192,0,224,0,96,192,113,192, + 63,128,31,0,12,0,6,0,6,0,62,0,28,0,11,19, + 38,13,1,0,24,0,12,0,6,0,3,0,0,0,14,0, + 63,128,113,192,96,192,192,96,192,96,255,224,255,224,192,0, + 192,0,96,96,112,224,63,192,15,0,11,19,38,13,1,0, + 3,0,6,0,12,0,24,0,0,0,14,0,63,128,113,192, + 96,192,192,96,192,96,255,224,255,224,192,0,192,0,96,96, + 112,224,63,192,15,0,11,19,38,13,1,0,12,0,30,0, + 51,0,97,128,0,0,14,0,63,128,113,192,96,192,192,96, + 192,96,255,224,255,224,192,0,192,0,96,96,112,224,63,192, + 15,0,11,18,36,13,1,0,51,0,51,0,0,0,0,0, + 14,0,63,128,113,192,96,192,192,96,192,96,255,224,255,224, + 192,0,192,0,96,96,112,224,63,192,15,0,5,19,19,6, + 0,0,192,96,48,24,0,48,48,48,48,48,48,48,48,48, + 48,48,48,48,48,5,19,19,6,1,0,24,48,96,192,0, + 96,96,96,96,96,96,96,96,96,96,96,96,96,96,8,19, + 19,6,255,0,24,60,102,195,0,24,24,24,24,24,24,24, + 24,24,24,24,24,24,24,6,18,18,6,0,0,204,204,0, + 0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,11, + 19,38,13,1,0,96,0,57,128,14,0,30,0,99,0,31, + 128,63,128,113,192,96,192,224,224,192,96,192,96,192,96,192, + 96,224,224,96,192,113,192,63,128,31,0,10,18,36,14,2, + 0,56,128,109,128,71,0,0,0,206,0,223,128,241,128,224, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,11,19,38,13,1,0,24,0,12,0,6, + 0,3,0,0,0,31,0,63,128,113,192,96,192,224,224,192, + 96,192,96,192,96,192,96,224,224,96,192,113,192,63,128,31, + 0,11,19,38,13,1,0,3,0,6,0,12,0,24,0,0, + 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,192, + 96,192,96,224,224,96,192,113,192,63,128,31,0,11,19,38, + 13,1,0,12,0,30,0,51,0,97,128,0,0,31,0,63, + 128,113,192,96,192,224,224,192,96,192,96,192,96,192,96,224, + 224,96,192,113,192,63,128,31,0,11,18,36,13,1,0,28, + 64,54,192,35,128,0,0,31,0,63,128,113,192,96,192,224, + 224,192,96,192,96,192,96,192,96,224,224,96,192,113,192,63, + 128,31,0,11,18,36,13,1,0,51,0,51,0,0,0,0, + 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,192, + 96,192,96,224,224,96,192,113,192,63,128,31,0,12,12,24, + 14,1,1,6,0,6,0,6,0,0,0,0,0,255,240,255, + 240,0,0,0,0,6,0,6,0,6,0,13,14,28,13,0, + 0,15,152,31,248,56,112,48,224,113,240,99,176,99,48,102, + 48,108,48,124,112,56,96,112,224,255,192,207,128,10,19,38, + 14,2,0,48,0,24,0,12,0,6,0,0,0,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,193,192,99,192,126,192,28,192,10,19,38,14,2,0,3, + 0,6,0,12,0,24,0,0,0,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,193,192,99, + 192,126,192,28,192,10,19,38,14,2,0,12,0,30,0,51, + 0,97,128,0,0,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,193,192,99,192,126,192,28, + 192,10,18,36,14,2,0,51,0,51,0,0,0,0,0,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,193,192,99,192,126,192,28,192,12,24,48,13,0, + 251,0,192,1,128,3,0,6,0,0,0,192,48,192,48,96, + 48,112,96,48,96,56,224,24,192,24,192,13,128,13,128,7, + 128,7,0,3,0,3,0,6,0,6,0,12,0,60,0,56, + 0,11,24,48,14,2,251,192,0,192,0,192,0,192,0,192, + 0,207,0,223,128,241,192,224,192,192,224,192,96,192,96,192, + 96,192,96,192,224,224,192,241,192,223,128,207,0,192,0,192, + 0,192,0,192,0,192,0,12,23,46,13,0,251,25,128,25, + 128,0,0,0,0,192,48,192,48,96,48,112,96,48,96,56, + 224,24,192,24,192,13,128,13,128,7,128,7,0,3,0,3, + 0,6,0,6,0,12,0,60,0,56,0 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/profont_22.cpp b/Marlin/src/lcd/tft/fontdata/profont_22.cpp new file mode 100644 index 000000000000..1d02ebb069b0 --- /dev/null +++ b/Marlin/src/lcd/tft/fontdata/profont_22.cpp @@ -0,0 +1,426 @@ +/* + Fontname: ProFont22 + Copyright: ProFont Distribution 2.2 Ñ Generated by Fontographer 4.1.5 + Capital A Height: 14, '1' Height: 14 + Calculated Max Values w=12 h=22 x= 6 y=12 dx=12 dy= 0 ascent=18 len=44 + Font Bounding box w=12 h=21 x= 0 y=-4 + Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 + Pure Font ascent =14 descent=-4 + X Font ascent =16 descent=-4 + Max Font ascent =18 descent=-4 +*/ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include + +extern const uint8_t ProFont22[6454] = { + 0,12,21,0,252,14,3,117,7,113,32,255,252,18,252,16, + 252,0,0,0,12,0,0,2,14,14,12,4,0,192,192,192, + 192,192,192,192,192,192,192,0,0,192,192,6,6,6,12,2, + 10,204,204,204,204,204,204,10,10,20,12,0,4,51,0,51, + 0,255,192,255,192,51,0,51,0,255,192,255,192,51,0,51, + 0,10,18,36,12,0,254,12,0,12,0,63,0,127,128,237, + 192,204,192,204,0,236,0,127,0,63,128,13,192,12,192,204, + 192,237,192,127,128,63,0,12,0,12,0,10,14,28,12,0, + 0,63,192,127,192,204,192,205,192,207,128,207,0,127,0,63, + 128,60,192,124,192,236,192,204,192,199,128,195,0,10,14,28, + 12,0,0,62,0,127,0,227,0,199,0,206,0,252,0,120, + 0,120,0,252,192,207,192,199,128,231,128,127,192,60,192,2, + 6,6,12,4,10,192,192,192,192,192,192,6,18,18,12,2, + 254,12,28,56,112,224,192,192,192,192,192,192,192,192,224,112, + 56,28,12,6,18,18,12,2,254,192,224,112,56,28,12,12, + 12,12,12,12,12,12,28,56,112,224,192,10,10,20,12,0, + 4,12,0,12,0,204,192,255,192,63,0,63,0,255,192,204, + 192,12,0,12,0,10,10,20,12,0,2,12,0,12,0,12, + 0,12,0,255,192,255,192,12,0,12,0,12,0,12,0,5, + 9,9,12,2,252,48,120,120,56,24,56,112,224,64,6,2, + 2,12,2,6,252,252,4,4,4,12,3,1,96,240,240,96, + 11,20,40,12,0,252,0,96,0,96,0,192,0,192,1,128, + 1,128,3,0,3,0,6,0,6,0,12,0,12,0,24,0, + 24,0,48,0,48,0,96,0,96,0,192,0,192,0,10,14, + 28,12,0,0,63,0,127,128,225,192,193,192,195,192,199,192, + 206,192,220,192,248,192,240,192,224,192,225,192,127,128,63,0, + 10,14,28,12,0,0,12,0,12,0,124,0,124,0,12,0, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,255,192, + 255,192,10,14,28,12,0,0,63,0,127,128,225,192,192,192, + 0,192,1,192,3,128,7,0,14,0,28,0,56,0,112,0, + 255,192,255,192,10,14,28,12,0,0,63,0,127,128,225,192, + 192,192,0,192,1,128,15,0,15,128,1,192,0,192,192,192, + 225,192,127,128,63,0,10,14,28,12,0,0,3,0,7,0, + 15,0,31,0,59,0,115,0,227,0,195,0,255,192,255,192, + 3,0,3,0,15,192,15,192,10,14,28,12,0,0,255,192, + 255,192,192,0,192,0,255,0,255,128,1,192,0,192,0,192, + 0,192,192,192,225,192,127,128,63,0,10,14,28,12,0,0, + 63,0,127,0,224,0,192,0,255,0,255,128,193,192,192,192, + 192,192,192,192,192,192,225,192,127,128,63,0,10,14,28,12, + 0,0,255,192,255,192,0,192,0,192,0,192,1,192,3,128, + 7,0,14,0,12,0,12,0,12,0,12,0,12,0,10,14, + 28,12,0,0,63,0,127,128,225,192,192,192,192,192,97,128, + 63,0,127,128,225,192,192,192,192,192,225,192,127,128,63,0, + 10,14,28,12,0,0,63,0,127,128,225,192,192,192,192,192, + 192,192,192,192,224,192,127,192,63,192,0,192,1,192,63,128, + 63,0,4,10,10,12,3,1,96,240,240,96,0,0,96,240, + 240,96,5,15,15,12,2,252,48,120,120,48,0,0,48,120, + 120,56,24,56,112,224,64,8,14,14,12,2,0,3,7,14, + 28,56,112,224,224,112,56,28,14,7,3,10,6,12,12,0, + 4,255,192,255,192,0,0,0,0,255,192,255,192,8,14,14, + 12,2,0,192,224,112,56,28,14,7,7,14,28,56,112,224, + 192,10,14,28,12,0,0,63,0,127,128,225,192,192,192,0, + 192,1,192,3,128,7,0,14,0,12,0,0,0,0,0,12, + 0,12,0,10,14,28,12,0,0,63,0,127,128,225,192,192, + 192,199,192,207,192,204,192,204,192,207,192,199,128,192,0,224, + 0,127,192,63,192,10,14,28,12,0,0,12,0,30,0,30, + 0,51,0,51,0,97,128,97,128,192,192,255,192,255,192,192, + 192,192,192,192,192,192,192,10,14,28,12,0,0,255,0,255, + 128,193,192,192,192,192,192,193,128,255,0,255,128,193,192,192, + 192,192,192,193,192,255,128,255,0,10,14,28,12,0,0,63, + 0,127,128,225,192,192,192,192,0,192,0,192,0,192,0,192, + 0,192,0,192,192,225,192,127,128,63,0,10,14,28,12,0, + 0,255,0,255,128,193,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,193,192,255,128,255,0,10,14,28, + 12,0,0,255,192,255,192,192,0,192,0,192,0,192,0,255, + 0,255,0,192,0,192,0,192,0,192,0,255,192,255,192,10, + 14,28,12,0,0,255,192,255,192,192,0,192,0,192,0,192, + 0,255,0,255,0,192,0,192,0,192,0,192,0,192,0,192, + 0,10,14,28,12,0,0,63,0,127,128,225,192,192,192,192, + 0,192,0,195,192,195,192,192,192,192,192,192,192,225,192,127, + 128,63,0,10,14,28,12,0,0,192,192,192,192,192,192,192, + 192,192,192,192,192,255,192,255,192,192,192,192,192,192,192,192, + 192,192,192,192,192,10,14,28,12,0,0,255,192,255,192,12, + 0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12, + 0,12,0,255,192,255,192,10,14,28,12,0,0,0,192,0, + 192,0,192,0,192,0,192,0,192,0,192,0,192,192,192,192, + 192,192,192,225,192,127,128,63,0,10,14,28,12,0,0,193, + 192,195,128,199,0,206,0,220,0,248,0,240,0,248,0,220, + 0,206,0,199,0,195,128,193,192,192,192,10,14,28,12,0, + 0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192, + 0,192,0,192,0,192,0,192,0,255,192,255,192,10,14,28, + 12,0,0,192,192,225,192,243,192,255,192,222,192,204,192,204, + 192,204,192,192,192,192,192,192,192,192,192,192,192,192,192,10, + 14,28,12,0,0,192,192,224,192,240,192,248,192,220,192,206, + 192,199,192,195,192,193,192,192,192,192,192,192,192,192,192,192, + 192,10,14,28,12,0,0,63,0,127,128,225,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,225,192,127, + 128,63,0,10,14,28,12,0,0,255,0,255,128,193,192,192, + 192,192,192,193,192,255,128,255,0,192,0,192,0,192,0,192, + 0,192,0,192,0,10,16,32,12,0,254,63,0,127,128,225, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,204, + 192,239,192,127,128,63,128,1,192,0,192,10,14,28,12,0, + 0,255,0,255,128,193,192,192,192,192,192,193,128,255,0,255, + 128,193,192,192,192,192,192,192,192,192,192,192,192,10,14,28, + 12,0,0,63,0,127,128,225,192,192,192,192,0,224,0,127, + 0,63,128,1,192,0,192,192,192,225,192,127,128,63,0,10, + 14,28,12,0,0,255,192,255,192,12,0,12,0,12,0,12, + 0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12, + 0,10,14,28,12,0,0,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,225,192,127, + 128,63,0,10,14,28,12,0,0,192,192,192,192,192,192,192, + 192,192,192,192,192,97,128,97,128,51,0,51,0,30,0,30, + 0,12,0,12,0,10,14,28,12,0,0,192,192,192,192,192, + 192,192,192,192,192,192,192,204,192,204,192,204,192,222,192,255, + 192,243,192,225,192,192,192,10,14,28,12,0,0,192,192,192, + 192,192,192,225,192,115,128,63,0,30,0,30,0,63,0,115, + 128,225,192,192,192,192,192,192,192,10,14,28,12,0,0,192, + 192,192,192,192,192,192,192,192,192,225,192,115,128,63,0,30, + 0,12,0,12,0,12,0,12,0,12,0,10,14,28,12,0, + 0,255,192,255,192,0,192,1,192,3,128,7,0,14,0,28, + 0,56,0,112,0,224,0,192,0,255,192,255,192,4,18,18, + 12,4,254,240,240,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,240,240,11,20,40,12,1,252,192,0,192,0,96, + 0,96,0,48,0,48,0,24,0,24,0,12,0,12,0,6, + 0,6,0,3,0,3,0,1,128,1,128,0,192,0,192,0, + 96,0,96,4,18,18,12,2,254,240,240,48,48,48,48,48, + 48,48,48,48,48,48,48,48,48,240,240,10,6,12,12,0, + 8,12,0,30,0,63,0,115,128,225,192,64,128,12,2,4, + 12,0,252,255,240,255,240,4,4,4,12,2,12,192,224,112, + 48,10,10,20,12,0,0,63,192,127,192,224,192,192,192,192, + 192,193,192,195,192,231,192,126,192,60,192,10,14,28,12,0, + 0,192,0,192,0,192,0,192,0,255,0,255,128,193,192,192, + 192,192,192,192,192,192,192,193,192,255,128,255,0,10,10,20, + 12,0,0,63,0,127,128,225,192,192,192,192,0,192,0,192, + 0,224,0,127,192,63,192,10,14,28,12,0,0,0,192,0, + 192,0,192,0,192,63,192,127,192,224,192,192,192,192,192,192, + 192,192,192,224,192,127,192,63,192,10,10,20,12,0,0,63, + 0,127,128,225,192,192,192,255,192,255,192,192,0,224,0,127, + 192,63,192,8,14,14,12,2,0,15,31,56,48,252,252,48, + 48,48,48,48,48,48,48,10,14,28,12,0,252,63,192,127, + 192,224,192,192,192,192,192,192,192,192,192,224,192,127,192,63, + 192,0,192,1,192,63,128,63,0,10,14,28,12,0,0,192, + 0,192,0,192,0,192,0,255,0,255,128,193,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,6,14,14,12,2, + 0,48,48,0,0,240,240,48,48,48,48,48,48,252,252,6, + 18,18,12,0,252,12,12,0,0,60,60,12,12,12,12,12, + 12,12,12,12,28,248,240,10,14,28,12,0,0,192,0,192, + 0,192,0,192,0,195,128,199,0,206,0,220,0,252,0,254, + 0,231,0,195,128,193,192,192,192,6,14,14,12,2,0,240, + 240,48,48,48,48,48,48,48,48,48,48,252,252,10,10,20, + 12,0,0,255,0,255,128,205,192,204,192,204,192,204,192,204, + 192,204,192,204,192,204,192,10,10,20,12,0,0,207,0,223, + 128,249,192,240,192,224,192,192,192,192,192,192,192,192,192,192, + 192,10,10,20,12,0,0,63,0,127,128,225,192,192,192,192, + 192,192,192,192,192,225,192,127,128,63,0,10,14,28,12,0, + 252,255,0,255,128,193,192,192,192,192,192,192,192,192,192,193, + 192,255,128,255,0,192,0,192,0,192,0,192,0,10,14,28, + 12,0,252,63,192,127,192,224,192,192,192,192,192,192,192,192, + 192,224,192,127,192,63,192,0,192,0,192,0,192,0,192,10, + 10,20,12,0,0,207,0,223,128,249,192,240,192,224,0,192, + 0,192,0,192,0,192,0,192,0,10,10,20,12,0,0,63, + 192,127,192,192,0,192,0,127,0,63,128,0,192,0,192,255, + 128,255,0,8,14,14,12,2,0,48,48,48,48,252,252,48, + 48,48,48,48,56,31,15,10,10,20,12,0,0,192,192,192, + 192,192,192,192,192,192,192,193,192,195,192,231,192,126,192,60, + 192,10,10,20,12,0,0,192,192,192,192,192,192,97,128,97, + 128,51,128,51,0,30,0,30,0,12,0,10,10,20,12,0, + 0,204,192,204,192,204,192,204,192,204,192,204,192,204,192,204, + 192,127,128,51,0,10,10,20,12,0,0,192,192,225,192,115, + 128,63,0,30,0,30,0,63,0,115,128,225,192,192,192,10, + 14,28,12,0,252,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,224,192,127,192,63,192,0,192,1,192,63,128,63, + 0,10,10,20,12,0,0,255,192,255,192,3,128,7,0,14, + 0,28,0,56,0,112,0,255,192,255,192,6,22,22,12,2, + 252,12,28,56,48,48,48,48,48,48,112,224,224,112,48,48, + 48,48,48,48,56,28,12,2,18,18,12,4,254,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,6, + 22,22,12,2,252,192,224,112,48,48,48,48,48,48,56,28, + 28,56,48,48,48,48,48,48,112,224,192,10,4,8,12,0, + 6,48,192,124,192,207,128,195,0,0,0,0,12,0,0,0, + 0,0,12,0,0,0,0,0,12,0,0,4,7,7,12,0, + 253,48,48,48,48,112,224,64,10,22,44,12,0,252,3,192, + 7,192,14,0,12,0,12,0,12,0,12,0,12,0,63,0, + 63,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,28,0,248,0,240,0,8,7,7,12,0,253, + 51,51,51,51,119,238,68,10,2,4,12,0,0,204,192,204, + 192,6,10,10,12,2,4,48,48,252,252,48,48,48,48,48, + 48,6,10,10,12,2,4,48,48,252,252,48,48,252,252,48, + 48,6,4,4,12,2,12,48,120,252,204,12,16,32,12,0, + 0,63,240,127,240,204,224,205,192,207,128,207,0,126,0,60, + 0,60,192,127,224,243,48,243,48,179,48,51,48,31,224,12, + 192,10,18,36,12,0,0,51,0,63,0,30,0,12,0,63, + 0,127,128,225,192,192,192,192,0,224,0,127,0,63,128,1, + 192,0,192,192,192,225,192,127,128,63,0,4,10,10,12,0, + 255,48,112,96,224,192,192,224,96,112,48,10,14,28,12,0, + 0,63,192,127,192,236,0,204,0,204,0,204,0,207,0,207, + 0,204,0,204,0,204,0,236,0,127,192,63,192,0,0,0, + 12,0,0,0,0,0,12,0,0,0,0,0,12,0,0,0, + 0,0,12,0,0,4,7,7,12,4,8,32,112,224,192,192, + 192,192,4,7,7,12,4,7,48,48,48,48,112,224,64,8, + 7,7,12,2,8,34,119,238,204,204,204,204,8,7,7,12, + 2,7,51,51,51,51,119,238,68,10,10,20,12,0,2,30, + 0,127,128,127,128,255,192,255,192,255,192,255,192,127,128,127, + 128,30,0,6,2,2,12,2,6,252,252,12,2,4,12,0, + 6,255,240,255,240,10,4,8,12,0,12,48,192,124,192,207, + 128,195,0,12,6,12,12,0,8,255,48,255,240,51,240,51, + 240,51,48,51,48,10,16,32,12,0,0,51,0,63,0,30, + 0,12,0,0,0,0,0,63,192,127,192,192,0,192,0,127, + 0,63,128,0,192,0,192,255,128,255,0,4,10,10,12,0, + 255,192,224,96,112,48,48,112,96,224,192,10,10,20,12,0, + 0,51,0,127,128,204,192,204,192,207,192,207,192,204,0,204, + 0,127,192,51,192,0,0,0,12,0,0,0,0,0,12,0, + 0,10,18,36,12,0,0,51,0,51,0,0,0,0,0,192, + 192,192,192,192,192,192,192,192,192,225,192,115,128,63,0,30, + 0,12,0,12,0,12,0,12,0,12,0,0,0,0,12,0, + 0,2,14,14,12,6,0,192,192,0,0,192,192,192,192,192, + 192,192,192,192,192,10,14,28,12,0,254,12,0,12,0,63, + 0,127,128,237,192,204,192,204,0,204,0,204,0,236,0,127, + 192,63,192,12,0,12,0,10,16,32,12,0,0,60,0,126, + 0,231,0,195,0,192,0,192,0,252,0,252,0,192,0,192, + 0,192,0,192,0,192,192,193,192,255,128,255,0,10,10,20, + 12,0,0,64,128,225,192,127,128,63,0,51,0,51,0,63, + 0,127,128,225,192,64,128,10,14,28,12,0,0,192,192,225, + 192,115,128,63,0,255,192,255,192,12,0,12,0,255,192,255, + 192,12,0,12,0,12,0,12,0,2,18,18,12,4,254,192, + 192,192,192,192,192,192,192,0,0,192,192,192,192,192,192,192, + 192,10,20,40,12,0,254,31,0,127,128,97,192,224,192,112, + 192,56,192,220,0,206,0,199,0,227,128,113,192,56,192,28, + 192,14,192,199,0,195,128,193,192,225,128,127,128,62,0,6, + 2,2,12,2,12,204,204,10,14,28,12,0,0,120,0,254, + 0,135,0,1,128,61,128,124,192,192,192,192,192,124,192,61, + 128,1,128,135,0,254,0,120,0,8,12,12,12,2,6,63, + 127,227,195,195,227,127,63,0,0,255,255,10,10,20,12,0, + 255,48,192,113,192,97,128,227,128,195,0,195,0,227,128,97, + 128,113,192,48,192,10,6,12,12,0,2,255,192,255,192,0, + 192,0,192,0,192,0,192,10,2,4,12,0,6,255,192,255, + 192,10,12,24,12,0,2,120,0,254,0,135,0,1,128,241, + 128,248,192,204,192,204,192,248,192,249,192,223,128,207,0,6, + 2,2,12,2,12,252,252,8,8,8,12,2,8,60,126,231, + 195,195,231,126,60,10,12,24,12,0,0,12,0,12,0,12, + 0,12,0,255,192,255,192,12,0,12,0,12,0,12,0,255, + 192,255,192,5,7,7,12,3,11,112,136,8,16,32,64,248, + 5,7,7,12,3,11,112,136,8,48,8,136,112,4,4,4, + 12,4,12,48,112,224,192,10,14,28,12,0,252,195,0,195, + 0,195,0,195,0,195,0,195,0,195,0,199,128,255,192,252, + 192,192,0,192,0,192,0,192,0,10,16,32,12,0,0,31, + 192,127,192,124,192,236,192,204,192,204,192,236,192,124,192,127, + 192,31,192,12,192,12,192,12,192,12,192,12,192,12,192,4, + 4,4,12,4,4,96,240,240,96,4,6,6,12,2,252,240, + 240,48,112,224,64,5,7,7,12,3,11,32,224,32,32,32, + 32,248,8,12,12,12,2,6,60,126,231,195,195,231,126,60, + 0,0,255,255,10,10,20,12,0,255,195,0,227,128,97,128, + 113,192,48,192,48,192,113,192,97,128,227,128,195,0,12,18, + 36,12,0,0,16,0,112,0,16,0,16,0,16,16,16,32, + 124,64,0,128,1,0,2,0,4,0,8,64,16,192,33,64, + 66,64,131,224,0,64,0,224,12,18,36,12,0,0,16,0, + 112,0,16,0,16,0,16,16,16,32,124,64,0,128,1,0, + 2,0,4,0,9,192,18,32,32,32,64,64,128,128,1,0, + 3,224,12,18,36,12,0,0,56,0,68,0,4,0,24,0, + 4,16,68,32,56,64,0,128,1,0,2,0,4,0,8,64, + 16,192,33,64,66,64,131,224,0,64,0,224,10,14,28,12, + 0,0,12,0,12,0,0,0,0,0,12,0,28,0,56,0, + 112,0,224,0,192,0,192,192,225,192,127,128,63,0,10,18, + 36,12,0,0,48,0,56,0,28,0,12,0,12,0,30,0, + 30,0,51,0,51,0,97,128,97,128,192,192,255,192,255,192, + 192,192,192,192,192,192,192,192,10,18,36,12,0,0,3,0, + 7,0,14,0,12,0,12,0,30,0,30,0,51,0,51,0, + 97,128,97,128,192,192,255,192,255,192,192,192,192,192,192,192, + 192,192,10,18,36,12,0,0,12,0,30,0,63,0,51,0, + 12,0,30,0,30,0,51,0,51,0,97,128,97,128,192,192, + 255,192,255,192,192,192,192,192,192,192,192,192,10,18,36,12, + 0,0,48,192,124,192,207,128,195,0,12,0,30,0,30,0, + 51,0,51,0,97,128,97,128,192,192,255,192,255,192,192,192, + 192,192,192,192,192,192,10,18,36,12,0,0,51,0,51,0, + 0,0,0,0,12,0,30,0,30,0,51,0,51,0,97,128, + 97,128,192,192,255,192,255,192,192,192,192,192,192,192,192,192, + 10,18,36,12,0,0,12,0,30,0,51,0,51,0,30,0, + 30,0,30,0,51,0,51,0,97,128,97,128,192,192,255,192, + 255,192,192,192,192,192,192,192,192,192,10,14,28,12,0,0, + 63,192,127,192,236,0,204,0,204,0,204,0,255,0,255,0, + 204,0,204,0,204,0,204,0,207,192,207,192,10,18,36,12, + 0,252,63,0,127,128,225,192,192,192,192,0,192,0,192,0, + 192,0,192,0,192,0,192,192,225,192,127,128,63,0,12,0, + 28,0,56,0,16,0,10,18,36,12,0,0,48,0,56,0, + 28,0,12,0,255,192,255,192,192,0,192,0,192,0,192,0, + 255,0,255,0,192,0,192,0,192,0,192,0,255,192,255,192, + 10,18,36,12,0,0,3,0,7,0,14,0,12,0,255,192, + 255,192,192,0,192,0,192,0,192,0,255,0,255,0,192,0, + 192,0,192,0,192,0,255,192,255,192,10,18,36,12,0,0, + 12,0,30,0,63,0,51,0,255,192,255,192,192,0,192,0, + 192,0,192,0,255,0,255,0,192,0,192,0,192,0,192,0, + 255,192,255,192,10,18,36,12,0,0,51,0,51,0,0,0, + 0,0,255,192,255,192,192,0,192,0,192,0,192,0,255,0, + 255,0,192,0,192,0,192,0,192,0,255,192,255,192,10,18, + 36,12,0,0,48,0,56,0,28,0,12,0,255,192,255,192, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,255,192,255,192,10,18,36,12,0,0,3,0, + 7,0,14,0,12,0,255,192,255,192,12,0,12,0,12,0, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,255,192, + 255,192,10,18,36,12,0,0,12,0,30,0,63,0,51,0, + 255,192,255,192,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,12,0,12,0,12,0,255,192,255,192,10,18,36,12, + 0,0,51,0,51,0,0,0,0,0,255,192,255,192,12,0, + 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, + 12,0,255,192,255,192,10,14,28,12,0,0,63,0,63,128, + 49,192,48,192,48,192,48,192,252,192,252,192,48,192,48,192, + 48,192,49,192,63,128,63,0,10,18,36,12,0,0,48,192, + 124,192,207,128,199,0,192,192,224,192,240,192,248,192,220,192, + 206,192,199,192,195,192,193,192,192,192,192,192,192,192,192,192, + 192,192,10,18,36,12,0,0,48,0,56,0,28,0,12,0, + 63,0,127,128,225,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,225,192,127,128,63,0,10,18,36,12, + 0,0,3,0,7,0,14,0,12,0,63,0,127,128,225,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 225,192,127,128,63,0,10,18,36,12,0,0,12,0,30,0, + 63,0,51,0,0,0,63,0,127,128,225,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,225,192,127,128,63,0, + 10,18,36,12,0,0,48,192,124,192,207,128,199,0,63,0, + 127,128,225,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,225,192,127,128,63,0,10,18,36,12,0,0, + 51,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,225,192, + 127,128,63,0,10,10,20,12,0,2,64,128,225,192,115,128, + 63,0,30,0,30,0,63,0,115,128,225,192,64,128,10,14, + 28,12,0,0,63,0,127,128,225,192,193,192,195,192,199,192, + 206,192,220,192,248,192,240,192,224,192,225,192,127,128,63,0, + 10,18,36,12,0,0,48,0,56,0,28,0,12,0,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,225,192,127,128,63,0,10,18,36,12,0,0, + 3,0,7,0,14,0,12,0,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,225,192, + 127,128,63,0,10,18,36,12,0,0,12,0,30,0,63,0, + 51,0,0,0,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,225,192,127,128,63,0,10,18, + 36,12,0,0,51,0,51,0,0,0,0,0,192,192,192,192, + 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, + 192,192,225,192,127,128,63,0,10,18,36,12,0,0,3,0, + 7,0,14,0,12,0,192,192,192,192,192,192,192,192,192,192, + 225,192,115,128,63,0,30,0,12,0,12,0,12,0,12,0, + 12,0,10,14,28,12,0,0,192,0,192,0,255,0,255,128, + 193,192,192,192,192,192,193,192,255,128,255,0,192,0,192,0, + 192,0,192,0,10,18,36,12,0,254,15,0,31,128,57,192, + 112,192,224,192,193,192,195,128,195,0,195,0,195,128,193,192, + 192,192,192,192,193,192,207,128,207,0,192,0,192,0,10,16, + 32,12,0,0,12,0,14,0,7,0,3,0,0,0,0,0, + 63,192,127,192,224,192,192,192,192,192,193,192,195,192,231,192, + 126,192,60,192,10,16,32,12,0,0,3,0,7,0,14,0, + 12,0,0,0,0,0,63,192,127,192,224,192,192,192,192,192, + 193,192,195,192,231,192,126,192,60,192,10,16,32,12,0,0, + 12,0,30,0,63,0,51,0,0,0,0,0,63,192,127,192, + 224,192,192,192,192,192,193,192,195,192,231,192,126,192,60,192, + 10,16,32,12,0,0,48,192,124,192,207,128,199,0,0,0, + 0,0,63,192,127,192,224,192,192,192,192,192,193,192,195,192, + 231,192,126,192,60,192,10,14,28,12,0,0,51,0,51,0, + 0,0,0,0,63,192,127,192,224,192,192,192,192,192,193,192, + 195,192,231,192,126,192,60,192,10,16,32,12,0,0,12,0, + 30,0,51,0,51,0,30,0,12,0,63,192,127,192,224,192, + 192,192,192,192,193,192,195,192,231,192,126,192,60,192,10,10, + 20,12,0,0,63,0,127,128,237,192,204,192,207,192,207,192, + 204,0,236,0,127,192,63,192,10,14,28,12,0,252,63,0, + 127,128,225,192,192,192,192,0,192,0,192,0,224,0,127,192, + 63,192,12,0,28,0,56,0,16,0,10,16,32,12,0,0, + 48,0,56,0,28,0,12,0,0,0,0,0,63,0,127,128, + 225,192,192,192,255,192,255,192,192,0,224,0,127,192,63,192, + 10,16,32,12,0,0,3,0,7,0,14,0,12,0,0,0, + 0,0,63,0,127,128,225,192,192,192,255,192,255,192,192,0, + 224,0,127,192,63,192,10,16,32,12,0,0,12,0,30,0, + 63,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, + 255,192,255,192,192,0,224,0,127,192,63,192,10,14,28,12, + 0,0,51,0,51,0,0,0,0,0,63,0,127,128,225,192, + 192,192,255,192,255,192,192,0,224,0,127,192,63,192,6,16, + 16,12,2,0,192,224,112,48,0,0,240,240,48,48,48,48, + 48,48,252,252,6,16,16,12,2,0,12,28,56,48,0,0, + 240,240,48,48,48,48,48,48,252,252,6,16,16,12,2,0, + 48,120,252,204,0,0,240,240,48,48,48,48,48,48,252,252, + 6,14,14,12,2,0,204,204,0,0,240,240,48,48,48,48, + 48,48,252,252,10,17,34,12,0,0,36,0,126,0,60,0, + 60,0,126,0,39,0,3,128,63,192,127,192,225,192,192,192, + 192,192,192,192,192,192,225,192,127,128,63,0,10,16,32,12, + 0,0,48,192,124,192,207,128,199,0,0,0,0,0,207,0, + 223,128,249,192,240,192,224,192,192,192,192,192,192,192,192,192, + 192,192,10,16,32,12,0,0,48,0,56,0,28,0,12,0, + 0,0,0,0,63,0,127,128,225,192,192,192,192,192,192,192, + 192,192,225,192,127,128,63,0,10,16,32,12,0,0,3,0, + 7,0,14,0,12,0,0,0,0,0,63,0,127,128,225,192, + 192,192,192,192,192,192,192,192,225,192,127,128,63,0,10,16, + 32,12,0,0,12,0,30,0,63,0,51,0,0,0,0,0, + 63,0,127,128,225,192,192,192,192,192,192,192,192,192,225,192, + 127,128,63,0,10,16,32,12,0,0,48,192,124,192,207,128, + 199,0,0,0,0,0,63,0,127,128,225,192,192,192,192,192, + 192,192,192,192,225,192,127,128,63,0,10,14,28,12,0,0, + 51,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, + 192,192,192,192,192,192,225,192,127,128,63,0,10,10,20,12, + 0,2,12,0,12,0,0,0,0,0,255,192,255,192,0,0, + 0,0,12,0,12,0,10,10,20,12,0,0,63,0,127,128, + 227,192,199,192,206,192,220,192,248,192,241,192,127,128,63,0, + 10,16,32,12,0,0,48,0,56,0,28,0,12,0,0,0, + 0,0,192,192,192,192,192,192,192,192,192,192,193,192,195,192, + 231,192,126,192,60,192,10,16,32,12,0,0,3,0,7,0, + 14,0,12,0,0,0,0,0,192,192,192,192,192,192,192,192, + 192,192,193,192,195,192,231,192,126,192,60,192,10,16,32,12, + 0,0,12,0,30,0,63,0,51,0,0,0,0,0,192,192, + 192,192,192,192,192,192,192,192,193,192,195,192,231,192,126,192, + 60,192,10,14,28,12,0,0,51,0,51,0,0,0,0,0, + 192,192,192,192,192,192,192,192,192,192,193,192,195,192,231,192, + 126,192,60,192,10,20,40,12,0,252,3,0,7,0,14,0, + 12,0,0,0,0,0,192,192,192,192,192,192,192,192,192,192, + 192,192,192,192,224,192,127,192,63,192,0,192,1,192,63,128, + 63,0,10,18,36,12,0,252,192,0,192,0,192,0,192,0, + 255,0,255,128,193,192,192,192,192,192,192,192,192,192,193,192, + 255,128,255,0,192,0,192,0,192,0,192,0,10,18,36,12, + 0,252,51,0,51,0,0,0,0,0,192,192,192,192,192,192, + 192,192,192,192,192,192,192,192,224,192,127,192,63,192,0,192, + 1,192,63,128,63,0 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/ili9328.h b/Marlin/src/lcd/tft/ili9328.h new file mode 100644 index 000000000000..85edfa7bee0a --- /dev/null +++ b/Marlin/src/lcd/tft/ili9328.h @@ -0,0 +1,150 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ILI9328_DRVCTL_SM 0x0400 +#define ILI9328_DRVCTL_SS 0x0100 // Select the shift direction of outputs from the source driver. 0 - from S1 to S720 / 1 - from S720 to S1 + +#define ILI9328_GATE_SCANCTL_GS 0x8000 // Sets the direction of scan by the gate driver in the range determined by SCN[4:0] and NL[4:0]. + +#define ILI9328_ETMOD_TRI 0x8000 +#define ILI9328_ETMOD_DFM 0x4000 +#define ILI9328_ETMOD_BGR 0x1000 // RGB-BGR ORDER +#define ILI9328_ETMOD_RGB 0x0000 +#define ILI9328_ETMOD_ORG 0x0080 +#define ILI9328_ETMOD_ID1 0x0020 // 0 - Vertical Decrement / 1 - Vertical Increment +#define ILI9328_ETMOD_ID0 0x0010 // 0 - Horizontal Decrement / 1 - Horizontal Increment +#define ILI9328_ETMOD_AM 0x0008 // 0 - Horizontal / 1 - Vertical + +// MKS Robin TFT v1.1 - 320x240 ; Cable on the left side +#define ILI9328_DRVCTL_DATA ILI9328_DRVCTL_SS +#define ILI9328_ETMOD_DATA ILI9328_ETMOD_BGR | ILI9328_ETMOD_ID1 | ILI9328_ETMOD_ID0 | ILI9328_ETMOD_AM + +#define ILI9328_RDDID 0x00 // ID code - 0x9328 +#define ILI9328_DRVCTL 0x01 // Driver Output Control +#define ILI9328_LCDCTL 0x02 // LCD Driving Wave Control +#define ILI9328_ETMOD 0x03 // Entry Mode - Control the GRAM update direction +#define ILI9328_RESIZECTL 0x04 // Resizing Control Register +#define ILI9328_DISCTRL1 0x07 // Display Control 1 +#define ILI9328_DISCTRL2 0x08 // Display Control 2 +#define ILI9328_DISCTRL3 0x09 // Display Control 3 +#define ILI9328_DISCTRL4 0x0A // Display Control 4 +#define ILI9328_RGBCTRL1 0x0C // RGB Display Interface Control 1 +#define ILI9328_FMARKERPOS 0x0D // Frame Marker Position +#define ILI9328_RGBCTRL2 0x0F // RGB Display Interface Control 2 +#define ILI9328_PWCTRL1 0x10 // Power Control 1 +#define ILI9328_PWCTRL2 0x11 // Power Control 2 +#define ILI9328_PWCTRL3 0x12 // Power Control 3 +#define ILI9328_PWCTRL4 0x13 // Power Control 4 + +// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X +#define ILI9328_HASET 0x20 // GRAM Horizontal Address Set (0-255) +#define ILI9328_VASET 0x21 // GRAM Vertical Address Set (0-511) +#define ILI9328_RAMWR 0x22 // Write data to GRAM +#define ILI9328_RAMRD 0x22 // Read Data from GRAM + +#define ILI9328_PWCTRL7 0x29 // Power Control 7 +#define ILI9328_FRMCTR 0x2B // Frame Rate and Color Control +#define ILI9328_GAMCTRL1 0x30 // Gamma Control +#define ILI9328_GAMCTRL2 0x31 // Gamma Control +#define ILI9328_GAMCTRL3 0x32 // Gamma Control +#define ILI9328_GAMCTRL4 0x35 // Gamma Control +#define ILI9328_GAMCTRL5 0x36 // Gamma Control +#define ILI9328_GAMCTRL6 0x37 // Gamma Control +#define ILI9328_GAMCTRL7 0x38 // Gamma Control +#define ILI9328_GAMCTRL8 0x39 // Gamma Control +#define ILI9328_GAMCTRL9 0x3C // Gamma Control +#define ILI9328_GAMCTRLA 0x3D // Gamma Control + +// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X +#define ILI9328_HASTART 0x50 // Horizontal Address Start Position (0-255) +#define ILI9328_HAEND 0x51 // Horizontal Address End Position (0-255) +#define ILI9328_VASTART 0x52 // Vertical Address Start Position (0-511) +#define ILI9328_VAEND 0x53 // Vertical Address End Position (0-511) + +#define ILI9328_GATE_SCANCTL1 0x60 // Gate Scan Control +#define ILI9328_GATE_SCANCTL2 0x61 // Gate Scan Control +#define ILI9328_GATE_SCANCTL3 0x6A // Gate Scan Control + +#define ILI9328_PLTPOS1 0x80 // Partial Image 1 Display Position +#define ILI9328_PLTSTART1 0x81 // Partial Image 1 RAM Start Address +#define ILI9328_PLTEND1 0x82 // Partial Image 1 RAM End Address +#define ILI9328_PLTPOS2 0x83 // Partial Image 2 Display Position +#define ILI9328_PLTSTART2 0x84 // Partial Image 2 RAM Start Address +#define ILI9328_PLTEND2 0x85 // Partial Image 2 RAM End Address + +#define ILI9328_IFCTL1 0x90 // Panel Interface Control 1 +#define ILI9328_IFCTL2 0x92 // Panel Interface Control 2 +#define ILI9328_IFCTL4 0x95 // Panel Interface Control 4 +#define ILI9328_IFCTL5 0x97 // Panel Interface Control 5 + +#define ILI9328_OTPWR 0xA1 // OTP VCM Programming Control +#define ILI9328_RDOTP 0xA2 // OTP VCM Status and Enable +#define ILI9328_OTPPKEY 0xA5 // OTP Programming ID Key + + +static const uint16_t ili9328_init[] = { + DATASIZE_16BIT, + ESC_REG(ILI9328_DRVCTL), ILI9328_DRVCTL_DATA, + ESC_REG(ILI9328_LCDCTL), 0x0400, // LCD Driving Wave Control + ESC_REG(ILI9328_ETMOD), ILI9328_ETMOD_DATA, + + ESC_REG(ILI9328_RESIZECTL), 0x0000, + ESC_REG(ILI9328_DISCTRL2), 0x0202, + ESC_REG(ILI9328_DISCTRL3), 0x0000, + ESC_REG(ILI9328_DISCTRL4), 0x0000, + ESC_REG(ILI9328_RGBCTRL1), 0x0000, + ESC_REG(ILI9328_FMARKERPOS), 0x0000, + ESC_REG(ILI9328_RGBCTRL2), 0x0000, + ESC_REG(ILI9328_PWCTRL1), 0x0000, + ESC_REG(ILI9328_PWCTRL2), 0x0007, + ESC_REG(ILI9328_PWCTRL3), 0x0000, + ESC_REG(ILI9328_PWCTRL4), 0x0000, + ESC_REG(ILI9328_DISCTRL1), 0x0001, + ESC_DELAY(200), + ESC_REG(ILI9328_PWCTRL1), 0x1690, + ESC_REG(ILI9328_PWCTRL2), 0x0227, + ESC_DELAY(50), + ESC_REG(ILI9328_PWCTRL3), 0x008C, + ESC_DELAY(50), + ESC_REG(ILI9328_PWCTRL4), 0x1500, + ESC_REG(ILI9328_PWCTRL7), 0x0004, + ESC_REG(ILI9328_FRMCTR), 0x000D, + ESC_DELAY(50), + ESC_REG(ILI9328_GATE_SCANCTL1), 0x2700, + ESC_REG(ILI9328_GATE_SCANCTL2), 0x0001, + ESC_REG(ILI9328_GATE_SCANCTL3), 0x0000, + ESC_REG(ILI9328_PLTPOS1), 0x0000, + ESC_REG(ILI9328_PLTSTART1), 0x0000, + ESC_REG(ILI9328_PLTEND1), 0x0000, + ESC_REG(ILI9328_PLTPOS2), 0x0000, + ESC_REG(ILI9328_PLTSTART2), 0x0000, + ESC_REG(ILI9328_PLTEND2), 0x0000, + ESC_REG(ILI9328_IFCTL1), 0x0010, + ESC_REG(ILI9328_IFCTL2), 0x0600, + ESC_REG(ILI9328_DISCTRL1), 0x0133, + ESC_END +}; diff --git a/Marlin/src/lcd/tft/ili9341.h b/Marlin/src/lcd/tft/ili9341.h new file mode 100644 index 000000000000..42a36b7e342e --- /dev/null +++ b/Marlin/src/lcd/tft/ili9341.h @@ -0,0 +1,162 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ILI9341_MADCTL_MY 0x80 // Row Address Order +#define ILI9341_MADCTL_MX 0x40 // Column Address Order +#define ILI9341_MADCTL_MV 0x20 // Row/Column Exchange +#define ILI9341_MADCTL_ML 0x10 // Vertical Refresh Order +#define ILI9341_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ILI9341_MADCTL_RGB 0x00 +#define ILI9341_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ILI9341_ORIENTATION_UP ILI9341_MADCTL_MY // 240x320 ; Cable on the upper side +#define ILI9341_ORIENTATION_RIGHT ILI9341_MADCTL_MV // 320x240 ; Cable on the right side +#define ILI9341_ORIENTATION_LEFT ILI9341_MADCTL_MY | ILI9341_MADCTL_MX | ILI9341_MADCTL_MV // 320x240 ; Cable on the left side +#define ILI9341_ORIENTATION_DOWN ILI9341_MADCTL_MX // 240x320 ; Cable on the upper side + +#define ILI9341_COLOR_BGR +#define ILI9341_ORIENTATION ILI9341_ORIENTATION_LEFT +#define ILI9341_MADCTL_DATA (ILI9341_ORIENTATION | TERN(ILI9341_COLOR_BGR, ILI9341_MADCTL_BGR, ILI9341_MADCTL_RGB)) + +#define ILI9341_NOP 0x00 // No Operation +#define ILI9341_SWRESET 0x01 // Software Reset +#define ILI9341_RDDIDIF 0x04 // Read display identification information +#define ILI9341_RDDST 0x09 // Read Display Status +#define ILI9341_RDDPM 0x0A // Read Display Power Mode +#define ILI9341_RDDMADCTL 0x0B // Read Display MADCTL +#define ILI9341_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ILI9341_RDDIM 0x0D // Read Display Image Format +#define ILI9341_RDDSM 0x0E // Read Display Signal Mode +#define ILI9341_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ILI9341_SPLIN 0x10 // Enter Sleep Mode +#define ILI9341_SLPOUT 0x11 // Sleep Out +#define ILI9341_PTLON 0x12 // Partial Mode ON +#define ILI9341_NORON 0x13 // Normal Display Mode ON +#define ILI9341_DINVOFF 0x20 // Display Inversion OFF +#define ILI9341_DINVON 0x21 // Display Inversion ON +#define ILI9341_GAMSET 0x26 // Gamma Set +#define ILI9341_DISPOFF 0x28 // Display OFF +#define ILI9341_DISPON 0x29 // Display ON +#define ILI9341_CASET 0x2A // Column Address Set +#define ILI9341_PASET 0x2B // Page Address Set +#define ILI9341_RAMWR 0x2C // Memory Write +#define ILI9341_RGBSET 0x2D // Color Set +#define ILI9341_RAMRD 0x2E // Memory Read +#define ILI9341_PLTAR 0x30 // Partial Area +#define ILI9341_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ILI9341_TEOFF 0x34 // Tearing Effect Line OFF +#define ILI9341_TEON 0x35 // Tearing Effect Line ON +#define ILI9341_MADCTL 0x36 // Memory Access Control +#define ILI9341_VSCRSADD 0x37 // Vertical Scrolling Start Address +#define ILI9341_IDMOFF 0x38 // Idle Mode OFF +#define ILI9341_IDMON 0x39 // Idle Mode ON +#define ILI9341_PIXSET 0x3A // COLMOD: Pixel Format Set +#define ILI9341_WRMEMC 0x3C // Write Memory Continue +#define ILI9341_RDMEMC 0x3E // Read Memory Continue +#define ILI9341_STE 0x44 // Set Tear Scanline +#define ILI9341_GSCAN 0x45 // Get Scanline +#define ILI9341_WRDISBV 0x51 // Write Display Brightness +#define ILI9341_RDDISBV 0x52 // Read Display Brightness +#define ILI9341_WRCTRLD 0x53 // Write CTRL Display +#define ILI9341_RDCTRLD 0x54 // Read CTRL Display +#define ILI9341_WRCABC 0x55 // Write Content Adaptive Brightness Control +#define ILI9341_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define ILI9341_WRCABCMB 0x5E // Write CABC Minimum Brightness / Backlight Control 1 +#define ILI9341_RDCABCMB 0x5F // Read CABC Minimum Brightness / Backlight Control 1 +#define ILI9341_RDID1 0xDA // Read ID1 +#define ILI9341_RDID2 0xDB // Read ID2 +#define ILI9341_RDID3 0xDC // Read ID3 + +#define ILI9341_IFMODE 0xB0 // RGB Interface Signal Control +#define ILI9341_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) +#define ILI9341_FRMCTR2 0xB2 // Frame Rate Control (In Idle Mode/8 colors) +#define ILI9341_FRMCTR3 0xB3 // Frame Rate control (In Partial Mode/Full Colors) +#define ILI9341_INVTR 0xB4 // Display Inversion Control +#define ILI9341_PRCTR 0xB5 // Blanking Porch Control +#define ILI9341_DISCTRL 0xB6 // Display Function Control +#define ILI9341_ETMOD 0xB7 // Entry Mode Set +#define ILI9341_BLCTL1 0xB8 // Backlight Control 1 +#define ILI9341_BLCTL2 0xB9 // Backlight Control 2 +#define ILI9341_BLCTL3 0xBA // Backlight Control 3 +#define ILI9341_BLCTL4 0xBB // Backlight Control 4 +#define ILI9341_BLCTL5 0xBC // Backlight Control 5 +#define ILI9341_BLCTL7 0xBE // Backlight Control 7 +#define ILI9341_BLCTL8 0xBF // Backlight Control 8 +#define ILI9341_PWCTRL1 0xC0 // Power Control 1 +#define ILI9341_PWCTRL2 0xC1 // Power Control 2 +#define ILI9341_VMCTRL1 0xC5 // VCOM Control 1 +#define ILI9341_VMCTRL2 0xC7 // VCOM Control 2 +#define ILI9341_PWCTRLA 0xCB // Power control A +#define ILI9341_PWCTRLB 0xCF // Power control B +#define ILI9341_NVMWR 0xD0 // NV Memory Write +#define ILI9341_NVMPKEY 0xD1 // NV Memory Protection Key +#define ILI9341_RDNVM 0xD2 // NV Memory Status Read +#define ILI9341_RDID4 0xD3 // Read ID4 - 0x009341 +#define ILI9341_PGAMCTRL 0xE0 // Positive Gamma Correction +#define ILI9341_NGAMCTRL 0xE1 // Negative Gamma Correction +#define ILI9341_DGAMCTRL1 0xE2 // Digital Gamma Control 1 +#define ILI9341_DGAMCTRL2 0xE3 // Digital Gamma Control 2 +#define ILI9341_DRVTCTLA1 0xE8 // Driver timing control A +#define ILI9341_DRVTCTLA2 0xE9 // Driver timing control A +#define ILI9341_DRVTCTLB 0xEA // Driver timing control B +#define ILI9341_PONSEQCTL 0xED // Power on sequence control +#define ILI9341_EN3G 0xF2 // Enable 3G - 3 gamma control +#define ILI9341_IFCTL 0xF6 // Interface Control +#define ILI9341_PUMPRCTL 0xF7 // Pump ratio control + + +static const uint16_t ili9341_init[] = { + DATASIZE_8BIT, + ESC_REG(ILI9341_SWRESET), ESC_DELAY(100), + ESC_REG(ILI9341_SLPOUT), ESC_DELAY(20), +/* + ESC_REG(ILI9341_PWCTRLA), 0x0039, 0x002C, 0x0000, 0x0034, 0x0002, // Power control A + ESC_REG(ILI9341_PWCTRLB), 0x0000, 0x00C1, 0x0030, // Power control B + ESC_REG(ILI9341_DRVTCTLA1), 0x0085, 0x0000, 0x0078, // Driver timing control A + ESC_REG(ILI9341_DRVTCTLB), 0x0000, 0x0000, // Driver timing control B + ESC_REG(ILI9341_PONSEQCTL), 0x0064, 0x0003, 0x0012, 0x0081, // Power on sequence control + ESC_REG(ILI9341_DISCTRL), 0x0008, 0x0082, 0x0027, // Display Function Control + ESC_REG(ILI9341_PUMPRCTL), 0x0020, // Pump ratio control + ESC_REG(ILI9341_VMCTRL1), 0x003E, 0x0028, // VCOM Control 1 + ESC_REG(ILI9341_VMCTRL2), 0x0086, // VCOM Control 2 + ESC_REG(ILI9341_FRMCTR1), 0x0000, 0x0018, // Frame Rate Control (In Normal Mode/Full Colors) + ESC_REG(ILI9341_PWCTRL1), 0x0023, // Power Control 1 + ESC_REG(ILI9341_PWCTRL2), 0x0010, // Power Control 2 +*/ + ESC_REG(ILI9341_MADCTL), ILI9341_MADCTL_DATA, + ESC_REG(ILI9341_PIXSET), 0x0055, + + /* Gamma Correction */ + ESC_REG(ILI9341_EN3G), 0x0000, // 3Gamma Function Disable + ESC_REG(ILI9341_GAMSET), 0x0001, // Gamma curve selected + ESC_REG(ILI9341_PGAMCTRL), 0x000F, 0x0031, 0x002B, 0x000C, 0x000E, 0x0008, 0x004E, 0x00F1, 0x0037, 0x0007, 0x0010, 0x0003, 0x000E, 0x0009, 0x0000, + ESC_REG(ILI9341_NGAMCTRL), 0x0000, 0x000E, 0x0014, 0x0003, 0x0011, 0x0007, 0x0031, 0x00C1, 0x0048, 0x0008, 0x000F, 0x000C, 0x0031, 0x0036, 0x000F, + + ESC_REG(ILI9341_NORON), + ESC_REG(ILI9341_DISPON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/ili9488.h b/Marlin/src/lcd/tft/ili9488.h new file mode 100644 index 000000000000..135f94a57ffc --- /dev/null +++ b/Marlin/src/lcd/tft/ili9488.h @@ -0,0 +1,156 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ILI9488_MADCTL_MY 0x80 // Row Address Order +#define ILI9488_MADCTL_MX 0x40 // Column Address Order +#define ILI9488_MADCTL_MV 0x20 // Row/Column Exchange +#define ILI9488_MADCTL_ML 0x10 // Vertical Refresh Order +#define ILI9488_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ILI9488_MADCTL_RGB 0x00 +#define ILI9488_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ILI9488_ORIENTATION_UP ILI9488_MADCTL_MY // 320x480 ; Cable on the upper side +#define ILI9488_ORIENTATION_RIGHT ILI9488_MADCTL_MV // 480x320 ; Cable on the right side +#define ILI9488_ORIENTATION_LEFT ILI9488_MADCTL_MY | ILI9488_MADCTL_MX | ILI9488_MADCTL_MV // 480x320 ; Cable on the left side +#define ILI9488_ORIENTATION_DOWN ILI9488_MADCTL_MX // 320x480 ; Cable on the upper side + +#define ILI9488_COLOR_BGR +#define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT +#define ILI9488_MADCTL_DATA (ILI9488_ORIENTATION | TERN(ILI9488_COLOR_BGR, ILI9488_MADCTL_BGR, ILI9488_MADCTL_RGB)) + +#define ILI9488_NOP 0x00 // No Operation +#define ILI9488_SWRESET 0x01 // Software Reset +#define ILI9488_RDDIDIF 0x04 // Read Display Identification Information +#define ILI9488_RDNUMED 0x05 // Read Number of the Errors on DSI +#define ILI9488_RDDST 0x09 // Read Display Status +#define ILI9488_RDDPM 0x0A // Read Display Power Mode +#define ILI9488_RDDMADCTL 0x0B // Read Display MADCTL +#define ILI9488_RDDCOLMOD 0x0C // Read Display COLMOD +#define ILI9488_RDDIM 0x0D // Read Display Image Mode +#define ILI9488_RDDSM 0x0E // Read Display Signal Mode +#define ILI9488_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ILI9488_SLPIN 0x10 // Sleep IN +#define ILI9488_SLPOUT 0x11 // Sleep OUT +#define ILI9488_PTLON 0x12 // Partial Mode ON +#define ILI9488_NORON 0x13 // Normal Display Mode ON +#define ILI9488_INVOFF 0x20 // Display Inversion OFF +#define ILI9488_INVON 0x21 // Display Inversion ON +#define ILI9488_ALLPOFF 0x22 // All Pixels OFF +#define ILI9488_ALLPON 0x23 // All Pixels ON +#define ILI9488_DISOFF 0x28 // Display OFF +#define ILI9488_DISON 0x29 // Display ON +#define ILI9488_CASET 0x2A // Column Address Set +#define ILI9488_PASET 0x2B // Page Address Set +#define ILI9488_RAMWR 0x2C // Memory Write +#define ILI9488_RAMRD 0x2E // Memory Read +#define ILI9488_PLTAR 0x30 // Partial Area +#define ILI9488_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ILI9488_TEOFF 0x34 // Tearing Effect Line OFF +#define ILI9488_TEON 0x35 // Tearing Effect Line ON +#define ILI9488_MADCTL 0x36 // Memory Access Control +#define ILI9488_VSCRSADD 0x37 // Vertical Scrolling Start Address +#define ILI9488_IDMOFF 0x38 // Idle Mode OFF +#define ILI9488_IDMON 0x39 // Idle Mode ON +#define ILI9488_COLMOD 0x3A // Interface Pixel Format +#define ILI9488_RAMWRC 0x3C // Memory Write Continue +#define ILI9488_RAMRDRC 0x3E // Memory Read Continue +#define ILI9488_TESLWR 0x44 // Write Tear Scan Line +#define ILI9488_TESLRD 0x45 // Read Scan Line +#define ILI9488_WRDISBV 0x51 // Write Display Brightness Value +#define ILI9488_RDDISBV 0x52 // Read Display Brightness Value +#define ILI9488_WRCTRLD 0x53 // Write Control Display Value +#define ILI9488_RDCTRLD 0x54 // Read Control Display Value +#define ILI9488_WRCABC 0x55 // Write Content Adaptive Brightness Control Value +#define ILI9488_RDCABC 0x56 // Read Content Adaptive Brightness Control Value +#define ILI9488_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define ILI9488_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define ILI9488_RDABCSDR 0x68 // Read Automatic Brightness Control Self-diagnostic Result +#define ILI9488_RDID1 0xDA // Read ID1 +#define ILI9488_RDID2 0xDB // Read ID2 +#define ILI9488_RDID3 0xDC // Read ID3 + +#define ILI9488_IFMODE 0xB0 // Interface Mode Control +#define ILI9488_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) +#define ILI9488_FRMCTR2 0xB2 // Frame Rate Control (In Idle Mode/8 Colors) +#define ILI9488_FRMCTR3 0xB3 // Frame Rate Control (In Partial Mode/Full Colors) +#define ILI9488_INVTR 0xB4 // Display Inversion Control +#define ILI9488_PRCTR 0xB5 // Blanking Porch Control +#define ILI9488_DISCTRL 0xB6 // Display Function Control +#define ILI9488_ETMOD 0xB7 // Entry Mode Set +#define ILI9488_CECTRL1 0xB9 // Color Enhancement Control 1 +#define ILI9488_CECTRL2 0xBA // Color Enhancement Control 2 +#define ILI9488_HSLCTRL 0xBE // HS Lanes Control +#define ILI9488_PWCTRL1 0xC0 // Power Control 1 +#define ILI9488_PWCTRL2 0xC1 // Power Control 2 +#define ILI9488_PWCTRL3 0xC2 // Power Control 3 (For Normal Mode) +#define ILI9488_PWCTRL4 0xC3 // Power Control 4 (For Idle Mode) +#define ILI9488_PWCTRL5 0xC4 // Power Control 5 (For Partial Mode) +#define ILI9488_VMCTRL 0xC5 // VCOM Control +#define ILI9488_CABCCTRL1 0xC6 // CABC Control 1 +#define ILI9488_CABCCTRL2 0xC8 // CABC Control 2 +#define ILI9488_CABCCTRL3 0xC9 // CABC Control 3 +#define ILI9488_CABCCTRL4 0xCA // CABC Control 4 +#define ILI9488_CABCCTRL5 0xCB // CABC Control 5 +#define ILI9488_CABCCTRL6 0xCC // CABC Control 6 +#define ILI9488_CABCCTRL7 0xCD // CABC Control 7 +#define ILI9488_CABCCTRL8 0xCE // CABC Control 8 +#define ILI9488_CABCCTRL9 0xCF // CABC Control 9 +#define ILI9488_NVMWR 0xD0 // NV Memory Write +#define ILI9488_NVMPKEY 0xD1 // NV Memory Protection Key +#define ILI9488_RDNVM 0xD2 // NV Memory Status Read +#define ILI9488_RDID4 0xD3 // Read ID4 - 0x009488 +#define ILI9488_ADJCTL1 0xD7 // Adjust Control 1 +#define ILI9488_RDIDV 0xD8 // Read ID Version +#define ILI9488_PGAMCTRL 0xE0 // Positive Gamma Control +#define ILI9488_NGAMCTRL 0xE1 // Negative Gamma Control +#define ILI9488_DGAMCTRL1 0xE2 // Ditigal Gamma Control 1 +#define ILI9488_DGAMCTRL2 0xE3 // Ditigal Gamma Control 2 +#define ILI9488_SETIMAGE 0xE9 // Set Image Function +#define ILI9488_ADJCTL2 0xF2 // Adjust Control 2 +#define ILI9488_ADJCTL3 0xF7 // Adjust Control 3 +#define ILI9488_ADJCTL4 0xF8 // Adjust Control 4 +#define ILI9488_ADJCTL5 0xF9 // Adjust Control 5 +#define ILI9488_RDEXTC 0xFB // Read EXTC command is SPI mode +#define ILI9488_ADJCTL6 0xFC // Adjust Control 6 +#define ILI9488_ADJCTL7 0xFF // Adjust Control 7 + +static const uint16_t ili9488_init[] = { + DATASIZE_8BIT, + ESC_REG(ILI9488_SWRESET), ESC_DELAY(120), + ESC_REG(ILI9488_SLPOUT), ESC_DELAY(20), + + ESC_REG(ILI9488_MADCTL), ILI9488_MADCTL_DATA, + ESC_REG(ILI9488_COLMOD), 0x0055, + + /* Gamma Correction. */ + ESC_REG(ILI9488_PGAMCTRL), 0x0000, 0x0003, 0x0009, 0x0008, 0x0016, 0x000A, 0x003F, 0x0078, 0x004C, 0x0009, 0x000A, 0x0008, 0x0016, 0x001A, 0x000F, + ESC_REG(ILI9488_NGAMCTRL), 0x0000, 0x0016, 0x0019, 0x0003, 0x000F, 0x0005, 0x0032, 0x0045, 0x0046, 0x0004, 0x000E, 0x000D, 0x0035, 0x0037, 0x000F, + + ESC_REG(ILI9488_NORON), + ESC_REG(ILI9488_DISON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/images/back_32x32x4.cpp b/Marlin/src/lcd/tft/images/back_32x32x4.cpp new file mode 100644 index 000000000000..8f5809d5dc0c --- /dev/null +++ b/Marlin/src/lcd/tft/images/back_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t back_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x6f, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x6e, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x76, 0xef, 0xff, 0xe5, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x6e, 0xff, 0xff, 0xd5, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x76, 0xff, 0xff, 0xff, 0xfe, 0xb8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x85, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, + 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x66, 0x88, 0x88, 0x88, + 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x56, 0x78, 0x88, 0x88, + 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x67, 0x88, 0x88, + 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x56, 0x78, 0x88, + 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0x68, 0x88, + 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, + 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xfc, 0xde, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, + 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xd5, 0x67, 0x77, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0x56, 0x78, + 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xe5, 0x78, 0x87, 0x77, 0x77, 0xae, 0xff, 0xff, 0x95, 0x68, + 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xf5, 0x58, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xe5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xf8, 0x57, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xe6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xfc, 0x56, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xd7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0x66, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0x97, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x97, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/background_320x30x16.cpp b/Marlin/src/lcd/tft/images/background_320x30x16.cpp new file mode 100644 index 000000000000..f6eca2d6dd9f --- /dev/null +++ b/Marlin/src/lcd/tft/images/background_320x30x16.cpp @@ -0,0 +1,60 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint16_t background_320x30x16[9600] = { + 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x20f3, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x20f3, 0x20f2, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, + 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2dfd, 0x2dfd, 0x2dfe, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x1ddd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, + 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2dde, 0x2d5d, 0x2d1c, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x251d, 0x2d1d, 0x2cfc, 0x253c, 0x25bd, 0x25bd, 0x2cfd, 0x24fd, 0x2d1d, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x255d, 0x25fd, 0x251c, 0x24fd, 0x24dd, 0x24fc, 0x24fd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x253d, 0x25bd, 0x253d, 0x24dc, 0x24dc, 0x24dc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, + 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2bbc, 0x25bd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x247c, 0x259c, 0x2b1c, 0x2b1c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x1cfd, 0x253c, 0x233c, 0x22fc, 0x231b, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fb, 0x22dc, 0x22db, 0x22dc, 0x235b, 0x1d5c, 0x1d1c, 0x231c, 0x22fb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, + 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x259d, 0x241c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1d9c, 0x247c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bdc, 0x23fc, 0x1d7d, 0x1cdc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9b, 0x1bbc, 0x1b9b, 0x1bbb, 0x1b9c, 0x1bfb, 0x1d5c, 0x1d3c, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, + 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bbb, 0x23bc, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bdb, 0x1bbb, 0x1c7c, 0x1cfc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1d1c, 0x1c9c, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9b, 0x1c3c, 0x1d5c, 0x1c3b, 0x1b9c, 0x1b9b, 0x1b9b, 0x139b, 0x1b9b, 0x139b, 0x13bb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x1b9b, 0x139b, 0x139b, 0x137b, 0x139b, 0x1b7b, 0x151c, 0x153c, 0x1bbb, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, + 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19db, 0x19da, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x1a3b, 0x153c, 0x1a1b, 0x19da, 0x19db, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19da, 0x1afb, 0x14fb, 0x1a3b, 0x19da, 0x11da, 0x19db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19ba, 0x11da, 0x137b, 0x14db, 0x127a, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11bb, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11db, 0x13fb, 0x14bb, 0x12ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, + 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x133b, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x14db, 0x13bb, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133b, 0x135a, 0x135b, 0x147b, 0x143a, 0x133b, 0x0b5b, 0x135a, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x0b3a, 0x133b, 0x133b, 0x0c5b, 0x0cdb, 0x137a, 0x0b3a, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x133b, 0x133b, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x131a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0bfa, 0x14bb, 0x0bdb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, + 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b7a, 0x0c7b, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c1a, 0x0c5b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0c5a, 0x0c3a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x031a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0af9, 0x0afa, 0x0b5a, 0x0c7b, 0x0c1a, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0979, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0979, 0x0179, 0x0c3b, 0x09b9, 0x0179, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0959, 0x0199, 0x043a, 0x0a79, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0959, 0x0958, 0x0179, 0x0959, 0x01f9, 0x041a, 0x033a, 0x0958, 0x0159, 0x0178, 0x0159, 0x0979, 0x0958, 0x0179, 0x0979, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0179, 0x0159, 0x0158, 0x0959, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0159, 0x0159, 0x0958, 0x0218, 0x0bda, 0x037a, 0x01b9, 0x0159, 0x0158, 0x0158, 0x0178, 0x0138, 0x0158, 0x0158, 0x0158, + 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0159, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0319, 0x02d9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01f9, 0x03f9, 0x01d9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0178, 0x0399, 0x0339, 0x0178, 0x0158, 0x0158, 0x0158, 0x0938, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0178, 0x02b9, 0x03d9, 0x0278, 0x0138, 0x0157, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x01b8, 0x03b9, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0278, 0x0359, 0x0158, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0157, 0x02f8, 0x0359, 0x0157, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0136, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x01d7, 0x0379, 0x0318, 0x0177, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, + 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x03b8, 0x0338, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0399, 0x0358, 0x0318, 0x02f8, 0x02f8, 0x02f7, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, + 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x01b7, 0x01b6, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0257, 0x02f7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x01b6, 0x0318, 0x0277, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0217, 0x0358, 0x0237, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0197, 0x01b6, 0x02d7, 0x0337, 0x01f7, 0x0196, 0x0196, + 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d6, 0x00f5, 0x00f6, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f6, 0x00d5, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00d6, 0x00d6, 0x00f5, 0x00f6, 0x00f6, 0x00f6, 0x00d5, 0x00d5, 0x0156, 0x0337, 0x0155, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, + 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d5, 0x0255, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x02b5, 0x00f4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x0134, 0x02b5, 0x01d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x0134, 0x0255, 0x0275, + 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0153, 0x0253, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0092, 0x01d3, 0x0213, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0112, 0x0253, 0x01d3, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x0172, + 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x0090, 0x00b0, 0x0252, 0x00f1, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0212, 0x0171, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0191, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0252, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d1, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0232, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0130, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0232, 0x00f0, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x01f1, 0x0130, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0070, 0x01b1, 0x01f1, 0x0090, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0151, 0x0212, 0x00f0, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0130, 0x01d2, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x01f2, 0x0170, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x0130, 0x0252, 0x0110, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x00af, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x00af, 0x0212, 0x010f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x00cf, 0x0232, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0191, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x008f, 0x006e, 0x006f, 0x008f, 0x0110, 0x0212, 0x00cf, 0x006f, 0x006e, 0x006e, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x00cf, 0x01f1, 0x0191, 0x006e, 0x008e, 0x006f, 0x006f, 0x006e, 0x006e, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x00cf, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x0170, 0x01f1, 0x00ae, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x01f1, 0x01d1, 0x008e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x01f1, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0190, 0x01d1, 0x00af, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x008e, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x0191, 0x0212, 0x00af, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x0232, 0x008e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x004e, 0x00cf, 0x0212, 0x00af, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x010f, 0x0212, 0x00ef, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x0191, 0x0130, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01d1, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006d, 0x00ef, 0x0212, 0x010f, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004e, 0x006e, 0x006d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x010f, 0x01d1, 0x006e, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x01b1, 0x0170, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x00ae, 0x01f1, 0x0150, 0x004d, 0x004d, 0x004d, 0x004e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp b/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp new file mode 100644 index 000000000000..2308917b1313 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +#include "../../../inc/MarlinConfig.h" + +extern const uint8_t marlin_logo_112x38x1[532] = { + B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, + B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00111111,B11111111, + B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00011000,B00000000,B00011111,B11111111, + B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00001111,B11111111, + B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000111,B11111111, + B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000011,B11111111, + B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000001,B11111111, + B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000,B11111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B01111000,B00111100,B00000011,B11110000,B01111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00111100,B00000111,B11111100,B00111111, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00111100,B00001111,B11111110,B00011111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00111100,B00011111,B11111110,B00001111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00111100,B00111111,B00111111,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00111100,B00111110,B00011111,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B10111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B10111111,B11111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B10111111,B11111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B10111111,B11111100,B00001111,B00000011, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, + B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, + B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, + B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, + B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp new file mode 100644 index 000000000000..454e96402841 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp @@ -0,0 +1,89 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint16_t marlin_logo_195x59x16[11505] = { + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x20ab, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, + 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xacb8, 0xc53a, 0xc67c, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, + 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xbe3b, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, + 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xbe3b, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, + 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, + 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, + 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, + 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, + 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, + 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, + 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, + 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, + 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, + 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, + 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, + 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, + 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, + 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, + 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, + 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, + 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, + 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, + 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, + 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, + 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, + 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, + 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, + 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, + 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, + 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, + 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, + 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, + 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, + 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, + 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, + 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, + 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, + 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, + 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xec6f, 0xa8f1, 0xa8f1, 0xa8f1, + 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xec8e, 0xa911, 0xa911, 0xa911, + 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe42e, 0xa111, 0xa911, 0xa911, + 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc2b0, 0xa111, 0xa111, 0x80f0, + 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe2d, 0xa112, 0xa111, 0xa111, 0x60ef, + 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xcbcf, 0xa111, 0xa111, 0xa111, 0x28cd, + 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0xa171, 0xa111, 0x9911, 0x8110, 0x18ad, + 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe2d, 0xaa31, 0x9931, 0x9931, 0x9931, 0x38ce, 0x20ac, + 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfe8c, 0xfe8c, 0xf62d, 0xb270, 0x9931, 0x9931, 0x9912, 0x60ef, 0x20ac, 0x20ad, + 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe8c, 0xf5cd, 0xaa31, 0x9911, 0x9931, 0x9931, 0x8110, 0x28ad, 0x20ac, 0x18ac, + 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xcbcf, 0xa171, 0x9931, 0x9931, 0x9931, 0x9111, 0x28ad, 0x18ac, 0x20ac, 0x20ac, + 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x8111, 0x28cd, 0x20ac, 0x18ac, 0x18ac, 0x18ac, + 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9911, 0x610f, 0x28cc, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, + 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7910, 0x40ce, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, + 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9932, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x7910, 0x58cf, 0x30cc, 0x18ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp b/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp new file mode 100644 index 000000000000..452f47246920 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp @@ -0,0 +1,285 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t marlin_logo_228x255x2[14535] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x90, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x02, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x2f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x01, 0xff, 0xff, 0xf9, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0xff, 0xff, 0x80, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xf8, 0x00, 0x6f, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xaa, 0x50, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x07, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xf9, 0xbd, 0x00, 0xbf, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xbf, 0xff, 0xff, 0x00, 0x0b, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x46, 0xff, 0xff, 0xd0, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x2f, 0xff, 0xf8, 0x06, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfc, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0x1f, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xc2, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xf0, 0x2f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xfc, 0x07, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x55, 0x55, 0x56, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x40, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0xff, 0xff, 0xfd, 0xbf, 0xc0, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6f, 0xff, 0xff, 0xdf, 0xe0, 0x0b, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xf7, 0xf8, 0x02, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfd, 0xfd, 0x00, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x7f, 0x00, 0x1f, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdf, 0x80, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf7, 0xd0, 0x01, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 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, 0xff, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0xf0, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7c, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xed, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 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, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xbf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x87, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xf9, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0x40, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x00, 0x00, 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, 0xbf, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x7f, 0xff, 0x80, 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, 0xbf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x2f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0b, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0xaa, 0xa9, 0x55, 0x55, 0x40, 0x55, 0x56, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xd0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5a, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x90, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0xbf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x07, 0xff, 0xfd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0xff, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x01, 0xff, 0xff, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbf, 0xff, 0xff, 0xe0, 0x2f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xc0, 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, 0xbf, 0xff, 0xfe, 0x0b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0xbf, 0xff, 0xd0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xd0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x3f, 0xff, 0xf0, 0x00, 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, 0x2f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x02, 0xf8, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x80, 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x40, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xd0, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x40, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x03, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfd, 0x00, 0x05, 0xab, 0xff, 0xe4, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x02, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xfd, 0x6b, 0xff, 0xff, 0xe4, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x02, 0xff, 0xff, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe0, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xbf, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xd0, 0x00, 0x00, 0xbf, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfd, 0x00, 0x06, 0xff, 0xff, 0xaa, 0xa5, 0x40, 0x00, 0x05, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfc, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xd0, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x0b, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfd, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6a, 0x81, 0x6a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xd1, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x69, 0x55, 0x00, 0x00, 0x02, 0xff, 0x80, 0x03, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xd0, 0xbf, 0xf8, 0x00, 0x00, 0x16, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, 0x01, 0xff, 0xc0, 0x02, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0b, 0xff, 0xc0, 0x3f, 0xfc, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xff, 0xd0, 0x02, 0xf4, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xfe, 0x40, 0x0f, 0xff, 0x80, 0x3f, 0xfd, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xf4, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xbe, 0x90, 0x00, 0x2f, 0xff, 0x80, 0x7f, 0xfd, 0x0a, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0xbf, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0xf8, 0x00, 0x00, 0x0b, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x78, 0x00, 0x00, 0x0b, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3c, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xfd, 0x02, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x3c, 0x00, 0x00, 0x07, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xfc, 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xfc, 0x00, 0x2c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x6f, 0xff, 0xfc, 0x07, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfd, 0x00, 0x1c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x05, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xfe, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0c, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0xbf, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x08, 0x00, 0x00, 0x03, 0xff, 0xf4, 0x00, + 0x00, 0x0b, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, + 0x00, 0x7f, 0xfe, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x6a, 0xaa, 0xaa, 0xab, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x55, 0x55, 0x5a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, + 0x01, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf4, 0x00, + 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf0, 0x00, + 0x0f, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0x2f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0x7f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0xbf, 0x00, 0x00, 0x00, 0x00, 0x06, 0xaa, 0x90, 0x00, 0x00, 0x01, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0xfe, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xfe, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x0b, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x05, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, + 0xfc, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xc0, 0x00, 0x01, 0xff, 0xe4, 0x00, + 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xed, 0x00, + 0xfc, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xdf, 0x00, + 0xfc, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xea, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xdf, 0x80, + 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x01, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xc0, + 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xd0, 0x00, 0x07, 0xff, 0xff, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xd0, + 0xfc, 0x00, 0x00, 0xbf, 0xff, 0x40, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xef, 0xf0, + 0xfc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x2f, 0xff, 0xc0, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x06, 0xaa, 0xa0, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xbf, 0xf0, + 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xfe, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xf8, 0x02, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xbf, 0x54, + 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xd0, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x7f, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x07, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x3f, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xd0, 0x00, 0x01, 0xff, 0x3e, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xf8, 0x00, 0x7f, 0xe0, 0x00, 0x01, 0xfe, 0x3e, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xf8, 0x00, 0x2f, 0xf0, 0x00, 0x01, 0xfe, 0x7d, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x3f, 0xff, 0xfe, 0x40, 0x7f, 0xff, 0xfd, 0x00, 0x00, 0xbf, 0xff, 0xf4, 0x07, 0xff, 0xff, 0x82, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xfe, 0x01, 0xbf, 0xff, 0xf0, 0x03, 0xff, 0xf8, 0x00, 0x2f, 0xf0, 0x00, 0x01, 0xfd, 0x7d, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x7f, 0xff, 0xf4, 0x00, 0x0b, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0xbf, 0xff, 0xc2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xf4, 0x00, 0xbf, 0xf8, 0x00, 0x2f, 0xf4, 0x00, 0x01, 0xfc, 0x7c, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xbf, 0xff, 0xc0, 0x00, 0x02, 0xff, 0xff, 0x00, 0x01, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xc2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x0b, 0xff, 0xf8, 0x00, 0x3f, 0xf8, 0x00, 0x1f, 0xf8, 0x00, 0x01, 0xfc, 0x3c, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbf, 0xff, 0x40, 0x01, 0xff, 0xfd, 0x00, 0x00, 0x1f, 0xff, 0xd2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x0f, 0xf8, 0x00, 0x07, 0xfc, 0x00, 0x02, 0xfc, 0x3e, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe1, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xd2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xf8, 0x00, 0x02, 0xfc, 0x00, 0x02, 0xf8, 0x1f, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x40, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0xfe, 0x00, 0x02, 0xf4, 0x0b, 0x80, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x7f, 0x00, 0x03, 0xf4, 0x03, 0xc0, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0xe0, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x0b, 0xc0, 0x03, 0xf0, 0x00, 0x34, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x02, 0xe0, 0x03, 0xe0, 0x00, 0x0c, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe2, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x74, 0x07, 0xd0, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe1, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x08, 0x07, 0xc0, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xff, 0xff, 0x80, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc0, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xbf, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfd, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x80, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x7f, 0xff, 0xfd, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x40, 0x0b, 0xff, 0xf0, 0x00, 0x7f, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x40, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xfa, 0xa8, 0x1f, 0xff, 0xea, 0xab, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x0b, 0xff, 0xf5, 0x55, 0xbf, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x02, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xfd, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x40, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x01, 0xbf, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x07, 0xf0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x00, 0x6a, 0xa9, 0x00, 0x00, 0x00, 0x2a, 0xaa, 0x40, 0x00, 0x00, 0x0a, 0xaa, 0x90, 0x00, 0x00, 0x06, 0xaa, 0xa8, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6a, 0x46, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x02, 0xaa, 0xa0, 0x00, 0x0b, 0xf2, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xbf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xd3, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc7, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x47, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0b, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x07, 0xd0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x02, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0xbf, 0xfa, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x56, 0xff, 0xe0, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x1f, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x02, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0b, 0x80, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2b, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x1f, 0x40, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xab, 0xff, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0xa5, 0x55, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfa, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xd0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xea, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfd, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x03, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x02, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x02, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x01, 0xff, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xbf, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xbf, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xf0, 0x00, 0x7f, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xfc, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x3f, 0xfe, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf4, 0x0f, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x0f, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x0b, 0xff, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0x0b, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcb, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xd7, 0xff, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xf7, 0xff, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf4, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp b/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp new file mode 100644 index 000000000000..c84653f8a5b9 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp @@ -0,0 +1,285 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t marlin_logo_228x255x4[29070] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x9e, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xaf, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x77, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xd8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xdf, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x84, 0x32, 0x10, 0x00, 0x46, 0x89, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x28, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x83, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x10, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x38, 0xe8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x22, 0x11, 0x11, 0x12, 0x35, 0x57, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x4b, 0xef, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xef, 0xff, 0xff, 0xff, 0xed, 0xba, 0x98, 0x64, 0x00, 0x05, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xc5, 0x00, 0x01, 0x6c, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x30, 0x37, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x9f, 0xe7, 0x10, 0x01, 0x8d, 0xff, 0xfd, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x23, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x10, 0x01, 0x8e, 0xff, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x60, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x0e, 0xff, 0xff, 0xf8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x39, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x7b, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x88, 0x50, 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, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x19, 0xff, 0xff, 0xfe, 0x37, 0xdf, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x3c, 0xff, 0xff, 0xe3, 0x08, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x7f, 0xff, 0xfe, 0x30, 0x3a, 0xff, 0xf8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 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, 0x83, 0xdf, 0xff, 0xe3, 0x00, 0x7f, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x76, 0x54, 0x44, 0x44, 0x55, 0x66, 0x68, 0x89, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2a, 0xff, 0xff, 0x50, 0x03, 0xdf, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x58, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xe0, 0x00, 0x1b, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0xff, 0xf9, 0x00, 0x00, 0x8f, 0xff, 0xfc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x6e, 0xff, 0x80, 0x00, 0x08, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xf6, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0x5c, 0xff, 0x20, 0x00, 0x04, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xff, 0xf4, 0xdf, 0xb0, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc8, 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, 0x29, 0xff, 0xfe, 0x4f, 0xf7, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xeb, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xe6, 0xff, 0x30, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc8, 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, 0x4d, 0xfd, 0x6f, 0xd0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xca, 0xf5, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xfc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x9a, 0xce, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x2f, 0x80, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x57, 0x89, 0x91, 0x7f, 0xe7, 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, 0x07, 0xf2, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x6b, 0xef, 0xfe, 0xb7, 0x18, 0xfb, 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, 0xca, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x8e, 0xff, 0xea, 0x51, 0x01, 0x8b, 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, 0x2f, 0x40, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8e, 0xff, 0xe8, 0x20, 0x00, 0x06, 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, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xcf, 0xff, 0xfa, 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, 0xd5, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xdf, 0xff, 0xfd, 0x50, 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, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8c, 0xff, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x47, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x00, 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, 0xa0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfe, 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, 0x14, 0x68, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x8b, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xfe, 0xdb, 0xaa, 0x98, 0x88, 0x87, 0x66, 0x55, 0x54, 0x44, 0x43, 0x33, 0x44, 0x55, 0x67, 0x78, 0x89, 0xbc, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8f, 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, 0xff, 0xff, 0xb8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xcf, 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, 0xfb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xd8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x89, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x56, 0x88, 0x9b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 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, 0x02, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x35, 0x68, 0x8b, 0xbd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x23, 0x56, 0x78, 0x9b, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x68, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x08, 0xff, 0xff, 0xf9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x8f, 0xfe, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x88, 0x00, 0x38, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 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, 0x01, 0x8e, 0xb1, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x8e, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x07, 0xdf, 0xff, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xfd, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xdf, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x8f, 0xff, 0xf7, 0x00, 0x00, 0x13, 0x57, 0x8a, 0xbc, 0xde, 0xff, 0xeb, 0x50, 0x6d, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 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, 0x1a, 0xff, 0xff, 0xc4, 0x58, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xca, 0x63, 0x00, 0x00, 0x00, 0x8f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x08, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x08, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xff, 0xd1, 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, 0xff, 0xf9, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x50, 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, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0xdf, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x90, 0x00, 0x00, 0x00, 0xbf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x9f, 0xff, 0xff, 0xff, 0xd7, 0x10, 0x00, 0x01, 0x7b, 0xce, 0xee, 0xee, 0xdd, 0xba, 0x98, 0x88, 0x65, 0x43, 0x32, 0x21, 0x12, 0x33, 0x57, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x8f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xe7, 0x10, 0x00, 0x00, 0x2a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 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, 0x1f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x8f, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xe7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x8b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x78, 0x88, 0x82, 0x04, 0x78, 0x98, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0x20, 0x00, 0x00, 0x4f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xfb, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x09, 0xff, 0xff, 0xf7, 0x07, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x35, 0x77, 0x78, 0x87, 0x65, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0x80, 0x00, 0x00, 0x0d, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xfe, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x4f, 0xff, 0xff, 0xf5, 0x00, 0x8f, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x78, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x98, 0x52, 0x00, 0x06, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x08, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xef, 0xff, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x71, 0x00, 0xaf, 0xff, 0xff, 0xe1, 0x00, 0x2f, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x37, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x65, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x08, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xf9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, 0x00, 0x02, 0xef, 0xff, 0xff, 0xb0, 0x00, 0x3f, 0xff, 0xff, 0xf5, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x05, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xff, 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, 0x5f, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x89, 0xbc, 0xca, 0x84, 0x10, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x80, 0x00, 0x7f, 0xff, 0xff, 0xf4, 0x01, 0x89, 0xab, 0xbc, 0xde, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 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, 0xcf, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0x40, 0x00, 0x9f, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x35, 0x68, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0xdf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfc, 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, 0x3f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0xdf, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x6f, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfa, 0x00, 0x03, 0xff, 0xff, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x58, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x1f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 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, 0xaf, 0xff, 0xff, 0xf6, 0x00, 0x08, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0d, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x0b, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x08, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x23, 0x55, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x5f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xdd, 0xdd, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xdd, 0xcc, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x8c, 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, 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, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x8e, 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, 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, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, + 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfb, 0xa9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa8, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, + 0x00, 0x06, 0xef, 0xff, 0xe8, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, + 0x00, 0x6e, 0xff, 0xfb, 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, 0x0b, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, + 0x03, 0xef, 0xfe, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, + 0x0b, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, + 0x5f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, + 0xaf, 0xfe, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x9b, 0xba, 0x85, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x89, 0xba, 0xa9, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x48, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0xff, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xae, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1a, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, + 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, + 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x01, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x01, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfb, 0x00, 0x00, 0x00, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x02, 0x8d, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf9, 0x50, 0x00, 0x00, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x04, 0xce, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf8, 0xd6, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x8e, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf7, 0xfe, 0x20, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf7, 0xff, 0x80, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x00, 0x00, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x31, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 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, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x35, 0x55, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xf8, 0xff, 0xe0, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x05, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xfa, 0xff, 0xf6, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x35, 0x44, 0x20, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x9f, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xda, 0xff, 0xfd, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xfd, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0xef, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xc8, 0x20, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x68, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4a, 0xef, 0xff, 0xff, 0xff, 0xa6, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x5f, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xad, 0xff, 0xff, 0x20, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x09, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0x8d, 0xff, 0x47, 0x60, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x05, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x5f, 0xfe, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x01, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x3f, 0xfc, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0xef, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xfe, 0x3f, 0xf9, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x5f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xfb, 0x3f, 0xf8, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x01, 0xcf, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x0a, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf8, 0x4f, 0xf5, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x43, 0x23, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x73, 0x32, 0x7d, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x33, 0x35, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0x90, 0x00, 0x00, 0x08, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x06, 0xff, 0xf5, 0x4f, 0xf4, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0xbf, 0xff, 0xff, 0x90, 0x00, 0x00, 0x09, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf2, 0x4f, 0xf2, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xf2, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x0c, 0xff, 0xff, 0x90, 0x00, 0x00, 0x07, 0xff, 0xff, 0x90, 0x00, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x1f, 0xf3, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf4, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x01, 0xdf, 0xff, 0x90, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x08, 0xff, 0xc0, 0x0d, 0xf8, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf7, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x6f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x0a, 0xff, 0x90, 0x04, 0xfe, 0x00, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x08, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x90, 0x00, 0x00, 0x00, 0x01, 0xdf, 0xf9, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x60, 0x00, 0x9f, 0x80, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x09, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xfe, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x50, 0x00, 0x0c, 0xe2, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0a, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0x10, 0x00, 0x01, 0xda, 0x00, + 0xff, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xf2, 0x00, 0x00, 0x2f, 0xfc, 0x00, 0x00, 0x00, 0x3e, 0x50, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xfb, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xd2, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x08, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x50, 0x00, 0x5f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x11, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x06, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x7f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xd0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xba, 0xa9, 0x80, 0x06, 0xff, 0xff, 0xff, 0xf9, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xf9, 0x84, 0x10, 0x9f, 0xff, 0xff, 0xfe, 0x66, 0x66, 0x66, 0xaf, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0d, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xe0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf0, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf1, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf1, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x5f, 0xff, 0x30, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x69, 0xaa, 0xaa, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xaa, 0xaa, 0xaa, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x89, 0x9a, 0xaa, 0x90, 0x03, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x78, 0xaa, 0x60, 0x6a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xaa, 0xaa, 0xa8, 0x30, 0x00, 0x00, 0x00, 0xbf, 0xfc, 0x08, 0xef, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8f, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf6, 0x3f, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1f, 0xff, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xff, 0xd1, 0x4f, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0xff, 0xfc, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xcf, 0xff, 0x60, 0x6f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xbf, 0xff, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xff, 0xf8, 0x00, 0x6f, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0a, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0x90, 0x00, 0x6f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x9f, 0xff, 0xfd, 0x88, 0x64, 0x44, 0x33, 0x22, 0x22, 0x21, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x11, 0x11, 0x11, 0x11, 0x12, 0x22, 0x22, 0x33, 0x45, 0x56, 0x79, 0xef, 0xff, 0xf8, 0x10, 0x00, 0x6f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 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, 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, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x00, 0x00, 0x7f, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x19, 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, 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, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x8f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0xbd, 0xef, 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, 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, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, 0x00, 0x00, 0x00, 0x04, 0xef, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x78, 0x88, 0x89, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x8e, 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, 0xff, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 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, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xef, 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, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xec, 0xca, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x9a, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb9, 0x86, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x56, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xef, 0xff, 0xff, 0xff, 0xff, 0xca, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7b, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xfb, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8c, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 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, 0x00, 0x08, 0xff, 0xff, 0xff, 0xd8, 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, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xb4, 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, 0x5f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xfe, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xfe, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 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, 0x06, 0xe9, 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, 0x08, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xea, 0x98, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xf2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x00, 0x00, 0x5f, 0xff, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf2, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xef, 0xff, 0xff, 0xff, 0xff, 0x50, 0x00, 0x08, 0xff, 0xff, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x05, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x00, 0x03, 0xff, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x60, 0x01, 0xff, 0xff, 0xff, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0xdf, 0xff, 0xff, 0xf2, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xfa, 0x00, 0xbf, 0xff, 0xff, 0xf7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8f, 0xff, 0xff, 0xfa, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfe, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xfe, 0x6f, 0xff, 0xff, 0xff, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xfb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xff, 0xff, 0xff, 0xf6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xff, 0xff, 0xf5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xf2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0x50, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xfe, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xff, 0xf9, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xfe, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xfa, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xf4, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xc0, 0x00, 0x00 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp new file mode 100644 index 000000000000..199433a802fd --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp @@ -0,0 +1,270 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint16_t marlin_logo_320x240x16[76800] = { + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x28ee, 0x8252, 0xcb54, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x394f, 0xb313, 0xd395, 0x7211, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x496f, 0xcb55, 0xd395, 0xbb54, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00fa, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x61d0, 0xd395, 0xd395, 0xd395, 0x69f1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x61d0, 0xd395, 0xd395, 0xd396, 0xd375, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ce, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10f2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8252, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x5190, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x412f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0355, 0x190f, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f4, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x496f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x11d1, 0x03b7, 0x0a93, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x28ee, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9ab3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x00f9, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x10af, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x7a31, 0xd395, 0xd395, 0xd375, 0xdb95, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11d1, 0x03b8, 0x03b7, 0x03b8, 0x0a94, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x00f9, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xd395, 0xb313, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x190e, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0xa2d3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xa2d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a94, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x61d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0397, 0x03b8, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x59d0, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x011a, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x61b1, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8a92, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x188d, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0xaad3, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03d7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0x7231, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x08d3, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x20ae, 0x8a92, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x7a31, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x28ee, 0xc374, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xa2d3, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ce, 0x194f, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x61d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x69f1, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x02f5, 0x03b7, 0x03b8, 0x0356, 0x114f, 0x18ad, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x9ab3, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x190f, 0x0377, 0x0397, 0x03b8, 0x0398, 0x0397, 0x0b77, 0x18ce, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0bb7, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x4970, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x1253, 0x0b78, 0x0b98, 0x0b78, 0x0b98, 0x0b98, 0x1378, 0x11f2, 0x18ad, 0x18ad, 0x0b98, 0x0b78, 0x0b78, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0b98, 0x1378, 0x0b78, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x4970, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0x8252, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1ab5, 0x1b78, 0x1b58, 0x1358, 0x1b78, 0x1378, 0x1358, 0x1a13, 0x18ae, 0x18ae, 0x1358, 0x1358, 0x1378, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1358, 0x1358, 0x1358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd395, 0xc354, 0x5990, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1a54, 0x1b38, 0x1b38, 0x2338, 0x1b38, 0x1b58, 0x2338, 0x21d2, 0x18ad, 0x18ad, 0x2338, 0x2338, 0x2358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x2339, 0x2358, 0x2338, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xa2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x2150, 0x2b18, 0x2b39, 0x2b18, 0x2b19, 0x2b19, 0x2af8, 0x18ce, 0x18ad, 0x18ad, 0x2b19, 0x2b18, 0x2b19, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x2192, 0x2b19, 0x2b19, 0x2b18, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xbb34, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2192, 0x2b19, 0x3319, 0x32f9, 0x2a15, 0x18ef, 0x20ad, 0x18ad, 0x18ad, 0x32f9, 0x3319, 0x32f9, 0x18ad, 0x18ad, 0x18ad, 0x2191, 0x3319, 0x2af9, 0x3319, 0x2af9, 0x2a97, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, + 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x3ad9, 0x3ad9, 0x3ad9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x3af9, 0x3ad9, 0x3ad9, 0x18ad, 0x20ad, 0x3215, 0x3ad9, 0x3af9, 0x3ada, 0x3ad9, 0x3277, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x4950, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xaab3, 0x20ce, 0x18ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x03b7, 0x0397, + 0x18ad, 0x18ad, 0x08f5, 0x0139, 0x011a, 0x0117, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x42d9, 0x42b9, 0x42b9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x42b9, 0x42b9, 0x42ba, 0x18ae, 0x31f5, 0x42da, 0x42d9, 0x42b9, 0x42d9, 0x3a77, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x5991, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xd355, 0x9252, 0x30ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, + 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x4ab9, 0x4a9a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4aba, 0x4aba, 0x4a9a, 0x4257, 0x4a99, 0x4a9a, 0x4a9a, 0x4aba, 0x4237, 0x20ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x69f1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xcb14, 0x4130, 0x20af, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x42b9, 0x4a99, 0x42b9, 0x42ba, 0x18ad, 0x18ad, + 0x18ad, 0x18af, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x527a, 0x527a, 0x527a, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x527a, 0x527a, 0x529a, 0x527a, 0x527a, 0x527a, 0x527a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18d2, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x8253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0x7a11, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x621a, 0x6a3b, 0x6a3b, + 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x20ae, 0x08f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x5a5b, 0x5a5a, 0x5a7a, 0x2910, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x5a5a, 0x5a7b, 0x5a5a, 0x5a5a, 0x5a5a, 0x5a5a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x091a, 0x18f2, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x8232, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xa293, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x89bc, 0x89bc, 0x91bc, 0x89bc, 0x899c, + 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x623a, 0x623b, 0x625a, 0x621a, 0x2910, 0x18cd, 0x18ad, 0x18ad, 0x623b, 0x623a, 0x625a, 0x623b, 0x623b, 0x51f8, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x0917, 0x18d2, 0x18d2, 0x0918, 0x091a, 0x0918, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30d0, 0x30f0, 0x30f0, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0x9253, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0xa93d, + 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x59d8, 0x6a1b, 0x6a1b, 0x6a1b, 0x6a1b, 0x4133, 0x18ad, 0x18ad, 0x6a3b, 0x6a1b, 0x6a1b, 0x6a1b, 0x51b6, 0x20cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d3, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18d1, 0x20ce, 0x20ce, 0x18d1, 0x093a, 0x093a, 0x28ef, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x9273, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0xd335, 0xd334, 0xd334, 0xd314, 0xd315, 0xaa93, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ce, 0x61b8, 0x721b, 0x71fb, 0x721b, 0x721b, 0x4133, 0x20ad, 0x71fb, 0x721b, 0x71fb, 0x4174, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x011a, 0x18d1, 0x20ae, 0x20ce, 0x20f1, 0x093a, 0x093a, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0xaaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ae, 0x20ad, 0x20ad, 0x20ae, 0x30ee, 0x6150, 0x81b1, 0xa1f2, 0xc233, 0xca53, 0xca54, 0xca53, 0xc233, 0xa1f2, 0x8191, 0x512f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ce, 0x69b9, 0x81fb, 0x79db, 0x79dc, 0x81fc, 0x5976, 0x79db, 0x79dc, 0x81dc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0918, 0x0119, 0x0917, 0x18d0, 0x20d0, 0x0917, 0x093a, 0x1138, 0x28cf, 0x30cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0xaad4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd315, 0xd314, 0x69b2, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x410f, 0x6990, 0x99f2, 0xc253, 0xca74, 0xd274, 0xca74, 0xd253, 0xca53, 0xca53, 0xca53, 0xd233, 0xd253, 0xca53, 0xd233, 0xca33, 0xc213, 0x8991, 0x410f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x7199, 0x89db, 0x89bc, 0x81bc, 0x89bc, 0x89bc, 0x89bc, 0x89bc, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d2, 0x0119, 0x0119, 0x093a, 0x093a, 0x093a, 0x093a, 0x20f2, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xcad4, 0x5971, 0x30f0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x38ef, 0x79b1, 0xba53, 0xca94, 0xca94, 0xca74, 0xd273, 0xd273, 0xca73, 0xca54, 0xca53, 0xca54, 0xca53, 0xca33, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xd213, 0xca13, 0xca13, 0xa1b2, 0x490f, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x7979, 0x919c, 0x919c, 0x91bc, 0x919c, 0x899c, 0x89bc, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x18f2, 0x0919, 0x091a, 0x091a, 0x0919, 0x20f3, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x4112, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd314, 0xd2f5, 0xd2f4, 0xd2f4, 0x4930, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x4130, 0x89f1, 0xd294, 0xd294, 0xca93, 0xca74, 0xd274, 0xca74, 0xca74, 0xca53, 0xca73, 0xd253, 0xd254, 0xca53, 0xca53, 0xca54, 0xc274, 0x9b36, 0x83b8, 0x6419, 0x6c39, 0x6439, 0x6c1a, 0x8b57, 0xb295, 0xca13, 0x9191, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x28ae, 0x8159, 0x917c, 0x997c, 0x997c, 0x999c, 0x999c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20d0, 0x20d1, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd2f4, 0xd2f4, 0xd315, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d5, 0x79d2, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28ef, 0x28f0, 0x28cf, 0x5150, 0xaa32, 0xd293, 0xd294, 0xd294, 0xca93, 0xca74, 0xca74, 0xca74, 0xca74, 0xd274, 0xd254, 0xca53, 0xca54, 0xb2d5, 0x83b8, 0x44fc, 0x1dbe, 0x063f, 0x0cdb, 0x0b76, 0x1377, 0x1377, 0x0b76, 0x1356, 0x0b76, 0x0b77, 0x23f8, 0x6991, 0x510f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x8939, 0xa17c, 0xa17c, 0xa15d, 0xa15d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8a54, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0x5951, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x4130, 0x91f2, 0xd294, 0xd294, 0xca94, 0xca74, 0xca94, 0xca94, 0xca74, 0xd274, 0xd274, 0xd274, 0xd253, 0xb2d5, 0x7419, 0x257d, 0x063f, 0x061f, 0x057d, 0x12b5, 0x190f, 0x18ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x913a, 0xa93d, 0xa95d, 0xa95c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xcab4, 0x5172, 0x3911, 0x38f1, 0x38f0, 0x30f0, 0x81d2, 0xc294, 0xd294, 0xd293, 0xd294, 0xd294, 0xca93, 0xca93, 0xd274, 0xd274, 0xca73, 0xd274, 0x83d8, 0x353d, 0x061f, 0x063f, 0x063f, 0x063f, 0x4c5a, 0x4970, 0x20ae, 0x20ae, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xb11d, 0xb11d, 0xb11d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6b36, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xcad4, 0xcab4, 0x5972, 0x3911, 0x5151, 0xb253, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xd274, 0xc294, 0x645a, 0x1dbe, 0x063f, 0x063f, 0x063f, 0x1dbe, 0x6459, 0xc274, 0x99d2, 0x28ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0xb8fe, 0xb8fd, 0xb8fe, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253b, 0x465c, 0x6d7b, 0x6d9a, 0x6d9a, 0x6d7a, 0x84f9, 0x9c78, 0x9c77, 0x9c78, 0x9c78, 0x9c57, 0x9c78, 0x9c58, 0x9c58, 0xbbb6, 0xd334, 0xd315, 0xd334, 0xd315, 0xd314, 0xd315, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xcad4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2d4, 0x91f3, 0x5972, 0xca74, 0xd2b4, 0xd2b4, 0xd294, 0xca94, 0xd294, 0xd294, 0xca94, 0xca74, 0xc2b4, 0x6c5a, 0x0dff, 0x063f, 0x063f, 0x063f, 0x353d, 0x83b8, 0xca53, 0xca33, 0x89b1, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0xc0de, 0xc0fe, 0xc0dd, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00fa, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x38f1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4d1a, 0x6d9a, 0x94b9, 0x9c98, 0x9c77, 0x9c78, 0x9c78, 0x9c78, 0x94b8, 0x6d7a, 0x6d7a, 0x6d7b, 0x367c, 0x367d, 0x1efe, 0x077f, 0x075f, 0x1ede, 0x363d, 0x6d3a, 0x9c17, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xcad4, 0xd2b3, 0xcab4, 0xc294, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca74, 0xca74, 0xca74, 0x7bd8, 0x0dff, 0x063f, 0x061f, 0x063f, 0x4cbb, 0x9b57, 0xd233, 0xca33, 0xca53, 0x6150, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8be, 0xc8de, 0xc8be, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xa2b5, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xbb96, 0xa437, 0x74f9, 0x4dbc, 0x2e7e, 0x0edf, 0x559b, 0x8498, 0xc335, 0xd2f4, 0xd2d4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2b5, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xbab4, 0xbaf6, 0xca94, 0xd294, 0xca94, 0xd273, 0x9b76, 0x1dbe, 0x061f, 0x063f, 0x0ddf, 0x643a, 0xb2d5, 0xca54, 0xd253, 0xca53, 0xc294, 0x59b1, 0x28ce, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x40b0, 0xa09a, 0xd0be, 0xd09e, 0xd0be, 0xb89c, 0x78b5, 0x28ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd335, 0xd315, 0xd314, 0xd315, 0xd2f5, 0xd2f5, 0xd2f4, 0x9bf7, 0x6d1a, 0x2e3d, 0x45bc, 0x9418, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xc2d4, 0x4cdb, 0x7bd8, 0x9b57, 0x44fc, 0x063f, 0x063f, 0x1dbe, 0x83d8, 0xc294, 0xca53, 0xca54, 0xca33, 0xca53, 0xb2b5, 0x33b8, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188e, 0x20cd, 0x10d1, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x40b0, 0xd07d, 0xd87e, 0xd89f, 0xd89f, 0xe07f, 0xd89e, 0xd89f, 0xb87b, 0x28ae, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xbb14, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd314, 0xd335, 0xd315, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xc335, 0x8478, 0x4d7b, 0x4d5b, 0xab96, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xca94, 0xcab4, 0xd294, 0xd294, 0xd273, 0xc2b4, 0x5c9a, 0x061f, 0x061f, 0x063f, 0x7419, 0xd273, 0xd273, 0xca53, 0xca53, 0xd233, 0xca53, 0xaaf6, 0x153c, 0x2951, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x10b0, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb07a, 0xe85f, 0xe85f, 0xe07f, 0xe85f, 0xe87f, 0xe07f, 0xe85f, 0xe07f, 0x9898, 0x20ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd315, 0xcb34, 0xd315, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xd2d4, 0xbb55, 0x7499, 0x35dc, 0x8439, 0xc2f4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xca93, 0xd294, 0xd274, 0xca74, 0x9b76, 0x061f, 0x061f, 0x83d8, 0xc295, 0xca53, 0xca53, 0xca53, 0xca53, 0x7bb8, 0x063f, 0x2a34, 0x30f0, 0x30f0, 0x30ef, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x38b0, 0xf05f, 0xe83f, 0xf03f, 0xf05f, 0xf05f, 0xf03f, 0xf03f, 0xf03f, 0xf05f, 0xe83f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xbb35, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xcad4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2d4, 0xcab4, 0xd2b4, 0xcab4, 0xcab4, 0x8bf8, 0x3d5c, 0x6499, 0xc2d4, 0xd294, 0xd294, 0xca74, 0xca74, 0xd274, 0xca74, 0xca74, 0x54bb, 0x5c9a, 0x353d, 0x1dbe, 0x4cbb, 0x9377, 0x9b36, 0x44fc, 0x061f, 0x1bf9, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f4, 0x10f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x5092, 0xf83f, 0xf83f, 0xf03f, 0xf83f, 0xf83f, 0xf83f, 0xf83f, 0xf81f, 0xf03f, 0xf83f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69b3, 0xc355, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd2f5, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0x9b97, 0x453c, 0x6c59, 0xc2b4, 0xca74, 0xd274, 0xd273, 0xca73, 0xd273, 0xc294, 0x6c39, 0xc294, 0xca53, 0x8b98, 0x4cbb, 0x0dff, 0x063f, 0x0d7e, 0x3972, 0x3911, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x5092, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0x9b77, 0x44dc, 0x73f9, 0xca73, 0xca74, 0xd254, 0xca73, 0xca53, 0xc294, 0x351c, 0x6c3a, 0xc294, 0xd253, 0xca34, 0x83b8, 0x5a55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4090, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x28af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69d3, 0xc355, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xcb55, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcad4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xcab4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0xd274, 0xca74, 0x8b78, 0x447c, 0xa316, 0xd253, 0xd253, 0xca54, 0xca53, 0xc294, 0x257d, 0x0ddf, 0x83b8, 0xd233, 0xca33, 0xca33, 0xba13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x30d0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x00f9, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0xd03c, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xd03c, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xaad4, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd2b4, 0xca94, 0xca94, 0xd294, 0xca74, 0xca73, 0xca74, 0xd274, 0xc295, 0x6bb9, 0x6b99, 0xca54, 0xca53, 0xd254, 0xca33, 0xc294, 0x24fd, 0x063f, 0x351d, 0xb295, 0xca13, 0xca13, 0xca13, 0xb9f3, 0x7992, 0x4111, 0x4112, 0x38f1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x4090, 0xf03f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x6073, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xcb55, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd314, 0xd335, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca74, 0xca74, 0xca74, 0xca73, 0xca73, 0xca53, 0xca53, 0xca74, 0xaab6, 0x5b7a, 0xba74, 0xca53, 0xca33, 0xca33, 0xc254, 0x4bfb, 0x059f, 0x0d7f, 0x8b57, 0xc9f3, 0xca13, 0xc9f3, 0xc9f3, 0xa9b3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4091, 0xe01d, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x7074, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ae, 0x18cd, 0x20ae, 0x20cd, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xb2f4, 0xd395, 0xdb95, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0x84f9, 0x467d, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x1f1e, 0x367d, 0x367c, 0x4ddb, 0x653a, 0x8498, 0x9bf7, 0xc2f5, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca73, 0xd253, 0xd254, 0xca74, 0xca53, 0xca53, 0xca53, 0xd253, 0x72d9, 0xaa76, 0xca33, 0xd233, 0xca13, 0xca33, 0x1c7e, 0x059f, 0x05ff, 0x5c7a, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10b0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x7074, 0x9077, 0x8856, 0x8876, 0x388f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x3911, 0x4111, 0x4132, 0x6193, 0xc355, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x271d, 0x07ff, 0x07ff, 0x07bf, 0x079f, 0x079f, 0x077f, 0x079f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x079f, 0x1efe, 0x461c, 0x6d1a, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca73, 0xd274, 0xca74, 0xca53, 0xd254, 0xca54, 0xd253, 0xca53, 0xca33, 0xa275, 0x9a76, 0xca33, 0xca13, 0xca33, 0x9ad6, 0x04ff, 0x05bf, 0x063f, 0x357c, 0xc254, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ae, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x0117, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xcb55, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xcb55, 0xd334, 0xcb55, 0xac17, 0x0fbf, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x365c, 0x74b9, 0xb315, 0xca73, 0xca54, 0xca54, 0xca53, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xb235, 0xaa16, 0xca33, 0xca13, 0xca13, 0x7b37, 0x055f, 0x05ff, 0x067f, 0x25dd, 0xa2f5, 0xd1d3, 0xc9f3, 0xc9d3, 0xc9d2, 0xc9d3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ce, 0x20ad, 0x10f4, 0x011a, 0x0119, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61b3, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0x8cb8, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06df, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x071f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x071f, 0x2dfd, 0x7419, 0xb2b5, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0xd233, 0xca14, 0xa215, 0xca13, 0xca13, 0xc9f3, 0x8338, 0x05bf, 0x063f, 0x06bf, 0x0e9f, 0xaad5, 0xc9d3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b2, 0xb1b2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18cf, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x20ae, 0x18d0, 0x0119, 0x0119, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3111, 0x38f1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xc395, 0x5dfa, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06bf, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x06ff, 0x06bf, 0x065f, 0x05bf, 0x443c, 0x8af7, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca13, 0x99b6, 0xc9f3, 0xca13, 0xc9f3, 0x4c3b, 0x061f, 0x069f, 0x06ff, 0x0ebe, 0xa2d5, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9b2, 0xc1b3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x20ae, 0x20ad, 0x18ce, 0x0119, 0x0119, 0x10d3, 0x20ce, 0x20ae, 0x10f4, 0x0119, 0x011a, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067f, 0x067f, 0x067f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x065f, 0x065f, 0x067f, 0x067f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x065f, 0x05ff, 0x053f, 0x049f, 0x1bbe, 0x8298, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0xd1f3, 0x99b6, 0xc9f3, 0xc9f3, 0xb254, 0x0d9f, 0x067f, 0x06df, 0x06ff, 0x0ebf, 0xa2d5, 0xc9d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011a, 0x10f5, 0x20ce, 0x20cf, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xac37, 0x6d9a, 0x2efe, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x075f, 0x073f, 0x071f, 0x06df, 0x06bf, 0x069f, 0x067f, 0x065f, 0x065f, 0x063f, 0x063f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x063f, 0x063f, 0x063f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x067f, 0x063f, 0x05df, 0x055f, 0x04bf, 0x043f, 0x037f, 0x1abe, 0x7a18, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc1f4, 0x7178, 0xc9f2, 0xd1f3, 0x8338, 0x061f, 0x06bf, 0x06ff, 0x071f, 0x0edf, 0xa2d5, 0xc9b3, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x18ce, 0x0918, 0x011a, 0x011a, 0x0919, 0x011a, 0x0917, 0x20cf, 0x28ae, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xa2b4, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xc3b6, 0x8519, 0x4e3c, 0x0f9f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x06ff, 0x06bf, 0x069f, 0x067f, 0x065f, 0x063f, 0x061f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05df, 0x057f, 0x04ff, 0x047f, 0x03df, 0x031f, 0x025f, 0x19de, 0x79b8, 0xc9f3, 0xca13, 0xc9f3, 0xb9d3, 0xa1b5, 0xc9d3, 0xc9f3, 0x4c5b, 0x065f, 0x06df, 0x071f, 0x071f, 0x0edf, 0xa2b5, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc993, 0xc992, 0xb172, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x10f3, 0x10f3, 0x10d2, 0x20ae, 0x18ae, 0x20ae, 0x18ce, 0x20ce, 0x20ce, 0x20ce, 0x18f2, 0x10f4, 0x1114, 0x18f3, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xc3b5, 0x7d59, 0x36bd, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x071f, 0x06de, 0x069e, 0x067e, 0x065e, 0x063f, 0x063f, 0x061e, 0x05ff, 0x05df, 0x05bf, 0x05bf, 0x059f, 0x059f, 0x059f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x059f, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05bf, 0x057f, 0x04ff, 0x049f, 0x03ff, 0x037f, 0x02bf, 0x021f, 0x017f, 0x213d, 0x9996, 0xc9f3, 0xc9f3, 0xb9d4, 0x99b6, 0xc9d3, 0xc213, 0x0dbf, 0x069f, 0x06ff, 0x071f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xa972, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20af, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xaab5, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0x94d8, 0x467c, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x06de, 0x06be, 0x067e, 0x067e, 0x065e, 0x063e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059f, 0x057f, 0x057f, 0x055f, 0x055f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x055f, 0x055f, 0x055f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x055f, 0x04ff, 0x04bf, 0x041f, 0x039f, 0x031f, 0x025f, 0x01bf, 0x013f, 0x00bf, 0x40fb, 0xb1b5, 0xc9d2, 0xb1d5, 0xb1d4, 0xc9b3, 0x6399, 0x061f, 0x06df, 0x071f, 0x073f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc972, 0xc972, 0xc992, 0xc972, 0xb152, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20cd, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30d0, 0x28f0, 0x3110, 0x30f0, 0x30f0, 0x30f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4a16, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0x8539, 0x1f5e, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x07bf, 0x075f, 0x06be, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059e, 0x057e, 0x055f, 0x053f, 0x053f, 0x051f, 0x051f, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x053f, 0x053f, 0x051f, 0x04df, 0x04bf, 0x043f, 0x03df, 0x035f, 0x02bf, 0x021f, 0x017f, 0x00ff, 0x009f, 0x087f, 0x7119, 0xc9d3, 0xb1d4, 0xb9d3, 0xc9b3, 0x1cfe, 0x065f, 0x06ff, 0x071f, 0x073f, 0x073f, 0x1ebe, 0xb9f3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc973, 0xc952, 0xb152, 0x4111, 0x3910, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20cd, 0x20ce, 0x20ae, 0x20ae, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4a15, 0x3439, 0x16bd, 0x8519, 0xd395, 0xd395, 0xd395, 0x94d8, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x071e, 0x069d, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fd, 0x05dd, 0x05bd, 0x059d, 0x059e, 0x057e, 0x055e, 0x053e, 0x051e, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x049f, 0x049f, 0x049f, 0x049f, 0x049f, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x04bf, 0x04df, 0x04df, 0x04df, 0x04bf, 0x049f, 0x043f, 0x03df, 0x035f, 0x02ff, 0x025f, 0x01bf, 0x013f, 0x00df, 0x007f, 0x005f, 0x185e, 0x8957, 0x61b9, 0xc9d3, 0x9a96, 0x059f, 0x067f, 0x06ff, 0x071f, 0x073f, 0x075f, 0x267d, 0xb9d3, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xb152, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cf, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x00f6, 0x18ce, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f1, 0x38f1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69b4, 0x6336, 0x6cd9, 0x4e5b, 0x07df, 0x8539, 0xd395, 0xd395, 0xbc17, 0x3e9c, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x06bd, 0x069c, 0x069c, 0x067c, 0x065c, 0x065c, 0x063c, 0x061c, 0x05fc, 0x05dc, 0x05bc, 0x05bd, 0x059d, 0x057d, 0x055d, 0x053e, 0x051e, 0x04fe, 0x04de, 0x04be, 0x04bf, 0x049f, 0x047f, 0x047f, 0x047f, 0x045f, 0x045f, 0x045f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x049f, 0x047f, 0x045f, 0x041f, 0x03df, 0x037f, 0x031f, 0x029f, 0x021f, 0x017f, 0x011f, 0x00bf, 0x005f, 0x001f, 0x001f, 0x00ff, 0x89b7, 0xc9b3, 0x447b, 0x065f, 0x06bf, 0x071f, 0x073f, 0x073f, 0x075f, 0x3d9b, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xa132, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20cd, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x40f1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61b3, 0x9274, 0xb2f5, 0xc355, 0xd395, 0xd395, 0xd395, 0xbc16, 0x469d, 0x8539, 0xd376, 0xd375, 0x6dba, 0x0f9f, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x077f, 0x06bc, 0x06bb, 0x069b, 0x067b, 0x065b, 0x063b, 0x063b, 0x061b, 0x05fb, 0x05db, 0x05bb, 0x059c, 0x059c, 0x057c, 0x055c, 0x053d, 0x051d, 0x04fd, 0x04dd, 0x04be, 0x049e, 0x047f, 0x047f, 0x045f, 0x043f, 0x043f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x041f, 0x03ff, 0x03bf, 0x037f, 0x033f, 0x02bf, 0x023f, 0x01df, 0x015f, 0x00df, 0x009f, 0x005f, 0x001f, 0x005f, 0x097f, 0xb9b3, 0xb214, 0x0dbf, 0x06ff, 0x075f, 0x073f, 0x073f, 0x075f, 0x077f, 0x6479, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x9132, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x3110, 0x38f0, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xc335, 0xd395, 0xd395, 0xd395, 0xd395, 0xac57, 0x7d7a, 0x469c, 0x0f9f, 0xa4b8, 0xd395, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x075d, 0x06bb, 0x06bb, 0x069a, 0x067a, 0x065a, 0x065a, 0x063a, 0x061a, 0x05fa, 0x05da, 0x05db, 0x05bb, 0x059b, 0x057b, 0x055b, 0x053c, 0x053c, 0x051c, 0x04fc, 0x04dd, 0x04bd, 0x047e, 0x047e, 0x045e, 0x043f, 0x041f, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03bf, 0x035f, 0x031f, 0x02df, 0x027f, 0x01ff, 0x019f, 0x011f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x009f, 0x39db, 0xc992, 0x6399, 0x069f, 0x079f, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x079f, 0x9af6, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x7112, 0x3110, 0x30f0, 0x30ef, 0x28f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d3, 0x10d2, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xcb75, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x1f7e, 0x07ff, 0x07ff, 0x36dd, 0xbc17, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x071b, 0x06da, 0x06ba, 0x06ba, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05f9, 0x05da, 0x05ba, 0x059a, 0x057a, 0x055a, 0x055b, 0x053b, 0x051b, 0x04fc, 0x04dc, 0x04bc, 0x049d, 0x047d, 0x045d, 0x043e, 0x041e, 0x03fe, 0x03df, 0x03df, 0x03bf, 0x03bf, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x037f, 0x035f, 0x031f, 0x02df, 0x027f, 0x023f, 0x01bf, 0x015f, 0x00ff, 0x009f, 0x005f, 0x001f, 0x003f, 0x011f, 0x99b6, 0xb9d3, 0x0d9f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f7e, 0xb9b3, 0xc952, 0xc952, 0xc952, 0xc952, 0xc931, 0xc932, 0xc132, 0x6111, 0x38f0, 0x30f0, 0x28f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xa2b4, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x0fbf, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x1f7e, 0x07df, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x06f9, 0x06f9, 0x06d9, 0x06b8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05f8, 0x05d8, 0x05b8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051a, 0x04fa, 0x04db, 0x04bb, 0x049c, 0x047c, 0x045d, 0x043d, 0x041e, 0x03fe, 0x03de, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02bf, 0x027f, 0x023f, 0x01ff, 0x019f, 0x013f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x005f, 0x197e, 0xb993, 0x6379, 0x063f, 0x073f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dfb, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc932, 0xc912, 0xb912, 0x4111, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x08f6, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79f3, 0xb2f4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x94f9, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x079d, 0x0719, 0x06f8, 0x06f8, 0x06d7, 0x06b7, 0x06b7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05f7, 0x05d7, 0x05b7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04f9, 0x04da, 0x04bb, 0x049b, 0x047c, 0x043c, 0x041d, 0x041d, 0x03fe, 0x03de, 0x03be, 0x039e, 0x037f, 0x035f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x027f, 0x023f, 0x01ff, 0x019f, 0x015f, 0x00ff, 0x009f, 0x005f, 0x003f, 0x001f, 0x00bf, 0x59ba, 0xb9b3, 0x0d3f, 0x06bf, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7438, 0xc952, 0xc132, 0xc932, 0xc932, 0xc932, 0xc911, 0xc912, 0xa111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x08f5, 0x011a, 0x0119, 0x00fa, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x5151, 0x79f3, 0xa2b4, 0xcb75, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x469c, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0xc335, 0x45d7, 0x0738, 0x0717, 0x06f6, 0x06f6, 0x06d6, 0x06b5, 0x06b5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05f5, 0x05f5, 0x05d6, 0x05b6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04f9, 0x04d9, 0x049a, 0x047b, 0x045b, 0x043c, 0x041c, 0x03dd, 0x03dd, 0x03be, 0x039e, 0x037e, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x021f, 0x01ff, 0x01bf, 0x017f, 0x011f, 0x00df, 0x009f, 0x003f, 0x001f, 0x003f, 0x013f, 0xb174, 0x6339, 0x05ff, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb992, 0xc932, 0xc932, 0xc931, 0xc912, 0xc912, 0xc912, 0xc911, 0x8111, 0x30f0, 0x30f0, 0x28ef, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20d0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08f5, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x59b2, 0x7a13, 0x9a94, 0xbb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xac77, 0x2f1e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bc, 0x0759, 0xabb5, 0xc314, 0x1e97, 0x0736, 0x0716, 0x0715, 0x06f4, 0x06f4, 0x06f3, 0x06d3, 0x06b3, 0x06b2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05f4, 0x05d4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04f8, 0x04b9, 0x0499, 0x045a, 0x043b, 0x041b, 0x03fc, 0x03dd, 0x03bd, 0x039d, 0x037e, 0x035e, 0x033e, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x021f, 0x01df, 0x019f, 0x017f, 0x013f, 0x00ff, 0x009f, 0x007f, 0x003f, 0x001f, 0x007f, 0x399b, 0xb993, 0x055f, 0x067f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x45db, 0xc132, 0xc932, 0xc912, 0xc132, 0xc912, 0xc912, 0xc911, 0xc912, 0x5111, 0x38f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x10d3, 0x10f4, 0x18d0, 0x18ad, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ce, 0x20ce, 0x28ae, 0x20ce, 0x28ee, 0x5171, 0x69d2, 0x8232, 0xaaf4, 0xc334, 0xd375, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x757a, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bd, 0x079b, 0x077a, 0x0779, 0x74d6, 0xd2d4, 0x9bf5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06f0, 0x06f0, 0x06d0, 0x06af, 0x06af, 0x066f, 0x0650, 0x0631, 0x0611, 0x05d2, 0x0594, 0x0554, 0x0515, 0x04f7, 0x04b8, 0x0478, 0x0459, 0x043a, 0x03fb, 0x03bc, 0x03bc, 0x039d, 0x037d, 0x035e, 0x033e, 0x031f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x027f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x013f, 0x011f, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x00df, 0xa175, 0x33bc, 0x05df, 0x06ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x92d5, 0xc911, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc112, 0xc912, 0xa8f1, 0x3110, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x390f, 0x4970, 0x59b0, 0x7a32, 0x9293, 0xaad3, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x9cb8, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07dd, 0x07bc, 0x079b, 0x079a, 0x079a, 0x0779, 0x55b7, 0xd2b4, 0xd2b4, 0x4db5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074f, 0x074e, 0x074d, 0x074d, 0x074c, 0x072b, 0x072b, 0x072a, 0x070a, 0x06ea, 0x06ac, 0x064d, 0x05d0, 0x0573, 0x04f5, 0x04b6, 0x0478, 0x0438, 0x041a, 0x03fb, 0x03bc, 0x039c, 0x037c, 0x033d, 0x033d, 0x031e, 0x02fe, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x009f, 0x005f, 0x003f, 0x001f, 0x003f, 0x213d, 0x1b1e, 0x051f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f3d, 0xc912, 0xc912, 0xc112, 0xc112, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0x80f1, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xc374, 0xa2d3, 0xaad3, 0x7a31, 0x7a31, 0x7a11, 0x7231, 0x5190, 0x496f, 0x496f, 0x4970, 0x496f, 0x494f, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x494f, 0x496f, 0x496f, 0x69f1, 0x7a31, 0x7a31, 0x9272, 0xa2d3, 0xaaf3, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd395, 0xac57, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x079a, 0x079a, 0x0799, 0x26b8, 0xcad4, 0xd2b4, 0xc314, 0x0f35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078f, 0x078e, 0x078e, 0x078d, 0x078c, 0x07aa, 0x07a9, 0x07a9, 0x07a8, 0x07c7, 0x07c5, 0x07c4, 0x07e4, 0x07a4, 0x0727, 0x068a, 0x05af, 0x0496, 0x0438, 0x03f9, 0x03ba, 0x039b, 0x035c, 0x035d, 0x031d, 0x031d, 0x02fe, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x007f, 0x023f, 0x041f, 0x05bf, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6498, 0xc911, 0xc912, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8d1, 0x50f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0117, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x8539, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x07ba, 0x07ba, 0x07b9, 0xd2b4, 0xd2b4, 0xd2b4, 0x6535, 0x07b5, 0x07b5, 0x07b4, 0x07b3, 0x07b2, 0x07b1, 0x07b0, 0x07af, 0x07ce, 0x07cd, 0x07cc, 0x07cb, 0x07ca, 0x07ca, 0x07c9, 0x07e8, 0x07e7, 0x07e6, 0x07e5, 0x07e5, 0x07e3, 0x07e3, 0x07e2, 0x07e1, 0x0726, 0x060c, 0x04b4, 0x03b9, 0x037b, 0x035c, 0x033d, 0x031d, 0x02de, 0x02df, 0x02be, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x015f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x007f, 0x003f, 0x001f, 0x001f, 0x011f, 0x02ff, 0x04df, 0x063f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb972, 0xc8f2, 0xc8f2, 0xc0f1, 0xc8f2, 0xc0f2, 0xc0f1, 0xc8d1, 0xa0f1, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x412f, 0x8a72, 0xc334, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xac57, 0x469c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x467c, 0x8519, 0x8519, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07de, 0x07de, 0x07dd, 0x07dc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x07da, 0x9bf5, 0xd2b4, 0xd2b4, 0xc2f4, 0x0f77, 0x07d6, 0x07d5, 0x07d4, 0x07d4, 0x07d3, 0x07d2, 0x07d1, 0x07d0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07ec, 0x07ea, 0x07e9, 0x07e9, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e4, 0x07e4, 0x07e3, 0x07e3, 0x07e2, 0x0785, 0x060c, 0x04d3, 0x035b, 0x031c, 0x02de, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x001f, 0x001f, 0x003f, 0x01df, 0x03bf, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d7a, 0xc111, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0d1, 0xc8d1, 0x68f1, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x414f, 0x61d1, 0x8251, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xbc16, 0x8539, 0x469c, 0x17bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8518, 0xd355, 0xd355, 0xd335, 0xd335, 0x84f8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07fe, 0x07dd, 0x07dd, 0x07bc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x8c56, 0xcab4, 0xcab4, 0xd294, 0x4df7, 0x07d7, 0x07d7, 0x07d6, 0x07f5, 0x07d5, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07e9, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e5, 0x07e5, 0x07e4, 0x07a6, 0x060e, 0x03f8, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x003f, 0x001f, 0x001f, 0x00bf, 0x029f, 0x049f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1d3, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0f1, 0xc8d1, 0xb8d1, 0x40f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0x496f, 0x5990, 0x7a12, 0x7a32, 0x9272, 0xa2d3, 0xa2d3, 0xc375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xac77, 0x757a, 0x36fd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4e3c, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd334, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07dd, 0x07dd, 0x07dc, 0x07fc, 0x07dc, 0x07db, 0x6d38, 0xcab4, 0xd294, 0xd294, 0xab95, 0x07d8, 0x07d8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ec, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07e9, 0x07e9, 0x07e8, 0x07e8, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e8, 0x07c8, 0x06eb, 0x0514, 0x033c, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0x015f, 0x037f, 0x057f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5a, 0xc8f1, 0xc8d1, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x78d1, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x496f, 0x496f, 0x4970, 0x7a12, 0x7a31, 0x8252, 0xaad3, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcbd6, 0x94f8, 0x565b, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb3f6, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd334, 0x1f7e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07dd, 0x07fd, 0x07fd, 0x07fd, 0x07dd, 0x07dc, 0x6d38, 0xcab4, 0xd294, 0xca94, 0xd294, 0x1f39, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ed, 0x07ec, 0x07eb, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07ca, 0x07ab, 0x076c, 0x070d, 0x05b2, 0x039b, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60d9, 0x0a3f, 0x047f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9d3, 0xc0d1, 0xc8d1, 0xc0f1, 0xc8b1, 0xc0d1, 0xc8b1, 0xc0b1, 0xb8b1, 0x48f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x4970, 0x5990, 0x7a31, 0x7231, 0x7a31, 0x7a31, 0x9ab3, 0xaad4, 0xa2d4, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0x94f8, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd315, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x6d58, 0xd294, 0xd293, 0xca94, 0xd274, 0x4df8, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f1, 0x07f0, 0x07f0, 0x07f0, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ed, 0x07cd, 0x078e, 0x076e, 0x0710, 0x06b1, 0x0574, 0x037b, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x013f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x88d6, 0x6159, 0x031f, 0x053f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5b, 0xc0d1, 0xc8d1, 0xc8d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b1, 0x90d1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ce, 0x18ad, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x290f, 0x5170, 0x5170, 0x69f1, 0x7a32, 0x8232, 0xaaf3, 0xaaf4, 0xcb75, 0xd395, 0xd396, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xc3b6, 0x8539, 0x1f7f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0x659a, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x6d39, 0xd294, 0xca94, 0xd274, 0xca74, 0x7c96, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f4, 0x07f4, 0x07f3, 0x07f3, 0x07f3, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f1, 0x07f1, 0x07f1, 0x07f1, 0x07f0, 0x07f1, 0x07d0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02dd, 0x01bf, 0x019f, 0x017f, 0x015f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x00bf, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60b8, 0xb8f3, 0x09bf, 0x041f, 0x061f, 0x073f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1b3, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x48f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x5172, 0x61b2, 0x8a54, 0x9a94, 0xb335, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0x9c97, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xac17, 0xd335, 0xd314, 0xd335, 0xd314, 0xd315, 0xd315, 0xd2f4, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6d59, 0xd274, 0xca94, 0xd274, 0xca74, 0xb334, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f4, 0x07f4, 0x07f4, 0x07d3, 0x07b3, 0x0793, 0x0753, 0x0714, 0x06b5, 0x5516, 0x0538, 0x037c, 0x01ff, 0x017f, 0x015f, 0x013f, 0x011f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x6099, 0xc911, 0x491a, 0x02df, 0x051f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6459, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x90d1, 0x30f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69d3, 0x9274, 0xb2f5, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xa478, 0x36dd, 0x07ff, 0x07ff, 0x563c, 0xd335, 0xd334, 0xd315, 0xd315, 0xd2f4, 0xcb15, 0xbb96, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8498, 0xca94, 0xca94, 0xd274, 0xca74, 0xca74, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07d6, 0x07b6, 0x0796, 0x0756, 0x0716, 0xa456, 0xbbd6, 0x3479, 0x02fd, 0x023f, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x003f, 0x78b7, 0xc111, 0xa114, 0x01ff, 0x041f, 0x05ff, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xc0b1, 0xc0d2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x48f1, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x20cd, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71f4, 0x9a75, 0xb2f5, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0x9c78, 0x36dd, 0x07ff, 0x9c57, 0xd335, 0xd315, 0xd334, 0xd314, 0xc355, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bf7, 0xca94, 0xd274, 0xca73, 0xca74, 0xd253, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f8, 0x07d8, 0x07b8, 0x0797, 0x0758, 0x0ef8, 0xbbf6, 0xd395, 0x6b99, 0x025f, 0x021f, 0x01bf, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x98d5, 0xc8f2, 0xc911, 0x195e, 0x033f, 0x053f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b76, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x88d1, 0x30f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8a16, 0xaad5, 0xcb55, 0xd375, 0xd355, 0xd354, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0x84f9, 0x0fbf, 0x5ddb, 0xa457, 0x9c58, 0x84d8, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca74, 0xca74, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07da, 0x07da, 0x07ba, 0x079a, 0x0779, 0x2e99, 0xc3d6, 0xd395, 0x8339, 0x0a3e, 0x01df, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0x90d5, 0xc912, 0xc0f1, 0x7117, 0x027f, 0x049f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x269d, 0xc891, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8b1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ce, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ef, 0x28cf, 0x28ef, 0x28d0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8b14, 0x4ad3, 0x7a94, 0xab14, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd314, 0xd335, 0xc355, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc2d4, 0xca74, 0xca74, 0xd274, 0xca74, 0xd253, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07db, 0x07bb, 0x07bb, 0x077b, 0x2eba, 0xc3d6, 0xd395, 0xb337, 0x09df, 0x01bf, 0x017f, 0x013f, 0x011f, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x7896, 0xc0f1, 0xc8f1, 0xa8f3, 0x01df, 0x03df, 0x05bf, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0x68f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9a75, 0xcb55, 0xcb75, 0x5bb4, 0x3b34, 0x42b3, 0x4a33, 0x6253, 0x9ab4, 0xd335, 0xd335, 0xd315, 0xd334, 0xd314, 0xd315, 0xd314, 0xd314, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f5e, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xca53, 0x369d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07dd, 0x07dd, 0x07bd, 0x079c, 0x561a, 0xd395, 0xd395, 0xab37, 0x099f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x003f, 0x003f, 0x305c, 0xc0f1, 0xc8f1, 0xc8d1, 0x215d, 0x033f, 0x051f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5cd9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x98d1, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x011a, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xcb55, 0xd375, 0xbb95, 0x5474, 0x3c34, 0x3bb4, 0x4333, 0x42b3, 0x4a13, 0x49f3, 0x5a32, 0x9ab4, 0xd334, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0x84d8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4ddb, 0xd274, 0xca74, 0xca73, 0xd274, 0xca54, 0xca54, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07de, 0x079d, 0x6d99, 0xd395, 0xd395, 0xab17, 0x097f, 0x011f, 0x011f, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0xc8f1, 0xc8f1, 0xc8d1, 0x5119, 0x02df, 0x04ff, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x4910, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xcb55, 0xd375, 0xd375, 0xb3d5, 0x3d55, 0x3515, 0x3495, 0x3c14, 0x3b94, 0x3b13, 0x4293, 0x4212, 0x49f3, 0x49f3, 0x5a13, 0x9ab4, 0xd314, 0xd315, 0xcb15, 0xd2f4, 0xd2f5, 0xd2f4, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8c37, 0xca74, 0xd273, 0xd253, 0xca54, 0xca53, 0xd253, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07df, 0x07df, 0x94d8, 0xd396, 0xd395, 0x8299, 0x00ff, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0xc8d1, 0xc0f1, 0xc0d1, 0xa0d4, 0x027f, 0x04bf, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8315, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x70f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0117, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xb2f4, 0xd375, 0xd375, 0xd375, 0x9435, 0x3d55, 0x2d55, 0x2d75, 0x3515, 0x3c94, 0x3414, 0x3b94, 0x4313, 0x4293, 0x4a13, 0x41f3, 0x49f2, 0x4a13, 0x5a33, 0xa2b4, 0xd314, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2f4, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x179f, 0xd274, 0xca53, 0xca73, 0xca53, 0xca53, 0xca53, 0xd253, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xbc16, 0xd395, 0xd395, 0x725a, 0x00bf, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x90b5, 0xc8d1, 0xc8d1, 0xc0d1, 0x123e, 0x047f, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x90d1, 0x38f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x38f0, 0x30f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xcb55, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3bf4, 0x3b73, 0x42f4, 0x4273, 0x4a13, 0x4213, 0x49f2, 0x49f3, 0x49f3, 0x6a33, 0xbad4, 0xd2f5, 0xd2f4, 0xd2d4, 0xc335, 0x177e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xca54, 0xd273, 0xca54, 0xca53, 0xca53, 0xca53, 0x9bb6, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x077e, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x36dd, 0xd395, 0xd395, 0xd395, 0x51bc, 0x009f, 0x009f, 0x007f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x7077, 0xc0d2, 0xc8d1, 0xc0d1, 0x49fa, 0x049f, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4952, 0xaab4, 0xd375, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x2d75, 0x2d75, 0x3555, 0x54d5, 0x6475, 0x83b5, 0x8b74, 0x9b34, 0xab14, 0xaad4, 0xb2d4, 0xaad4, 0xaab4, 0xaab4, 0xb2b4, 0x6b15, 0x8a94, 0xc2d4, 0xd2f4, 0xd2d4, 0x84b8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb315, 0xd274, 0xca53, 0xca54, 0xca53, 0xca53, 0xd253, 0x653a, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x071f, 0x071e, 0x071e, 0x073e, 0x079f, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7d7a, 0xd395, 0xd395, 0xc375, 0x28fe, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x005f, 0x003f, 0x003f, 0x183e, 0xc0d1, 0xc0d1, 0xc0d2, 0x7996, 0x04bf, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x58f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0117, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x5972, 0xcb55, 0xd375, 0xd375, 0xd375, 0xd375, 0xabd5, 0x4515, 0x54f5, 0x7c75, 0x8c35, 0xabd5, 0xcb55, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xc355, 0x9c37, 0x659a, 0x467c, 0x0fbf, 0x07ff, 0x07ff, 0x269d, 0x9c17, 0xd2d4, 0x9c17, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xd274, 0xca53, 0xca54, 0xca53, 0xca33, 0xca33, 0xca33, 0x26dd, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071e, 0x071e, 0x06fe, 0x06fe, 0x06ff, 0x06de, 0x06de, 0x06be, 0x06be, 0x06de, 0x073e, 0x079f, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x079f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0xc3f6, 0xd395, 0xd395, 0xaaf7, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x001f, 0x001f, 0xa094, 0xc0d1, 0xc8b1, 0xa8f3, 0x04bf, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x73d8, 0xb8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x10cf, 0x0119, 0x00f9, 0x0117, 0x18ce, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x71f2, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xcb14, 0xd334, 0xd334, 0xac16, 0x753a, 0x467d, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x369c, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26fd, 0xc2b4, 0xca53, 0xca53, 0xca53, 0xd253, 0xca33, 0xca33, 0xa356, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06fe, 0x06fe, 0x06de, 0x06be, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x06be, 0x073e, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07df, 0x6dda, 0xd395, 0xd376, 0xd375, 0x79fa, 0x003f, 0x003f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x8896, 0xc0b1, 0xc0b1, 0xc8b1, 0x0c9f, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0x98d1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x9a93, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd355, 0xd335, 0xd335, 0xc375, 0x84f9, 0x4e3c, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xab75, 0xca54, 0xd253, 0xca53, 0xca33, 0xca33, 0xd233, 0xca33, 0x4dbb, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06de, 0x06de, 0x06de, 0x06be, 0x06be, 0x069e, 0x067e, 0x067e, 0x067e, 0x065e, 0x063e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05fd, 0x067d, 0x06de, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x071e, 0x073f, 0x073f, 0x073f, 0x073e, 0x075f, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x0fbf, 0xc3d6, 0xd375, 0xd375, 0xd355, 0x30fd, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x6058, 0xc0b1, 0xc0b1, 0xc0b1, 0x33fc, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0b1, 0xb8d1, 0xb8d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x3910, 0xaaf4, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x7539, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2efd, 0xb315, 0xca53, 0xca54, 0xca33, 0xca53, 0xca34, 0xca34, 0xca33, 0xa335, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06de, 0x06bf, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05bd, 0x05be, 0x059d, 0x055e, 0x055e, 0x05be, 0x05fe, 0x061d, 0x067e, 0x06be, 0x06fe, 0x06fe, 0x071f, 0x071e, 0x073f, 0x073f, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x8539, 0xd375, 0xd355, 0xd355, 0xbaf6, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x403b, 0xc8b1, 0xc0b1, 0xc0b1, 0x6318, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9b3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x4910, 0x3910, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x10d3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30cf, 0x3910, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xcb96, 0x8518, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbe, 0x653a, 0xca54, 0xca53, 0xd253, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x2e9d, 0x077f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06fe, 0x06df, 0x06de, 0x06bf, 0x06be, 0x06bf, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05be, 0x05be, 0x059e, 0x057e, 0x053e, 0x051e, 0x04fe, 0x04be, 0x049e, 0x041e, 0x03dd, 0x04de, 0x065e, 0x06be, 0x06de, 0x06de, 0x06fe, 0x071f, 0x073e, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x36dd, 0xd355, 0xd355, 0xd355, 0xd335, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0xb8b2, 0xc091, 0xc0b1, 0x7a96, 0x06bf, 0x079f, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x82f5, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0x60f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x08f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x28cf, 0x28ef, 0x3910, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x5d9a, 0xb315, 0xd254, 0xca53, 0xd254, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xca33, 0x64d9, 0x077f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06be, 0x069f, 0x069f, 0x067e, 0x065e, 0x065e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x055e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043d, 0x03de, 0x03be, 0x039e, 0x037e, 0x03fe, 0x05fe, 0x069e, 0x069e, 0x06be, 0x06fe, 0x071e, 0x073f, 0x075f, 0x079f, 0x079f, 0x07df, 0x07df, 0x07df, 0x07ff, 0xbbf6, 0xd355, 0xd335, 0xd335, 0xc2f5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x9095, 0xc8b1, 0xc8b1, 0x91f5, 0x067f, 0x06ff, 0x073f, 0x075f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x80f2, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x08f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x3110, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0x9c77, 0x563b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f7e, 0x65db, 0x7cf9, 0x9c57, 0x9c57, 0x9c57, 0x9c57, 0x9c37, 0x9c37, 0x9c37, 0x9c37, 0x7539, 0x6d7a, 0x6579, 0x5dbb, 0x36bd, 0x36bd, 0x36bc, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x36bd, 0x5d9a, 0x8c37, 0xd274, 0xd273, 0xd254, 0xca53, 0xd254, 0xd253, 0xca33, 0xd233, 0xca34, 0xca13, 0xca33, 0x8418, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x069e, 0x069f, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x05be, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04be, 0x045e, 0x03fe, 0x03be, 0x039e, 0x037e, 0x037e, 0x035e, 0x033e, 0x035e, 0x061d, 0x067e, 0x067e, 0x069e, 0x06be, 0x06fe, 0x073f, 0x075f, 0x077f, 0x079f, 0x07df, 0x07df, 0x07ff, 0x7d59, 0xd335, 0xd335, 0xd335, 0xd314, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x60d8, 0xc0b1, 0xc0b1, 0xb8f2, 0x05df, 0x061f, 0x065f, 0x06df, 0x073f, 0x077f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x90d1, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0x9c77, 0x3edd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x659a, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca74, 0xca74, 0xca73, 0xca73, 0xd274, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xab15, 0x0edf, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067e, 0x067f, 0x067e, 0x065e, 0x063f, 0x061e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043e, 0x03be, 0x039e, 0x039e, 0x035e, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x037e, 0x05fe, 0x065e, 0x067e, 0x069e, 0x06de, 0x06fe, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x271d, 0xd335, 0xd314, 0xd315, 0xd315, 0xc2d5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x009f, 0x60d8, 0xc0b1, 0xc0b2, 0xc0b1, 0x04bf, 0x053f, 0x05bf, 0x067f, 0x06df, 0x075f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0x98d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ce, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xac37, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x0ebd, 0x1d7b, 0x1c99, 0x32f5, 0x3a75, 0x6193, 0x69b3, 0x79f4, 0x8a14, 0xb294, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xd274, 0xca53, 0xca54, 0xca54, 0xca53, 0xd253, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x8b97, 0x35fd, 0x5d7b, 0x6d3a, 0x6d3a, 0x5d5b, 0x35fd, 0x06bf, 0x0e7e, 0x457c, 0x6c99, 0x6479, 0x6459, 0x4cba, 0x0e1e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04de, 0x047e, 0x03de, 0x03be, 0x037e, 0x037f, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x02fe, 0x02fe, 0x02de, 0x03fe, 0x05be, 0x063e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073e, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0xbbb6, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0x697a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x48fa, 0xc0b1, 0xc0b1, 0xc0b1, 0x331c, 0x047f, 0x053f, 0x05ff, 0x069f, 0x073f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9a14, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ae, 0x18cf, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f4, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x9273, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xc3b6, 0x5dfb, 0x07ff, 0x0e3b, 0x1c98, 0x2ad5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79d3, 0x9a54, 0xc294, 0xd2f4, 0xd2d5, 0xcad4, 0xd2d4, 0xd2b4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xca73, 0xd253, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x99d4, 0x6358, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd375, 0x06bf, 0x5cfa, 0xd2b4, 0xca94, 0xca33, 0xca13, 0xc9d3, 0xb9d3, 0x4c5a, 0x061e, 0x061e, 0x05de, 0x05de, 0x05be, 0x059e, 0x059e, 0x057e, 0x053e, 0x051e, 0x051d, 0x04de, 0x04be, 0x043e, 0x03be, 0x03be, 0x037f, 0x0b7e, 0x337c, 0x333c, 0x335c, 0x333c, 0x333c, 0x331c, 0x331c, 0x32fc, 0x32fc, 0x32dc, 0x2b7c, 0x05de, 0x061e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07df, 0x84f9, 0xd314, 0xcb14, 0xcaf4, 0xd2d5, 0xb275, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x08df, 0xb8d2, 0xc0b1, 0xc0b1, 0x3a7b, 0x03ff, 0x04df, 0x05bf, 0x067f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b77, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x20cf, 0x0918, 0x013a, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0139, 0x00f9, 0x10d2, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x9c78, 0x261b, 0x1b96, 0x3171, 0x30f0, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81f3, 0xaa73, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xca53, 0xca53, 0xca53, 0xd233, 0xca33, 0xca33, 0xd233, 0xc234, 0x7994, 0x5975, 0xb315, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xc375, 0x067f, 0x067f, 0x6c79, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc912, 0x34bb, 0x05fe, 0x05de, 0x05be, 0x059e, 0x055e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x249d, 0x347b, 0x6bfa, 0x7b99, 0x9b98, 0xab97, 0xdb95, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xbbd6, 0x9c37, 0x8499, 0x6d1a, 0x363c, 0x1edd, 0x079f, 0x07bf, 0x07df, 0x4e1b, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0x40fc, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x78d7, 0xc0b1, 0xc0b1, 0x61d8, 0x03bf, 0x049f, 0x057f, 0x065f, 0x071f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x10f3, 0x013a, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011a, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x5170, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0x6519, 0x22b3, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79b3, 0xa233, 0xd2b4, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xca94, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xd253, 0xca54, 0xca54, 0xca33, 0xd233, 0xca34, 0xca33, 0xca33, 0xa1d3, 0x5954, 0x5954, 0x79f5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd335, 0x8c18, 0x067f, 0x065f, 0x063f, 0xa2d5, 0xc9d3, 0xc972, 0xc952, 0xc111, 0xc8d1, 0x8a55, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x34dc, 0x6c5a, 0xa3f7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xbbb6, 0x84d9, 0x4e1b, 0x465c, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0x81d8, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x6098, 0xc0b1, 0xc0d1, 0x59b8, 0x035f, 0x045f, 0x055f, 0x063f, 0x06ff, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x58f1, 0x3911, 0x30f0, 0x3110, 0x30cf, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x08f6, 0x013a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ce, 0x20ae, 0x28ee, 0xcb55, 0xd375, 0xd375, 0xd375, 0xbb14, 0x34f9, 0x2930, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91f2, 0xc254, 0xca93, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xca73, 0xd273, 0xca73, 0xd254, 0xca53, 0xca53, 0xca54, 0xca33, 0xca34, 0xa1f3, 0x6973, 0x4953, 0x5134, 0x5154, 0xaaf5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd335, 0xd314, 0x5cda, 0x065f, 0x063f, 0x063f, 0xb254, 0xc972, 0xc952, 0xc112, 0xc8d1, 0xc0b1, 0xc0b1, 0x05be, 0x059e, 0x2d1c, 0x9438, 0xcbb6, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xca94, 0x087f, 0x003f, 0x001f, 0x001f, 0x001f, 0x385b, 0xc0b1, 0xc0b1, 0x9135, 0x031f, 0x043f, 0x053f, 0x063f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb8d1, 0x5911, 0x3911, 0x38f0, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x0917, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x011a, 0x00f9, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18cd, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x20ce, 0x8252, 0xd375, 0xd375, 0xd375, 0x9a93, 0x30ef, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81d2, 0xaa13, 0xba33, 0xca54, 0xca74, 0xca53, 0xca54, 0xca53, 0xca53, 0xb213, 0xa1f3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xd395, 0xd395, 0xd396, 0xd375, 0xd334, 0xd2f5, 0xd2b4, 0x2d9d, 0x063f, 0x063f, 0x061f, 0xc993, 0xc952, 0xc911, 0xc8f1, 0xc0b1, 0xc0b1, 0xb8d1, 0x059e, 0x057e, 0xabf7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd335, 0xcb15, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0x411c, 0x003f, 0x003f, 0x001f, 0x001f, 0x203c, 0xc0b1, 0xc0b1, 0x9135, 0x02ff, 0x041f, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa1b3, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x68f1, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x10f3, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x412f, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ce, 0x28cf, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3110, 0x38f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x38f1, 0x38f0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8a34, 0xd395, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xb2f6, 0x065f, 0x061f, 0x061f, 0x34dc, 0xc952, 0xc912, 0xc8d2, 0xc0b1, 0xc0d1, 0xb8d1, 0x89b4, 0x2bba, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71d4, 0x69f4, 0x71d3, 0x69d4, 0x71d3, 0x7a14, 0x8a75, 0x9274, 0x9254, 0x9254, 0x9a95, 0xb315, 0xbb14, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xcb14, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xcab4, 0xca94, 0xca94, 0x81b8, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0xa8b3, 0xc0b1, 0xb0d2, 0x02df, 0x03ff, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f2, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20cf, 0x0918, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20cd, 0x9272, 0xd375, 0xc334, 0x61d1, 0x20cf, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x30f0, 0x3110, 0x3110, 0x30f0, 0x3110, 0x38f0, 0x30f0, 0x38f0, 0x3111, 0x38f0, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xb2f5, 0xd395, 0xd375, 0xd355, 0xd2f4, 0xd2b4, 0xd274, 0x83b8, 0x063f, 0x061f, 0x061e, 0x6398, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61b3, 0x7a34, 0x9a95, 0xb2f5, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd274, 0xca74, 0xc254, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x5878, 0xb8d1, 0xc0b1, 0x02bf, 0x03bf, 0x04ff, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6478, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20cf, 0x0917, 0x011a, 0x011a, 0x0119, 0x08f4, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20cd, 0x18ce, 0x20ae, 0x390f, 0xd375, 0xcb35, 0x414f, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x30ef, 0x3110, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f1, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3910, 0x3911, 0x38f1, 0x3911, 0x3912, 0x4952, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xd2b4, 0xd274, 0xca33, 0x4c9a, 0x05ff, 0x061f, 0x05ff, 0xa1f4, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa0f1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xa274, 0xc315, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca74, 0xca74, 0xca74, 0xca54, 0x20fd, 0x009f, 0x007f, 0x005f, 0x003f, 0x105d, 0xc0b1, 0xc0d1, 0x029f, 0x03bf, 0x04df, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x61d0, 0xbb14, 0x412f, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28cf, 0x28f0, 0x30d0, 0x28ef, 0x28cf, 0x30cf, 0x30f0, 0x30d0, 0x30d0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x61b2, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xca74, 0xd233, 0xca13, 0x1d9d, 0x05ff, 0x05ff, 0x1d3d, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8a14, 0xaa74, 0xcaf4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xca94, 0xca73, 0xd274, 0xd253, 0xd254, 0x597a, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x005f, 0xa8b3, 0xc0b1, 0x31fc, 0x039f, 0x04df, 0x05df, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x390f, 0x28ce, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x71f2, 0xd335, 0xd2f4, 0xd2b4, 0xca74, 0xd233, 0xca13, 0xa295, 0x05ff, 0x05ff, 0x05ff, 0x5399, 0xc0d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9a34, 0xc2b4, 0xd2b5, 0xd2b3, 0xcab4, 0xd294, 0xd294, 0xca93, 0xd274, 0xd274, 0xca53, 0xca54, 0xca53, 0x81d8, 0x00df, 0x00df, 0x00df, 0x00bf, 0x00bf, 0x68b7, 0xb8d1, 0x31dc, 0x033f, 0x049f, 0x05df, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26bd, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d2, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x011a, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x8213, 0xd2f5, 0xcad4, 0xd274, 0xca53, 0xc9f3, 0xc9d2, 0x7398, 0x05ff, 0x05ff, 0x05df, 0xa953, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x98f2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f0, 0x38f0, 0x38f0, 0x38f0, 0x3911, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xca94, 0xd294, 0xca94, 0xd274, 0xca74, 0xd274, 0xca53, 0xca54, 0xca53, 0xca34, 0x99f6, 0x011f, 0x011f, 0x00ff, 0x00ff, 0x00ff, 0x38db, 0xc0b1, 0x28fc, 0x02df, 0x047f, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd335, 0xd2b4, 0xca94, 0xca33, 0xd1f3, 0xc9d3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc932, 0xc0d1, 0xc0b1, 0xb8d1, 0xb0d2, 0xb9f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x015f, 0x013f, 0x013f, 0x013f, 0x011f, 0x093f, 0xc0b1, 0x311c, 0x01bf, 0x03ff, 0x059f, 0x069f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2f4, 0xca74, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc111, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xca53, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x097f, 0x017f, 0x015f, 0x017f, 0x015f, 0x015f, 0x88f5, 0x293c, 0x013f, 0x02df, 0x053e, 0x067f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9234, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x10d0, 0x0118, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2b4, 0xd233, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0xb8d1, 0xc253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x31bc, 0x01bf, 0x019f, 0x019f, 0x019f, 0x019f, 0x5139, 0x315c, 0x017f, 0x01bf, 0x045e, 0x063e, 0x077f, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xcb15, 0xca13, 0xc9d3, 0xc992, 0xc932, 0xc911, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc397, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xc9f3, 0x31fc, 0x01df, 0x01df, 0x01df, 0x01df, 0x01df, 0x01bf, 0x01df, 0x01bf, 0x01bf, 0x02df, 0x05fd, 0x073e, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8ab5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb0f1, 0xba95, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9f3, 0x31fd, 0x021f, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01df, 0x01ff, 0x051d, 0x071d, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6bf7, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc9d3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb152, 0xd79e, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x323c, 0x023f, 0x023f, 0x021f, 0x023f, 0x023f, 0x021f, 0x021f, 0x021f, 0x021f, 0x021f, 0x037e, 0x06dc, 0x07fd, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0x7911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc972, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xd63c, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x325c, 0x027f, 0x025f, 0x025f, 0x025f, 0x023f, 0x025f, 0x025f, 0x023f, 0x023f, 0x023f, 0x029f, 0x067c, 0x07fc, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d1, 0x70f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xc951, 0xc912, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xbb97, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, 0xc9b3, 0x327c, 0x029f, 0x029f, 0x029f, 0x029f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x025f, 0x027f, 0x05bc, 0x07db, 0x07fc, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x58f1, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x011a, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ae, 0x18d0, 0x0118, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa8f1, 0xa972, 0xd77e, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc193, 0x0a7f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x027f, 0x029f, 0x027f, 0x04dd, 0x07bb, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0x5911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xa911, 0xbc78, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, 0x089f, 0x011f, 0x031f, 0x02ff, 0x02ff, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x03fd, 0x079a, 0x07fa, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x2e5c, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb8d1, 0x5912, 0x3911, 0x38f1, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x007f, 0x009e, 0x023f, 0x033f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02df, 0x039e, 0x075a, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0x009f, 0x009f, 0x013f, 0x033f, 0x037f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x033f, 0x06f9, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb0f1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0d1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x3110, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, 0x007f, 0x007f, 0x00ff, 0x027f, 0x039f, 0x039f, 0x037f, 0x231d, 0x5259, 0x5a3a, 0x033f, 0x033f, 0x031f, 0x031f, 0x0699, 0x07f8, 0x07fa, 0x07fd, 0x07ff, 0x07ff, 0x363c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4112, 0x38f1, 0x3911, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x0915, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, 0x007f, 0x007f, 0x00bf, 0x021f, 0x2abd, 0x7a36, 0xb953, 0xc112, 0xc911, 0xc912, 0x0b3f, 0x035f, 0x035f, 0x033f, 0x05fa, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa0f1, 0x68f1, 0x4111, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, 0x007f, 0x007f, 0x30bb, 0x9955, 0xc931, 0xc932, 0xc932, 0xc912, 0xc0f2, 0xc8f2, 0x32fc, 0x037f, 0x037f, 0x037f, 0x059b, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d2, 0xb0d1, 0xb0f1, 0x98f1, 0xb0f1, 0x88f1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0x087e, 0x70f8, 0xc952, 0xc932, 0xc912, 0xc932, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0x331c, 0x03bf, 0x039f, 0x039f, 0x051b, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa0f1, 0xb0f1, 0xb0d1, 0x50f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, 0x9915, 0xc932, 0xc932, 0xc932, 0xc912, 0xc111, 0xc8f2, 0xc0f2, 0xc8d1, 0xc8d1, 0x333c, 0x03ff, 0x03df, 0x03bf, 0x04dc, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f1, 0xc8d1, 0xc8d1, 0xc8d1, 0x335c, 0x041f, 0x03ff, 0x03ff, 0x047d, 0x0795, 0x07f6, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0x40f0, 0x28cf, 0x28ef, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, 0x309c, 0x005f, 0x58b9, 0xc912, 0xc111, 0xc8f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x337c, 0x045f, 0x041f, 0x041f, 0x045e, 0x0775, 0x07f5, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0x80f1, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, 0x003f, 0x003f, 0x005f, 0x78d7, 0xc0f2, 0xc8f1, 0xc0d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x4b1a, 0x047f, 0x045f, 0x043f, 0x045f, 0x0735, 0x07f4, 0x07f9, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa0f1, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0x003f, 0x003f, 0x005f, 0x58b9, 0xc0f1, 0xc0d1, 0xc8d1, 0xc8b2, 0xc0b1, 0xc0b1, 0x62b8, 0x04bf, 0x047f, 0x047f, 0x045f, 0x0715, 0x07f4, 0x07f9, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa8f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0x58f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0x001f, 0x003f, 0x003f, 0x00df, 0x88f6, 0xc8d1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0x62d9, 0x04ff, 0x04bf, 0x049f, 0x047f, 0x06b6, 0x07f3, 0x07f8, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0x98f2, 0xb0f1, 0xb0f1, 0xb0f1, 0x78f0, 0x90f1, 0x80d1, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, 0x001f, 0x003f, 0x003f, 0x00bf, 0x311c, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x6278, 0x053f, 0x04ff, 0x04bf, 0x049f, 0x0696, 0x07f2, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x8912, 0xb0f1, 0xb0f1, 0xb0d1, 0x48f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0x003f, 0x003f, 0x003f, 0x00bf, 0x011f, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x79d6, 0x051f, 0x051f, 0x04ff, 0x04bf, 0x0638, 0x07f1, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0f1, 0x80f2, 0xb0f1, 0xb0f1, 0xb0f2, 0x3110, 0x30f0, 0x28cf, 0x28ef, 0x20ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0x003f, 0x003f, 0x001f, 0x009f, 0x00df, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9174, 0x049f, 0x057f, 0x051f, 0x04ff, 0x0619, 0x07f1, 0x07f6, 0x07fc, 0x07ff, 0x35bb, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x6912, 0xb0f1, 0xb0f1, 0x98f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00fa, 0x011a, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x68b7, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa8f3, 0x041f, 0x057f, 0x053f, 0x051f, 0x05f9, 0x07f0, 0x07f6, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x5912, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0x001f, 0x001f, 0x001f, 0x007f, 0x00bf, 0x009f, 0x90b5, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x0b9e, 0x053f, 0x057f, 0x053f, 0x05da, 0x07ef, 0x07f5, 0x07fb, 0x07ff, 0x5478, 0xb0d1, 0xb0f1, 0xb0f1, 0x9111, 0x5912, 0xa8f1, 0xb0f1, 0x70f1, 0x30f0, 0x28ef, 0x20ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x6098, 0xc0b1, 0xb8b1, 0xc0b1, 0xc0b1, 0x2afc, 0x04ff, 0x05bf, 0x055f, 0x05fb, 0x07cf, 0x07f4, 0x07fc, 0x07ff, 0x5c79, 0xb0f1, 0xb0f1, 0xb0f1, 0x8112, 0x5912, 0xb0f1, 0xb0f1, 0x68f1, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x005f, 0x7897, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0x6238, 0x04df, 0x05bf, 0x059f, 0x05fa, 0x07ce, 0x07f4, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x7112, 0x5912, 0xb0f1, 0xa8f1, 0x5110, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x28cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x007f, 0x6878, 0xb8b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x9954, 0x047f, 0x05bf, 0x05bf, 0x061a, 0x07ce, 0x07f2, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x6112, 0x5912, 0xa8f1, 0xa8f1, 0x60f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x003f, 0x001f, 0x7076, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x0bff, 0x05df, 0x05bf, 0x0639, 0x07cd, 0x07f2, 0x07fc, 0x07ff, 0x63f7, 0xb0f1, 0xb0f1, 0xb0f1, 0x4132, 0x4111, 0xa0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x001f, 0x001f, 0x9894, 0xb8d1, 0xb8d1, 0xb8d1, 0x42da, 0x059f, 0x05ff, 0x0678, 0x07cc, 0x07f1, 0x07fc, 0x07ff, 0x82b5, 0xa8f1, 0xb0f1, 0x98f2, 0x4132, 0x3912, 0x70f1, 0xa8f1, 0xa8f1, 0x50f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x183e, 0xb0d2, 0xb8d1, 0xb8d1, 0x9974, 0x059f, 0x061f, 0x0698, 0x07cc, 0x07f0, 0x07fc, 0x07ff, 0x82b5, 0xb0f1, 0xb0f1, 0x88f1, 0x4132, 0x4111, 0x3910, 0x98f1, 0xa8f2, 0x88f1, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x385b, 0xb8d1, 0xb8d1, 0xb8d1, 0x2c3c, 0x061f, 0x06b7, 0x07cb, 0x07f0, 0x07fb, 0x07ff, 0xb0f1, 0xb0f1, 0xa8f1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xa0f1, 0xa8f1, 0x48ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x7096, 0xb8d1, 0xb8d1, 0x8a35, 0x063f, 0x06d6, 0x07ea, 0x07f1, 0x07fc, 0x07ff, 0xa8f1, 0xa8f1, 0xa8f1, 0x6132, 0x4132, 0x4111, 0x38f1, 0x3110, 0x48f0, 0xa8f1, 0x98f1, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x98b4, 0xb8d1, 0xb8d1, 0x3c9b, 0x06f5, 0x07e9, 0x07f1, 0x07fd, 0x26bd, 0xb0f1, 0xb0f2, 0xb0f1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30f0, 0x60f0, 0xa911, 0x70f0, 0x20ce, 0x20cf, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x083f, 0x70f7, 0xb8d1, 0xa952, 0x0e94, 0x07c9, 0x07f2, 0x07fd, 0x2e3c, 0xa8f1, 0xa8f1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x58f0, 0xa8f1, 0x40cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x00f9, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x003f, 0x00df, 0x59f8, 0xb8d1, 0x8291, 0x07c9, 0x07f2, 0x07fe, 0x455a, 0xb0f1, 0xa8f1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x50cf, 0x48ef, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x031f, 0x2d3b, 0x99b2, 0x454b, 0x07f3, 0x07fe, 0x5498, 0xb0f1, 0xa8f1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x003f, 0x005f, 0x025f, 0x06fd, 0x0770, 0x0f88, 0x07f4, 0x07ff, 0x5478, 0xa8f1, 0xa8f1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x021f, 0x06fc, 0x078d, 0x07e7, 0x07f6, 0x07ff, 0x82b5, 0xa8f1, 0xa111, 0x4932, 0x4132, 0x4111, 0x38f1, 0x38f0, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x005f, 0x021f, 0x073b, 0x07ac, 0x07e7, 0x07f7, 0x07ff, 0x82b5, 0xa8f1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x10cf, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x023f, 0x073b, 0x07ab, 0x07e8, 0x07f9, 0x07ff, 0xa152, 0xa8f1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x005f, 0x007f, 0x009f, 0x023f, 0x0779, 0x07aa, 0x07e8, 0x07fb, 0x07ff, 0xa8f1, 0xa8f1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x0116, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdb0, 0xfdb0, 0xfdb1, 0xfdd1, 0xe4b2, 0xa911, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x02bf, 0x0778, 0x07c8, 0x07e9, 0x07fd, 0x173e, 0xa8f1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfdef, 0xfdf0, 0xfdf0, 0xfdf0, 0xfdf1, 0xfdf1, 0xecb1, 0xa0f1, 0xa911, 0xa911, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x005f, 0x007f, 0x009f, 0x009f, 0x041f, 0x0797, 0x07c7, 0x07eb, 0x07fe, 0x2e5c, 0xa8f1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0f, 0xfe30, 0xfe30, 0xfe30, 0xfe31, 0xfe31, 0xdc32, 0xa111, 0xa911, 0xa111, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x043f, 0x0794, 0x07e6, 0x07ec, 0x07fe, 0x35db, 0xa911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ac, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x00f8, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe50, 0xfe71, 0xfe51, 0xba52, 0xa111, 0xa111, 0x78d5, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x043f, 0x07b3, 0x07c5, 0x07ee, 0x07ff, 0x5478, 0x6ad6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f8, 0x18cf, 0x18ac, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe90, 0xfe91, 0xe471, 0xa111, 0xa112, 0xa111, 0x60d5, 0x001f, 0x283c, 0x7097, 0x405a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x00df, 0x045f, 0x07d2, 0x07e4, 0x07ef, 0x07ff, 0x2e3c, 0x2d1a, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x00f6, 0x0118, 0x00f7, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfeaf, 0xfed0, 0xfeb0, 0xfed1, 0xe491, 0xa911, 0xa111, 0x9931, 0xa111, 0x58d6, 0x88b5, 0xb8d1, 0xb8d1, 0x5059, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x00df, 0x047f, 0x07d2, 0x07e3, 0x07f1, 0x07ff, 0x07ff, 0x2cba, 0x4933, 0x4132, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f6, 0x0118, 0x0118, 0x18cf, 0x20ad, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x20ad, 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfed0, 0xfeb0, 0xfeb1, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x6933, 0xb0f1, 0xb0d1, 0xb0d1, 0x283c, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x011f, 0x047f, 0x07d1, 0x07e3, 0x07f3, 0x07ff, 0x07ff, 0x3b77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30ef, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cd, 0x18ac, 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfeb0, 0xfe90, 0xe471, 0xb8d2, 0xa111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xb0f1, 0xb0d1, 0xb0d2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x00df, 0x011f, 0x011f, 0x049f, 0x07f0, 0x07e2, 0x07f4, 0x07ff, 0x07ff, 0x3af6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ee, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfeb0, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xb0f1, 0xb0d1, 0x90b4, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x049f, 0x07f1, 0x07e2, 0x07f6, 0x07ff, 0x0f9f, 0x4a35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x18ce, 0x18ac, 0x20cc, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x18cc, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xe471, 0xb0d1, 0xa111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xb0d1, 0xb0d1, 0x7896, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x00bf, 0x011f, 0x011f, 0x013f, 0x017f, 0x04bf, 0x07f2, 0x07e2, 0x07f5, 0x07ff, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xa8f1, 0xa111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xb0d1, 0xb0d1, 0x5878, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00ff, 0x013f, 0x013f, 0x017f, 0x019f, 0x033f, 0x07f3, 0x07e2, 0x07f3, 0x07ff, 0xa8f1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x18cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xb0f1, 0xb0f1, 0x285c, 0x003f, 0x005f, 0x007f, 0x00bf, 0x00ff, 0x013f, 0x015f, 0x017f, 0x019f, 0x01bf, 0x02ff, 0x07f4, 0x07e3, 0x07f1, 0x2e5c, 0xa911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xb0f1, 0xb0d1, 0x087f, 0x009f, 0x00bf, 0x00df, 0x011f, 0x015f, 0x019f, 0x019f, 0x019f, 0x01df, 0x01df, 0x01ff, 0x07f7, 0x07e3, 0x07ef, 0x5498, 0xa8f1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xb0f1, 0x98f3, 0x00df, 0x00ff, 0x011f, 0x013f, 0x017f, 0x01bf, 0x01bf, 0x01df, 0x01df, 0x01ff, 0x01ff, 0x021f, 0x06d9, 0x07e5, 0x07ec, 0x7355, 0xa8f1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390f, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xa111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xa8f1, 0xb0f1, 0x80f5, 0x013f, 0x017f, 0x019f, 0x01bf, 0x01df, 0x01ff, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x023f, 0x057d, 0x07e8, 0x07e9, 0x82d5, 0xa0f1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38f0, 0x38ef, 0x30ef, 0x30ee, 0x28ce, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ad, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ce, 0x28ee, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ee, 0x38ef, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xa932, 0xa131, 0xb131, 0xc912, 0xc911, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0x5158, 0x01bf, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x021f, 0x023f, 0x025f, 0x025f, 0x025f, 0x025f, 0x041f, 0x07ed, 0x07e4, 0x7ab4, 0xa911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20cc, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ad, 0x28ce, 0x30ce, 0x30ce, 0x30ee, 0x8151, 0xb192, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d2, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x39bb, 0x021f, 0x023f, 0x025f, 0x027f, 0x027f, 0x025f, 0x025f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x029f, 0x07f3, 0x07e2, 0x9972, 0xa911, 0xa112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18cc, 0x18ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x18ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30cd, 0x28ee, 0x30ee, 0x490e, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f2, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d2, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0x123e, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x02df, 0x06b9, 0x07e3, 0xa111, 0xa911, 0xa111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390f, 0x38ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x18ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30ed, 0x692f, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc8f1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x9933, 0x02df, 0x02df, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02ff, 0x051e, 0x07e8, 0xa912, 0xa111, 0xa111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410f, 0x390f, 0x38ee, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x28ac, 0x20cc, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cd, 0x28ed, 0x28cd, 0x30cd, 0x9191, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc932, 0xc912, 0xc112, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8d1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88b4, 0x88b5, 0x88b5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x69d6, 0x033f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02ff, 0x035f, 0x03ff, 0x07f0, 0x8a4f, 0xa111, 0xa111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410f, 0x390f, 0x30ee, 0x30ee, 0x30cd, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cc, 0x20ac, 0x28cc, 0x28cc, 0x28cc, 0x20cc, 0x28cc, 0x28cc, 0x28cd, 0x40ee, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0x90d5, 0x88d6, 0x6098, 0x5879, 0x303c, 0x305c, 0x081e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x291c, 0x411a, 0x6118, 0x8915, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0x429a, 0x039f, 0x039f, 0x035f, 0x035f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x031f, 0x031f, 0x031f, 0x037f, 0x03ff, 0x06d7, 0x7acf, 0xa111, 0xa111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410f, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cc, 0x490e, 0xc1d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc952, 0x98f5, 0x60b8, 0x407b, 0x183e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x011f, 0x013f, 0x017f, 0x019f, 0x01df, 0x021f, 0x21fd, 0x49d9, 0x7996, 0xa112, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x139e, 0x03df, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x033f, 0x033f, 0x035f, 0x03bf, 0x041f, 0x05de, 0x7ad1, 0xa111, 0xa111, 0xa111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x692f, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc992, 0xc9b2, 0xc972, 0xb973, 0x80f7, 0x387b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01bf, 0x01ff, 0x023f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x2adc, 0x5a58, 0x8994, 0xa8f1, 0xa8f1, 0x81d4, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x039f, 0x037f, 0x035f, 0x037f, 0x039f, 0x03ff, 0x047f, 0x04ff, 0x6375, 0xa112, 0xa111, 0xa111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390f, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x692e, 0xc9f3, 0xc9d2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc993, 0x80f7, 0x389b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x083c, 0x085b, 0x105b, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187a, 0x105b, 0x085d, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x01bf, 0x01ff, 0x021f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03df, 0x041f, 0x043f, 0x0c3f, 0x2bbc, 0x0c3f, 0x045f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03bf, 0x039f, 0x037f, 0x039f, 0x03df, 0x043f, 0x04bf, 0x053f, 0x5398, 0xa111, 0xa111, 0xa111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cb, 0x614e, 0xd1f3, 0xc9f3, 0xc9d3, 0xc9b2, 0xc9b3, 0xb173, 0x60d9, 0x081e, 0x003d, 0x083b, 0x1878, 0x1877, 0x28d2, 0x28d2, 0x40ee, 0x38ee, 0x390f, 0x390f, 0x390f, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4130, 0x38f3, 0x28b6, 0x189a, 0x003e, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x027f, 0x029f, 0x02ff, 0x033f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x047f, 0x04bf, 0x04df, 0x04df, 0x04bf, 0x04bf, 0x047f, 0x047f, 0x043f, 0x043f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03df, 0x043f, 0x047f, 0x04df, 0x057f, 0x3c1a, 0xa111, 0xa111, 0xa111, 0xa111, 0x5931, 0x4910, 0x4110, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x20cb, 0x28ab, 0x692e, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xb1b2, 0x58f3, 0x1895, 0x28b2, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x492f, 0x4930, 0x4910, 0x38f3, 0x20b8, 0x087d, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x019f, 0x01df, 0x021f, 0x025f, 0x02bf, 0x02df, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x04ff, 0x051f, 0x051f, 0x053f, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x047f, 0x047f, 0x045f, 0x045f, 0x043f, 0x041f, 0x03ff, 0x03df, 0x03ff, 0x043f, 0x045f, 0x04bf, 0x053f, 0x05bf, 0x2cdc, 0xa112, 0xa111, 0xa111, 0xa111, 0x7131, 0x4930, 0x4130, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28cb, 0x28cb, 0x612e, 0xc9f3, 0xc9d3, 0xc9d3, 0xb992, 0x692e, 0x28cc, 0x28ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x390e, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x38ee, 0x40ee, 0x40ee, 0x390f, 0x390e, 0x410e, 0x40ef, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4910, 0x4910, 0x4930, 0x4113, 0x28f8, 0x08fe, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x029f, 0x02bf, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x051f, 0x053f, 0x057f, 0x059f, 0x057f, 0x055f, 0x053f, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x049f, 0x047f, 0x045f, 0x043f, 0x041f, 0x041f, 0x043f, 0x045f, 0x04bf, 0x04ff, 0x055f, 0x05df, 0x0e1f, 0xa111, 0xa111, 0xa111, 0xa112, 0x8931, 0x4930, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x20cb, 0x612e, 0xd1f3, 0xc9f3, 0xc1b2, 0x612e, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197a, 0x01de, 0x021f, 0x027f, 0x02bf, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03ff, 0x045f, 0x049f, 0x04df, 0x051f, 0x057f, 0x059f, 0x05df, 0x05df, 0x05df, 0x05bf, 0x059f, 0x055f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04bf, 0x047f, 0x045f, 0x043f, 0x043f, 0x047f, 0x04bf, 0x04ff, 0x053f, 0x05bf, 0x061f, 0x069f, 0x9972, 0xa111, 0xa111, 0xa111, 0xa111, 0x5130, 0x4910, 0x410f, 0x390f, 0x390e, 0x38ed, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x510d, 0xd1f3, 0xc9d2, 0x816f, 0x30cc, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31b6, 0x0a9d, 0x02ff, 0x035f, 0x039f, 0x03ff, 0x043f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x05bf, 0x05df, 0x061f, 0x063f, 0x063f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x047f, 0x047f, 0x047f, 0x049f, 0x04df, 0x053f, 0x057f, 0x05ff, 0x065f, 0x06df, 0x7a95, 0xa111, 0xa111, 0xa111, 0xa111, 0x6911, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x40ec, 0xc1d2, 0xc1b3, 0x490d, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39d5, 0x131c, 0x041f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x059f, 0x05df, 0x061f, 0x067f, 0x069f, 0x069f, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x051f, 0x057f, 0x05bf, 0x063f, 0x069f, 0x071f, 0x5438, 0xa111, 0xa111, 0xa111, 0xa111, 0x8111, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x30cb, 0xa992, 0xa9b1, 0x30cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3a15, 0x237b, 0x053f, 0x059f, 0x5358, 0x349b, 0x0e1f, 0x06bf, 0x06ff, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x057f, 0x055f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04ff, 0x051f, 0x055f, 0x059f, 0x05ff, 0x065f, 0x06df, 0x073f, 0x359b, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x4930, 0x4910, 0x412f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x692f, 0x816f, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28cb, 0x28cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49d4, 0x243a, 0xa132, 0xa8f1, 0xa8f1, 0xa8f1, 0x8295, 0x8295, 0x5418, 0x351b, 0x06df, 0x069f, 0x067f, 0x065f, 0x063f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x051f, 0x053f, 0x057f, 0x059f, 0x05df, 0x063f, 0x069f, 0x06ff, 0x077f, 0x0f5f, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0x6911, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ee, 0x38ed, 0x38ed, 0x390e, 0x390e, 0x390e, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa172, 0x4c39, 0x2d5c, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x059f, 0x057f, 0x055f, 0x055f, 0x055f, 0x057f, 0x059f, 0x05df, 0x061f, 0x067f, 0x06df, 0x073f, 0x079f, 0x07df, 0x8254, 0xa111, 0xa131, 0xa111, 0x9911, 0x8131, 0x4910, 0x410f, 0x410e, 0x38ee, 0x38ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xa111, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa111, 0xa911, 0xa0f1, 0x9972, 0x4419, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05df, 0x061f, 0x065f, 0x06bf, 0x06ff, 0x075f, 0x07bf, 0x07ff, 0x5498, 0xa131, 0xa111, 0xa111, 0xa111, 0x9911, 0x4930, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x28cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x490f, 0x412f, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa111, 0x7a55, 0x34bb, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x063f, 0x065f, 0x069f, 0x06df, 0x071f, 0x077f, 0x07bf, 0x07ff, 0x2e3c, 0x9911, 0xa111, 0xa111, 0x9931, 0x9931, 0x6910, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x62f6, 0x347b, 0x061f, 0x061f, 0x063f, 0x063f, 0x065f, 0x067f, 0x06bf, 0x071f, 0x073f, 0x079f, 0x07df, 0x07ff, 0x07ff, 0xa111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x349b, 0x065f, 0x067f, 0x069f, 0x06bf, 0x06ff, 0x073f, 0x077f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0xa111, 0x9911, 0xa111, 0x9931, 0x9931, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa911, 0xa112, 0xa111, 0xa911, 0xa111, 0xa112, 0xa0f1, 0xa111, 0xa111, 0xa111, 0x7a75, 0x15fd, 0x06bf, 0x06ff, 0x071f, 0x075f, 0x079f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410f, 0x390e, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x40ee, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x5931, 0x90f1, 0xa911, 0xa912, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0x9972, 0x353b, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x8111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa112, 0xa111, 0xa111, 0x4499, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9931, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490f, 0x410f, 0x38ee, 0x30ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x28ab, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x310e, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x7131, 0xa111, 0xa111, 0xa112, 0xa111, 0xa0f1, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa131, 0x6397, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390f, 0x38ee, 0x38ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x38ee, 0x30ed, 0x38ed, 0x390e, 0x38ee, 0x410e, 0x410f, 0x410f, 0x4930, 0x4930, 0x6931, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x6397, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x5c14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410f, 0x390e, 0x390e, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x30ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0x9931, 0x5498, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x35f5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510f, 0x390e, 0x390e, 0x38ed, 0x30ed, 0x30cc, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x28cb, 0x20cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xa111, 0xa111, 0xa111, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa111, 0xa111, 0x3d7a, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28ab, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28cb, 0x20ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x9192, 0x1ebd, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x7a71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20ab, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ac, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cc, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x28ce, 0x28ce, 0x28ce, 0x28ee, 0x28ce, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ef, 0x390f, 0x390f, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xa111, 0xa111, 0xa111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07ff, 0x07ff, 0x07fd, 0x07f6, 0x5c32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390f, 0x30ef, 0x30ef, 0x30ee, 0x30ce, 0x28cd, 0x28ee, 0x28ed, 0x28cd, 0x20cd, 0x20ac, 0x20cd, 0x20cd, 0x20ad, 0x20cd, 0x20ad, 0x20cc, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, + 0x18d2, 0x10f2, 0x18d2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x20f2, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xa111, 0xa111, 0x9931, 0x9911, 0xa111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5c38, 0x07ff, 0x07fd, 0x07f6, 0x44f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x1912, 0x18f2, 0x20f3, 0x18f2, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, + 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28f3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xa111, 0xa112, 0xa111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2e5c, 0x07fc, 0x07f6, 0x2e53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20f3, 0x2112, 0x20f3, 0x20d3, 0x1912, 0x18f2, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, + 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x365e, 0x2e5d, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3d, 0x363d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x361d, 0x361d, 0x361d, 0x361d, 0x361d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1e, 0x461e, 0x461d, 0x4dfe, 0x4dfd, 0x4e3e, 0x4dfe, 0x55dd, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7a74, 0x07fb, 0x07f6, 0x07f6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4cfb, 0x3dfe, 0x35dd, 0x35dd, 0x2ddd, 0x2ddd, 0x2ddd, 0x2ddd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25dc, 0x25bd, 0x25bd, 0x25bd, 0x1dbd, 0x25bc, 0x1dbd, 0x1dbd, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, + 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2ddd, 0x2d5d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2dbd, 0x2dbd, 0x2cfd, 0x2d1d, 0x251c, 0x251c, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3d1d, 0x451d, 0x451d, 0x451d, 0x4d1d, 0x4d1d, 0x553d, 0x91b3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa112, 0x9931, 0x9931, 0x5496, 0x07f7, 0x07f7, 0x8a13, 0xa111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34dd, 0x34dd, 0x2cdd, 0x2cdc, 0x2cdd, 0x2cbc, 0x24dc, 0x24bc, 0x24bc, 0x253c, 0x25bd, 0x253c, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, + 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b7c, 0x259d, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x245d, 0x259c, 0x22fc, 0x2afc, 0x231c, 0x2afc, 0x22fc, 0x231c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2afc, 0x2b1c, 0x2b1c, 0x2b1c, 0x331c, 0x331c, 0x331c, 0x331c, 0x331c, 0x3b1c, 0x3b3d, 0x3b3d, 0x3b3d, 0x433c, 0x433d, 0x4b3d, 0x435d, 0x5a9a, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07f9, 0x72d4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331c, 0x32fc, 0x2afb, 0x2afc, 0x2afb, 0x22fb, 0x22dc, 0x22dc, 0x22fb, 0x22db, 0x22db, 0x235c, 0x1d5c, 0x1d1d, 0x231b, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, + 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x243c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x259c, 0x247c, 0x23bc, 0x23bc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23bc, 0x23bc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x33dc, 0x33dc, 0x33dc, 0x33dc, 0x3bdc, 0x3bfc, 0x3bfc, 0x3bdc, 0x43fc, 0x43fd, 0x6b18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6b53, 0x07fa, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbb, 0x23bb, 0x23bb, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bdb, 0x1d5c, 0x1d1c, 0x1b9b, 0x1b9b, 0x139b, 0x139c, 0x1b9b, 0x1b7b, 0x1b7b, 0x139b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b9b, 0x139b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, + 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1b9c, 0x1bdc, 0x1bbb, 0x1c5b, 0x1cfb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1d3c, 0x1cbc, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9c, 0x1b9c, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9c, 0x1b9b, 0x1bbb, 0x239b, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbc, 0x33bc, 0x33bc, 0x33dc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4c98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4b19, 0x23bc, 0x239b, 0x239b, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x14bb, 0x151b, 0x13db, 0x137b, 0x137a, 0x137b, 0x137b, 0x137a, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, + 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19da, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19db, 0x19da, 0x19db, 0x19fb, 0x153c, 0x123a, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x11db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x19db, 0x19ba, 0x11da, 0x11ba, 0x1abb, 0x14fb, 0x1a5b, 0x19ba, 0x19ba, 0x11da, 0x11da, 0x19db, 0x19db, 0x19da, 0x19db, 0x19ba, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x21db, 0x21db, 0x21db, 0x21fb, 0x21fb, 0x29fb, 0x29fb, 0x29fb, 0x29fb, 0x31fb, 0x321b, 0x31fb, 0x321b, 0x41fa, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72d4, 0x4c98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21db, 0x21da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11d9, 0x137a, 0x149b, 0x131a, 0x11ba, 0x119a, 0x11b9, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, + 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133a, 0x135b, 0x135a, 0x135b, 0x135b, 0x149b, 0x13fb, 0x133a, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x133a, 0x135a, 0x133a, 0x143b, 0x147b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133a, 0x135b, 0x133b, 0x133b, 0x1b3b, 0x1b5b, 0x1b5b, 0x1b3b, 0x1b5b, 0x235b, 0x235b, 0x235b, 0x235b, 0x2b5b, 0x2b5b, 0x2b7b, 0x2b7b, 0x335b, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72d5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71b4, 0x1b3b, 0x1b3b, 0x133a, 0x133b, 0x133a, 0x131a, 0x131a, 0x131a, 0x131a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0afa, 0x0b1a, 0x0afa, 0x0bda, 0x0cbb, 0x0bda, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, + 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b7a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bda, 0x0c7b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x131a, 0x131a, 0x131a, 0x131a, 0x131a, 0x1b1a, 0x1b3a, 0x1b3a, 0x1b3a, 0x1b3a, 0x233a, 0x233a, 0x233b, 0x2b3b, 0x2b5b, 0x3ad9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1b1a, 0x131a, 0x131a, 0x12fa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x035a, 0x045a, 0x0c3a, 0x0afa, 0x02da, 0x0afa, 0x0af9, 0x02f9, 0x0afa, 0x0afa, 0x0afa, 0x02d9, 0x02d9, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0bfa, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0bda, 0x02d9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199a, 0x1999, 0x2199, 0x219a, 0x21ba, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01d8, 0x0399, 0x0399, 0x01d9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, + 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02b9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01d8, 0x03f9, 0x01f8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03f9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03f9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03b9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01b7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0af8, 0x0af8, 0x0af8, 0x0af8, 0x0b18, 0x0b18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1b18, 0x2af8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0af8, 0x0af8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x0378, 0x0378, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d8, + 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01f7, 0x0358, 0x0196, 0x0196, 0x01b6, 0x0196, 0x01b6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02f7, 0x02f7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01b6, 0x01b6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09b7, 0x0997, 0x09b7, 0x09b7, 0x09b7, 0x11b7, 0x11b7, 0x11d7, 0x11b7, 0x11b7, 0x11b7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09b6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02b7, 0x0337, 0x0216, 0x0196, 0x0196, + 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f5, 0x00d5, 0x00d5, 0x00d6, 0x00d6, 0x00d5, 0x00f5, 0x02f7, 0x0176, 0x00f5, 0x00d5, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x0116, 0x02f7, 0x01d6, 0x00d6, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x08f6, 0x08f6, 0x08f6, 0x08f6, 0x0916, 0x0916, 0x10f6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08f5, 0x08f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x01d6, 0x02f7, 0x0236, 0x0114, + 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01f5, 0x0235, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x0154, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x08d4, 0x08d4, 0x08d4, 0x08f4, 0x08f4, 0x08f4, 0x08f5, 0x10f4, 0x10d5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00d3, 0x00d3, 0x0214, 0x0295, + 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x0293, 0x00d2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0172, 0x0253, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x08b2, 0x08b2, 0x08b2, 0x08d2, 0x08b2, 0x08d2, 0x08d3, 0x10d3, 0x40f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00d2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0131, + 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x0171, 0x0091, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x01d1, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f1, 0x0171, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00b0, 0x00b0, 0x00b1, 0x08b1, 0x08b0, 0x08b1, 0x08b1, 0x50f1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, + 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00f0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f0, 0x0232, 0x00f1, 0x00b0, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0890, 0x08b0, 0x0891, 0x10b0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0191, 0x01b1, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x006f, 0x008f, 0x0131, 0x0232, 0x00d0, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60f1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006f, 0x0090, 0x006f, 0x008f, 0x008f, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00cf, 0x0232, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x0191, 0x0212, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x18af, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9931, 0xa111, 0x29d2, 0x01b1, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x01d1, 0x0130, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x01f1, 0x01b1, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28d0, 0x01f2, 0x01d1, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0110, 0x01f1, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x0110, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x48d0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008e, 0x008f, 0x01b1, 0x01f2, 0x00af, 0x006f, 0x006e, 0x008f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x108f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006e, 0x006f, 0x006e, 0x0190, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0170, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01f1, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x68f0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0211, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01b1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x38b0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x010f, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x01d1, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x008e, 0x01f1, 0x012f, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x086e, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0211, 0x0190, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004d, 0x004d, 0x004e, 0x010f, 0x01d1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x00ce, 0x0212, 0x00ce, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x70f0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x008e, 0x01d1, 0x0190, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006e, 0x01f1, 0x008e, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x010f, 0x01f1, 0x006d, 0x006d, 0x004d, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004e, 0x006d, 0x006d, 0x004d, 0x40cf, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70f0, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0191, 0x01b1, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp new file mode 100644 index 000000000000..cff7c0b0a7e3 --- /dev/null +++ b/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp @@ -0,0 +1,350 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint16_t marlin_logo_480x320x16[153600] = { + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x10ae, 0x00f8, 0x00f9, 0x00d6, 0x18ad, 0x188c, 0x188c, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x188d, 0x188d, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ac, 0x18ac, 0x188d, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x18ac, 0x18ac, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x18ab, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x10ae, 0x00f7, 0x00f9, 0x00f6, 0x188d, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x188d, 0x18ac, 0x18ac, 0x188d, 0x188d, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x10af, 0x00f8, 0x00f8, 0x00f7, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188d, 0x18ac, 0x18ad, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x00f9, 0x00f9, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x10af, 0x00f7, 0x00f8, 0x00f6, 0x18ad, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x10af, 0x00f8, 0x00f9, 0x00d6, 0x18ad, 0x18ad, 0x188c, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x188d, 0x18ac, 0x18ad, 0x18af, 0x00f8, 0x00f9, 0x00f6, 0x18ae, 0x188d, 0x18ac, 0x188d, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x10d3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, + 0x188b, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x188c, 0x18ac, 0x188d, 0x10af, 0x00f8, 0x0119, 0x00d7, 0x18ae, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, + 0x188b, 0x188c, 0x188c, 0x188c, 0x188b, 0x188b, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, + 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, + 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x08b2, 0x08d2, + 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x00f8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08f6, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f8, 0x00f8, + 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0117, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x00f9, 0x00f9, + 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x0119, 0x00f6, 0x10f2, 0x10d1, 0x10d0, 0x10d1, 0x10d3, 0x08f6, 0x00f9, 0x00f9, 0x0119, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f8, 0x00f8, + 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18d0, 0x0118, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18cd, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x00f9, 0x00f8, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08d5, 0x011a, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188d, 0x00f9, 0x00f8, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0118, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x188c, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f9, 0x0119, 0x011a, 0x0119, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x18ac, 0x188c, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0118, 0x0119, 0x0119, 0x0118, 0x10d1, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f3, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x011a, 0x0119, 0x08f3, 0x10d1, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f7, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x10d0, 0x10f4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x0117, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x188c, 0x188c, 0x188c, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x08f5, 0x0139, 0x00fa, 0x011a, 0x0119, 0x08f5, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x08f4, 0x20ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08d4, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x00f7, 0x011a, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x00f9, 0x00f9, + 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x188c, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0118, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x0118, 0x0119, 0x08f7, 0x10d1, 0x10d1, 0x00f7, 0x0119, 0x0118, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x00f6, 0x011a, 0x08f3, 0x18ae, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08d4, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x00f7, 0x011a, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00f9, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d1, 0x18cd, 0x18ad, 0x10d1, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f4, 0x011a, 0x011a, 0x10f1, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d0, 0x18ae, 0x08d5, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f7, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x10d0, 0x10f4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x0117, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10f2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, + 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x10b1, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, + 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0118, 0x0119, 0x00f7, 0x10d1, 0x10d1, 0x00f7, 0x0119, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, + 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10f1, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10f1, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08d5, 0x011a, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, + 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x10d1, 0x00f8, 0x0119, 0x0119, 0x00f8, 0x10d1, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0118, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d3, 0x10d3, + 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x0119, 0x00f6, 0x10f2, 0x10d1, 0x10d0, 0x10d1, 0x10d3, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d2, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x011a, 0x08f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x013a, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cf, 0x0119, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08f5, 0x10d1, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x10d2, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x08d5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x011a, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d0, 0x10d3, 0x08f4, 0x08f3, 0x08f3, 0x10f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x10d3, 0x10d3, 0x08f3, 0x08f3, 0x08d4, 0x10d3, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cf, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18cd, 0x10f3, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, + 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d1, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ae, 0x18ae, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f4, + 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18cd, 0x18af, 0x0119, 0x011a, 0x00f9, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, + 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, + 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x10d2, + 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x00f9, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x00f9, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x08d3, 0x18ad, 0x18ad, 0x08d3, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d3, 0x18ad, + 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10b0, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0139, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x20ce, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0139, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, + 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0116, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x10d1, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, + 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00fa, 0x18d1, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10f3, 0x08d3, 0x10d2, 0x0117, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x08f5, 0x18ce, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0116, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18af, 0x00f8, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x00f9, 0x18ad, 0x18ae, 0x208d, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18af, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18cd, 0x20ad, 0x18ae, 0x18ae, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x08f6, 0x0119, 0x0119, 0x011a, 0x0119, 0x0116, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cf, 0x00f9, 0x011a, 0x08f5, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x00f8, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, + 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18cf, + 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x18d0, 0x18ad, + 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ae, + 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00fa, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, + 0x08f7, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x10f3, 0x08f3, 0x10d3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x08f3, 0x10f2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x08f3, 0x0119, 0x0119, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x310e, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x10d2, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18d0, + 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x28ee, 0x8252, 0xcb54, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, + 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x394f, 0xb313, 0xd395, 0x7211, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18cd, 0x18cd, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x496f, 0xcb55, 0xd395, 0xbb54, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x00f7, + 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x208d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00fa, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x61d0, 0xd395, 0xd395, 0xd395, 0x69f1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x011a, 0x00f7, 0x18ae, + 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x61d0, 0xd395, 0xd395, 0xd396, 0xd375, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, + 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, + 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10f2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8252, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, + 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x08f7, 0x00f9, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x5190, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x412f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x10f3, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0355, 0x190f, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f4, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x496f, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x011a, 0x0117, 0x0117, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18b0, 0x0119, 0x00f9, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x11d1, 0x03b7, 0x0a93, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x28ee, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9ab3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x00f9, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x10af, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x10d0, 0x0118, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x10f2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x7a31, 0xd395, 0xd395, 0xd375, 0xdb95, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f4, 0x10d2, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x00fa, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11d1, 0x03b8, 0x03b7, 0x03b8, 0x0a94, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x00f9, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x00f9, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xd395, 0xb313, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18cd, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0356, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x190e, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0xa2d3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xa2d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a94, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0356, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x190f, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x61d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ce, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0397, 0x03b8, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x59d0, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x011a, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xaad3, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x10d2, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x011a, 0x10d2, 0x18cd, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x08f5, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x61b1, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x8a92, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x188d, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0xaad3, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x310e, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x10d1, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03d7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x496f, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0x7231, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x10d3, 0x08d3, 0x10d2, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x10d2, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x20ae, 0x8a92, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x7a31, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x28ee, 0xc374, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xa2d3, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ce, 0x194f, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x61d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0x69f1, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x011a, 0x011a, 0x00f9, 0x08f7, 0x18ce, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x02f5, 0x03b7, 0x03b8, 0x0356, 0x114f, 0x18ad, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x9ab3, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x0a32, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0356, 0x18ad, 0x18ad, 0x0a32, 0x03b7, 0x03b8, 0x03b8, 0x03b8, 0x0376, 0x18ee, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x00f9, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x190f, 0x0377, 0x0397, 0x03b8, 0x0398, 0x0397, 0x0b77, 0x18ce, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b8, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x03b7, 0x0bb7, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x4970, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ee, 0x0377, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0a33, 0x190e, 0x0397, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x11d1, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x11b0, 0x0a93, 0x0356, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x1253, 0x0b78, 0x0b98, 0x0b78, 0x0b98, 0x0b98, 0x1378, 0x11f2, 0x18ad, 0x18ad, 0x0b98, 0x0b78, 0x0b78, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0b98, 0x1378, 0x0b78, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x4970, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0x8252, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x11d1, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x0377, 0x0ad4, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x02f5, 0x18ae, 0x18ad, 0x03b7, 0x03b8, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x192f, 0x03b7, 0x03b7, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1ab5, 0x1b78, 0x1b58, 0x1358, 0x1b78, 0x1378, 0x1358, 0x1a13, 0x18ae, 0x18ae, 0x1358, 0x1358, 0x1378, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x1358, 0x1358, 0x1358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd395, 0xc354, 0x5990, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0356, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x194f, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f8, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f9, 0x0119, 0x00f9, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1a54, 0x1b38, 0x1b38, 0x2338, 0x1b38, 0x1b58, 0x2338, 0x21d2, 0x18ad, 0x18ad, 0x2338, 0x2338, 0x2358, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x1930, 0x2339, 0x2358, 0x2338, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xa2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x011a, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x1170, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x0a53, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x0396, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x2150, 0x2b18, 0x2b39, 0x2b18, 0x2b19, 0x2b19, 0x2af8, 0x18ce, 0x18ad, 0x18ad, 0x2b19, 0x2b18, 0x2b19, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x2192, 0x2b19, 0x2b19, 0x2b18, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0xbb34, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x4970, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0af5, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x0377, 0x18ee, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b8, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x11b0, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x0117, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x10cf, 0x0118, 0x0119, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2192, 0x2b19, 0x3319, 0x32f9, 0x2a15, 0x18ef, 0x20ad, 0x18ad, 0x18ad, 0x32f9, 0x3319, 0x32f9, 0x18ad, 0x18ad, 0x18ad, 0x2191, 0x3319, 0x2af9, 0x3319, 0x2af9, 0x2a97, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x190f, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x11d1, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x03b7, 0x0397, 0x03b7, 0x03b7, 0x03b7, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x18d0, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x3ad9, 0x3ad9, 0x3ad9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x3af9, 0x3ad9, 0x3ad9, 0x18ad, 0x20ad, 0x3215, 0x3ad9, 0x3af9, 0x3ada, 0x3ad9, 0x3277, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x4950, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xaab3, 0x20ce, 0x18ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x03b7, 0x0397, 0x0397, 0x03b7, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0ad5, 0x0397, 0x0398, 0x03b8, 0x0398, 0x03b8, 0x18ee, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0398, 0x0398, 0x03b8, 0x0398, 0x0398, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0398, 0x0398, 0x0398, 0x0398, 0x0398, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0139, 0x011a, 0x0117, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x42d9, 0x42b9, 0x42b9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x42b9, 0x42b9, 0x42ba, 0x18ae, 0x31f5, 0x42da, 0x42d9, 0x42b9, 0x42d9, 0x3a77, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x5991, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd375, 0xd355, 0xd355, 0xd355, 0x9252, 0x30ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, 0x2338, 0x2338, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x2150, 0x2318, 0x2338, 0x2338, 0x2318, 0x2318, 0x2338, 0x21f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x2339, 0x2318, 0x2318, 0x2339, 0x2338, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x2338, 0x2338, 0x2338, 0x2338, 0x2338, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x00f7, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10f3, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x4ab9, 0x4a9a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4aba, 0x4aba, 0x4a9a, 0x4257, 0x4a99, 0x4a9a, 0x4a9a, 0x4aba, 0x4237, 0x20ce, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x0119, 0x0119, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x69f1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xcb14, 0x4130, 0x20af, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x42b9, 0x4a99, 0x42b9, 0x42ba, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4257, 0x4aba, 0x4a9a, 0x4a99, 0x42b9, 0x4a9a, 0x42b9, 0x4a9a, 0x20ef, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a9a, 0x42b9, 0x42b9, 0x4aba, 0x4ab9, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4a99, 0x42b9, 0x4aba, 0x4a99, 0x4a99, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x527a, 0x527a, 0x527a, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x527a, 0x527a, 0x529a, 0x527a, 0x527a, 0x527a, 0x527a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18d2, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x8253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0x7a11, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x621a, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x6a3b, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x3932, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x59d7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x6a3b, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x6a1b, 0x6a3b, 0x6a3b, 0x6a1b, 0x6a3b, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x011a, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x20ae, 0x08f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x5a5b, 0x5a5a, 0x5a7a, 0x2910, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x5a5a, 0x5a7b, 0x5a5a, 0x5a5a, 0x5a5a, 0x5a5a, 0x4a18, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x091a, 0x18f2, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x8232, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xa293, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x89bc, 0x89bc, 0x91bc, 0x89bc, 0x899c, 0x89bc, 0x89bc, 0x89bb, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x899b, 0x89bc, 0x89bc, 0x89bc, 0x799a, 0x7179, 0x89bb, 0x899c, 0x89bc, 0x89bc, 0x38f1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x89bc, 0x899c, 0x899c, 0x89bc, 0x89bc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x89bc, 0x899c, 0x89bc, 0x899c, 0x89bc, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0117, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x623a, 0x623b, 0x625a, 0x621a, 0x2910, 0x18cd, 0x18ad, 0x18ad, 0x623b, 0x623a, 0x625a, 0x623b, 0x623b, 0x51f8, 0x20ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x0917, 0x18d2, 0x18d2, 0x0918, 0x091a, 0x0918, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30d0, 0x30f0, 0x30f0, 0x8252, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0x9253, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xb11d, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x60f5, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0x60f5, 0x40d1, 0xb11d, 0xb13d, 0xa93d, 0xa93d, 0x991b, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xa93d, 0xa93d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa93d, 0xa93d, 0xa93d, 0xb13d, 0xa93d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x00f7, 0x00f7, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x59d8, 0x6a1b, 0x6a1b, 0x6a1b, 0x6a1b, 0x4133, 0x18ad, 0x18ad, 0x6a3b, 0x6a1b, 0x6a1b, 0x6a1b, 0x51b6, 0x20cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x00f9, 0x10d3, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18d1, 0x20ce, 0x20ce, 0x18d1, 0x093a, 0x093a, 0x28ef, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x9273, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0xd335, 0xd334, 0xd334, 0xd314, 0xd315, 0xaa93, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd09e, 0xd0be, 0xd0be, 0x18ad, 0x18ad, 0x18ad, 0x30b0, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x20ae, 0x18ad, 0xb8bc, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x68b5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0xd0be, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x011a, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ce, 0x61b8, 0x721b, 0x71fb, 0x721b, 0x721b, 0x4133, 0x20ad, 0x71fb, 0x721b, 0x71fb, 0x4174, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0119, 0x011a, 0x18d1, 0x20ae, 0x20ce, 0x20f1, 0x093a, 0x093a, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0xaaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ae, 0x20ad, 0x20ad, 0x20ae, 0x30ee, 0x6150, 0x81b1, 0xa1f2, 0xc233, 0xca53, 0xca54, 0xca53, 0xc233, 0xa1f2, 0x8191, 0x512f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0x18ad, 0x20ad, 0x18ad, 0xb079, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xa058, 0x18ad, 0x18ad, 0x7095, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xe83e, 0x28ae, 0x20ad, 0x18ad, 0x18ad, 0xf03f, 0xf01f, 0xf03f, 0xf03f, 0xf03f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x00f9, 0x0119, 0x0119, 0x10d0, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ce, 0x69b9, 0x81fb, 0x79db, 0x79dc, 0x81fc, 0x5976, 0x79db, 0x79dc, 0x81dc, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x0918, 0x0119, 0x0917, 0x18d0, 0x20d0, 0x0917, 0x093a, 0x1138, 0x28cf, 0x30cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0xaad4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd315, 0xd314, 0x69b2, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x410f, 0x6990, 0x99f2, 0xc253, 0xca74, 0xd274, 0xca74, 0xd253, 0xca53, 0xca53, 0xca53, 0xd233, 0xd253, 0xca53, 0xd233, 0xca33, 0xc213, 0x8991, 0x410f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0119, 0x011a, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x7199, 0x89db, 0x89bc, 0x81bc, 0x89bc, 0x89bc, 0x89bc, 0x89bc, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d2, 0x0119, 0x0119, 0x093a, 0x093a, 0x093a, 0x093a, 0x20f2, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xcad4, 0x5971, 0x30f0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x38ef, 0x79b1, 0xba53, 0xca94, 0xca94, 0xca74, 0xd273, 0xd273, 0xca73, 0xca54, 0xca53, 0xca54, 0xca53, 0xca33, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xd213, 0xca13, 0xca13, 0xa1b2, 0x490f, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x7979, 0x919c, 0x919c, 0x91bc, 0x919c, 0x899c, 0x89bc, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x18f2, 0x0919, 0x091a, 0x091a, 0x0919, 0x20f3, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x4112, 0xb2f5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd314, 0xd2f5, 0xd2f4, 0xd2f4, 0x4930, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x4130, 0x89f1, 0xd294, 0xd294, 0xca93, 0xca74, 0xd274, 0xca74, 0xca74, 0xca53, 0xca73, 0xd253, 0xd254, 0xca53, 0xca53, 0xca54, 0xc274, 0x9b36, 0x83b8, 0x6419, 0x6c39, 0x6439, 0x6c1a, 0x8b57, 0xb295, 0xca13, 0x9191, 0x28ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cf, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x28ae, 0x8159, 0x917c, 0x997c, 0x997c, 0x999c, 0x999c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x00f9, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20d0, 0x20d1, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd314, 0xd2f4, 0xd2f4, 0xd315, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d5, 0x79d2, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28ef, 0x28f0, 0x28cf, 0x5150, 0xaa32, 0xd293, 0xd294, 0xd294, 0xca93, 0xca74, 0xca74, 0xca74, 0xca74, 0xd274, 0xd254, 0xca53, 0xca54, 0xb2d5, 0x83b8, 0x44fc, 0x1dbe, 0x063f, 0x0cdb, 0x0b76, 0x1377, 0x1377, 0x0b76, 0x1356, 0x0b76, 0x0b77, 0x23f8, 0x6991, 0x510f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x8939, 0xa17c, 0xa17c, 0xa15d, 0xa15d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8a54, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0x5951, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x4130, 0x91f2, 0xd294, 0xd294, 0xca94, 0xca74, 0xca94, 0xca94, 0xca74, 0xd274, 0xd274, 0xd274, 0xd253, 0xb2d5, 0x7419, 0x257d, 0x063f, 0x061f, 0x057d, 0x12b5, 0x190f, 0x18ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ce, 0x913a, 0xa93d, 0xa95d, 0xa95c, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xcab4, 0x5172, 0x3911, 0x38f1, 0x38f0, 0x30f0, 0x81d2, 0xc294, 0xd294, 0xd293, 0xd294, 0xd294, 0xca93, 0xca93, 0xd274, 0xd274, 0xca73, 0xd274, 0x83d8, 0x353d, 0x061f, 0x063f, 0x063f, 0x063f, 0x4c5a, 0x4970, 0x20ae, 0x20ae, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x10d2, 0x08f3, 0x08d4, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xb11d, 0xb11d, 0xb11d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x08d5, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6b36, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xcad4, 0xcab4, 0x5972, 0x3911, 0x5151, 0xb253, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xd274, 0xc294, 0x645a, 0x1dbe, 0x063f, 0x063f, 0x063f, 0x1dbe, 0x6459, 0xc274, 0x99d2, 0x28ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0xb8fe, 0xb8fd, 0xb8fe, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253b, 0x465c, 0x6d7b, 0x6d9a, 0x6d9a, 0x6d7a, 0x84f9, 0x9c78, 0x9c77, 0x9c78, 0x9c78, 0x9c57, 0x9c78, 0x9c58, 0x9c58, 0xbbb6, 0xd334, 0xd315, 0xd334, 0xd315, 0xd314, 0xd315, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xcad4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2d4, 0x91f3, 0x5972, 0xca74, 0xd2b4, 0xd2b4, 0xd294, 0xca94, 0xd294, 0xd294, 0xca94, 0xca74, 0xc2b4, 0x6c5a, 0x0dff, 0x063f, 0x063f, 0x063f, 0x353d, 0x83b8, 0xca53, 0xca33, 0x89b1, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x011a, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0xc0de, 0xc0fe, 0xc0dd, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x00fa, 0x08f4, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x38f1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4d1a, 0x6d9a, 0x94b9, 0x9c98, 0x9c77, 0x9c78, 0x9c78, 0x9c78, 0x94b8, 0x6d7a, 0x6d7a, 0x6d7b, 0x367c, 0x367d, 0x1efe, 0x077f, 0x075f, 0x1ede, 0x363d, 0x6d3a, 0x9c17, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xcad4, 0xd2b3, 0xcab4, 0xc294, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca74, 0xca74, 0xca74, 0x7bd8, 0x0dff, 0x063f, 0x061f, 0x063f, 0x4cbb, 0x9b57, 0xd233, 0xca33, 0xca53, 0x6150, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x20ae, 0x10d2, 0x10d3, 0x08f3, 0x08f3, 0x18d0, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x08f3, 0x18d0, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d1, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x10d1, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x08f3, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0917, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8be, 0xc8de, 0xc8be, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xa2b5, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xbb96, 0xa437, 0x74f9, 0x4dbc, 0x2e7e, 0x0edf, 0x559b, 0x8498, 0xc335, 0xd2f4, 0xd2d4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2b5, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xbab4, 0xbaf6, 0xca94, 0xd294, 0xca94, 0xd273, 0x9b76, 0x1dbe, 0x061f, 0x063f, 0x0ddf, 0x643a, 0xb2d5, 0xca54, 0xd253, 0xca53, 0xc294, 0x59b1, 0x28ce, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x0116, 0x00f9, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d3, 0x011a, 0x0119, 0x00f9, 0x00f6, 0x18ad, 0x08f6, 0x011a, 0x011a, 0x0119, 0x10d3, 0x18cd, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f7, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18cd, 0x00f7, 0x011a, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d1, 0x18ce, 0x00f7, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x40b0, 0xa09a, 0xd0be, 0xd09e, 0xd0be, 0xb89c, 0x78b5, 0x28ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd335, 0xd315, 0xd314, 0xd315, 0xd2f5, 0xd2f5, 0xd2f4, 0x9bf7, 0x6d1a, 0x2e3d, 0x45bc, 0x9418, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xc2d4, 0x4cdb, 0x7bd8, 0x9b57, 0x44fc, 0x063f, 0x063f, 0x1dbe, 0x83d8, 0xc294, 0xca53, 0xca54, 0xca33, 0xca53, 0xb2b5, 0x33b8, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x188e, 0x20cd, 0x10d1, 0x0119, 0x011a, 0x10d1, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x011a, 0x0119, 0x00f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x00f7, 0x0119, 0x0139, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x011a, 0x0139, 0x0119, 0x08f7, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f7, 0x011a, 0x0119, 0x011a, 0x10d3, 0x20ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x08f7, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ae, 0x18ae, 0x18cf, 0x00f8, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x10d0, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x40b0, 0xd07d, 0xd87e, 0xd89f, 0xd89f, 0xe07f, 0xd89e, 0xd89f, 0xb87b, 0x28ae, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xbb14, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd314, 0xd335, 0xd315, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xc335, 0x8478, 0x4d7b, 0x4d5b, 0xab96, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xca94, 0xcab4, 0xd294, 0xd294, 0xd273, 0xc2b4, 0x5c9a, 0x061f, 0x061f, 0x063f, 0x7419, 0xd273, 0xd273, 0xca53, 0xca53, 0xd233, 0xca53, 0xaaf6, 0x153c, 0x2951, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x011a, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x20ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x10b0, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x208d, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb07a, 0xe85f, 0xe85f, 0xe07f, 0xe85f, 0xe87f, 0xe07f, 0xe85f, 0xe07f, 0x9898, 0x20ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xbb15, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd315, 0xcb34, 0xd315, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0xd2f5, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d5, 0xd2d4, 0xd2d4, 0xbb55, 0x7499, 0x35dc, 0x8439, 0xc2f4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xca93, 0xd294, 0xd274, 0xca74, 0x9b76, 0x061f, 0x061f, 0x83d8, 0xc295, 0xca53, 0xca53, 0xca53, 0xca53, 0x7bb8, 0x063f, 0x2a34, 0x30f0, 0x30f0, 0x30ef, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x0119, 0x00f6, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x38b0, 0xf05f, 0xe83f, 0xf03f, 0xf05f, 0xf05f, 0xf03f, 0xf03f, 0xf03f, 0xf05f, 0xe83f, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xbb35, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xcad4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2d4, 0xcab4, 0xd2b4, 0xcab4, 0xcab4, 0x8bf8, 0x3d5c, 0x6499, 0xc2d4, 0xd294, 0xd294, 0xca74, 0xca74, 0xd274, 0xca74, 0xca74, 0x54bb, 0x5c9a, 0x353d, 0x1dbe, 0x4cbb, 0x9377, 0x9b36, 0x44fc, 0x061f, 0x1bf9, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x011a, 0x10d3, 0x18ad, 0x08f6, 0x0119, 0x00f9, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x00f6, 0x0119, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x10d3, 0x0119, 0x011a, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x20ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d0, 0x011a, 0x011a, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x00f9, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f4, 0x10f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x5092, 0xf83f, 0xf83f, 0xf03f, 0xf83f, 0xf83f, 0xf83f, 0xf83f, 0xf81f, 0xf03f, 0xf83f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69b3, 0xc355, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd2f5, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0x9b97, 0x453c, 0x6c59, 0xc2b4, 0xca74, 0xd274, 0xd273, 0xca73, 0xd273, 0xc294, 0x6c39, 0xc294, 0xca53, 0x8b98, 0x4cbb, 0x0dff, 0x063f, 0x0d7e, 0x3972, 0x3911, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x011a, 0x00f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x00f9, 0x011a, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ad, 0x00f6, 0x00f9, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x00f6, 0x0119, 0x011a, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x5092, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x5092, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0x9b77, 0x44dc, 0x73f9, 0xca73, 0xca74, 0xd254, 0xca73, 0xca53, 0xc294, 0x351c, 0x6c3a, 0xc294, 0xd253, 0xca34, 0x83b8, 0x5a55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00fa, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x011a, 0x08f7, 0x18ad, 0x0116, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x011a, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18b0, 0x0119, 0x011a, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4090, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x28af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69d3, 0xc355, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xcb55, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcad4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xcab4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca94, 0xd274, 0xca74, 0x8b78, 0x447c, 0xa316, 0xd253, 0xd253, 0xca54, 0xca53, 0xc294, 0x257d, 0x0ddf, 0x83b8, 0xd233, 0xca33, 0xca33, 0xba13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x30d0, 0x30d0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f6, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0116, 0x20ad, 0x08f6, 0x011a, 0x00f9, 0x0119, 0x10f3, 0x18ad, 0x0116, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x10d4, 0x011a, 0x011a, 0x0119, 0x08f6, 0x20ad, 0x00f6, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x08f7, 0x0119, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f7, 0x011a, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x00f9, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x011a, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0xd03c, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xd03c, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xaad4, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd2b4, 0xca94, 0xca94, 0xd294, 0xca74, 0xca73, 0xca74, 0xd274, 0xc295, 0x6bb9, 0x6b99, 0xca54, 0xca53, 0xd254, 0xca33, 0xc294, 0x24fd, 0x063f, 0x351d, 0xb295, 0xca13, 0xca13, 0xca13, 0xb9f3, 0x7992, 0x4111, 0x4112, 0x38f1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x00f9, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x00f6, 0x011a, 0x0119, 0x011a, 0x10d3, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x0119, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d3, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x00f7, 0x0119, 0x0119, 0x011a, 0x08f3, 0x18ae, 0x00f6, 0x011a, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x011a, 0x08f6, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x08f6, 0x011a, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x10d2, 0x10f3, 0x08f3, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x4090, 0xf03f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x6073, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xcb55, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd314, 0xd335, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xd294, 0xd294, 0xd294, 0xca74, 0xca74, 0xca74, 0xca73, 0xca73, 0xca53, 0xca53, 0xca74, 0xaab6, 0x5b7a, 0xba74, 0xca53, 0xca33, 0xca33, 0xc254, 0x4bfb, 0x059f, 0x0d7f, 0x8b57, 0xc9f3, 0xca13, 0xc9f3, 0xc9f3, 0xa9b3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x10d3, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x08f3, 0x18d1, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x10b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10b0, 0x10d3, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x10d0, 0x18ad, 0x10d2, 0x08f3, 0x10d3, 0x08f3, 0x10d0, 0x18ad, 0x10d0, 0x08f3, 0x08f3, 0x10d3, 0x10d2, 0x18ad, 0x10d2, 0x10d4, 0x08f3, 0x08f3, 0x18d1, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d3, 0x18d1, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4091, 0xe01d, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0xf81f, 0x7074, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x08f3, 0x10d2, 0x20cd, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x10d1, 0x0119, 0x0119, 0x10d2, 0x20ad, 0x18ad, 0x20ae, 0x18cd, 0x20ae, 0x20cd, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xb2f4, 0xd395, 0xdb95, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd334, 0x84f9, 0x467d, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x1f1e, 0x367d, 0x367c, 0x4ddb, 0x653a, 0x8498, 0x9bf7, 0xc2f5, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca73, 0xd253, 0xd254, 0xca74, 0xca53, 0xca53, 0xca53, 0xd253, 0x72d9, 0xaa76, 0xca33, 0xd233, 0xca13, 0xca33, 0x1c7e, 0x059f, 0x05ff, 0x5c7a, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18cd, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10b0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x7074, 0x9077, 0x8856, 0x8876, 0x388f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18cd, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x3911, 0x4111, 0x4132, 0x6193, 0xc355, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x271d, 0x07ff, 0x07ff, 0x07bf, 0x079f, 0x079f, 0x077f, 0x079f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x079f, 0x1efe, 0x461c, 0x6d1a, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca73, 0xd274, 0xca74, 0xca53, 0xd254, 0xca54, 0xd253, 0xca53, 0xca33, 0xa275, 0x9a76, 0xca33, 0xca13, 0xca33, 0x9ad6, 0x04ff, 0x05bf, 0x063f, 0x357c, 0xc254, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x10d0, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f5, 0x18ae, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x0117, 0x0119, 0x011a, 0x08f5, 0x20ae, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xcb55, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xcb55, 0xd334, 0xcb55, 0xac17, 0x0fbf, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x365c, 0x74b9, 0xb315, 0xca73, 0xca54, 0xca54, 0xca53, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xb235, 0xaa16, 0xca33, 0xca13, 0xca13, 0x7b37, 0x055f, 0x05ff, 0x067f, 0x25dd, 0xa2f5, 0xd1d3, 0xc9f3, 0xc9d3, 0xc9d2, 0xc9d3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x0119, 0x00f9, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d3, 0x18ce, 0x20ad, 0x10f4, 0x011a, 0x0119, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61b3, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0x8cb8, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x06df, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x071f, 0x073f, 0x073f, 0x073f, 0x073f, 0x075f, 0x075f, 0x071f, 0x2dfd, 0x7419, 0xb2b5, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0xd233, 0xca14, 0xa215, 0xca13, 0xca13, 0xc9f3, 0x8338, 0x05bf, 0x063f, 0x06bf, 0x0e9f, 0xaad5, 0xc9d3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b2, 0xb1b2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18cf, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x20ae, 0x18d0, 0x0119, 0x0119, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3111, 0x38f1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xc395, 0x5dfa, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06bf, 0x06df, 0x06df, 0x06ff, 0x06ff, 0x06ff, 0x071f, 0x071f, 0x06ff, 0x06bf, 0x065f, 0x05bf, 0x443c, 0x8af7, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca13, 0x99b6, 0xc9f3, 0xca13, 0xc9f3, 0x4c3b, 0x061f, 0x069f, 0x06ff, 0x0ebe, 0xa2d5, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9b2, 0xc1b3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30f0, 0x28f0, 0x30d0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x20ae, 0x20ad, 0x18ce, 0x0119, 0x0119, 0x10d3, 0x20ce, 0x20ae, 0x10f4, 0x0119, 0x011a, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067f, 0x067f, 0x067f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x065f, 0x065f, 0x067f, 0x067f, 0x069f, 0x069f, 0x069f, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x065f, 0x05ff, 0x053f, 0x049f, 0x1bbe, 0x8298, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0xd1f3, 0x99b6, 0xc9f3, 0xc9f3, 0xb254, 0x0d9f, 0x067f, 0x06df, 0x06ff, 0x0ebf, 0xa2d5, 0xc9d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x20ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011a, 0x10f5, 0x20ce, 0x20cf, 0x28cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xbb35, 0xd395, 0xd396, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xac37, 0x6d9a, 0x2efe, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x079f, 0x075f, 0x073f, 0x071f, 0x06df, 0x06bf, 0x069f, 0x067f, 0x065f, 0x065f, 0x063f, 0x063f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x063f, 0x063f, 0x063f, 0x065f, 0x065f, 0x065f, 0x065f, 0x067f, 0x067f, 0x063f, 0x05df, 0x055f, 0x04bf, 0x043f, 0x037f, 0x1abe, 0x7a18, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc1f4, 0x7178, 0xc9f2, 0xd1f3, 0x8338, 0x061f, 0x06bf, 0x06ff, 0x071f, 0x0edf, 0xa2d5, 0xc9b3, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x20ad, 0x20ae, 0x20ae, 0x18ce, 0x0918, 0x011a, 0x011a, 0x0919, 0x011a, 0x0917, 0x20cf, 0x28ae, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xa2b4, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xc3b6, 0x8519, 0x4e3c, 0x0f9f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x06ff, 0x06bf, 0x069f, 0x067f, 0x065f, 0x063f, 0x061f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x05ff, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x061f, 0x05df, 0x057f, 0x04ff, 0x047f, 0x03df, 0x031f, 0x025f, 0x19de, 0x79b8, 0xc9f3, 0xca13, 0xc9f3, 0xb9d3, 0xa1b5, 0xc9d3, 0xc9f3, 0x4c5b, 0x065f, 0x06df, 0x071f, 0x071f, 0x0edf, 0xa2b5, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc993, 0xc992, 0xb172, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x10f3, 0x10f3, 0x10d2, 0x20ae, 0x18ae, 0x20ae, 0x18ce, 0x20ce, 0x20ce, 0x20ce, 0x18f2, 0x10f4, 0x1114, 0x18f3, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xc3b5, 0x7d59, 0x36bd, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x071f, 0x06de, 0x069e, 0x067e, 0x065e, 0x063f, 0x063f, 0x061e, 0x05ff, 0x05df, 0x05bf, 0x05bf, 0x059f, 0x059f, 0x059f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x059f, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05bf, 0x05df, 0x05df, 0x05df, 0x05bf, 0x057f, 0x04ff, 0x049f, 0x03ff, 0x037f, 0x02bf, 0x021f, 0x017f, 0x213d, 0x9996, 0xc9f3, 0xc9f3, 0xb9d4, 0x99b6, 0xc9d3, 0xc213, 0x0dbf, 0x069f, 0x06ff, 0x071f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xa972, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20af, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xaab5, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0x94d8, 0x467c, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x06de, 0x06be, 0x067e, 0x067e, 0x065e, 0x063e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059f, 0x057f, 0x057f, 0x055f, 0x055f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x055f, 0x055f, 0x055f, 0x057f, 0x057f, 0x057f, 0x057f, 0x057f, 0x055f, 0x04ff, 0x04bf, 0x041f, 0x039f, 0x031f, 0x025f, 0x01bf, 0x013f, 0x00bf, 0x40fb, 0xb1b5, 0xc9d2, 0xb1d5, 0xb1d4, 0xc9b3, 0x6399, 0x061f, 0x06df, 0x071f, 0x073f, 0x073f, 0x0eff, 0xa2b5, 0xc992, 0xc992, 0xc972, 0xc972, 0xc992, 0xc972, 0xb152, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20cd, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30d0, 0x28f0, 0x3110, 0x30f0, 0x30f0, 0x30f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4a16, 0xa2b5, 0xd395, 0xd395, 0xd395, 0xd375, 0x8539, 0x1f5e, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x07bf, 0x075f, 0x06be, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fe, 0x05de, 0x05de, 0x05be, 0x059e, 0x057e, 0x055f, 0x053f, 0x053f, 0x051f, 0x051f, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x053f, 0x053f, 0x051f, 0x04df, 0x04bf, 0x043f, 0x03df, 0x035f, 0x02bf, 0x021f, 0x017f, 0x00ff, 0x009f, 0x087f, 0x7119, 0xc9d3, 0xb1d4, 0xb9d3, 0xc9b3, 0x1cfe, 0x065f, 0x06ff, 0x071f, 0x073f, 0x073f, 0x1ebe, 0xb9f3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc973, 0xc952, 0xb152, 0x4111, 0x3910, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20cd, 0x20ce, 0x20ae, 0x20ae, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4a15, 0x3439, 0x16bd, 0x8519, 0xd395, 0xd395, 0xd395, 0x94d8, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x071e, 0x069d, 0x069d, 0x067d, 0x065d, 0x063d, 0x063d, 0x061d, 0x05fd, 0x05dd, 0x05bd, 0x059d, 0x059e, 0x057e, 0x055e, 0x053e, 0x051e, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x049f, 0x049f, 0x049f, 0x049f, 0x049f, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x04bf, 0x04df, 0x04df, 0x04df, 0x04bf, 0x049f, 0x043f, 0x03df, 0x035f, 0x02ff, 0x025f, 0x01bf, 0x013f, 0x00df, 0x007f, 0x005f, 0x185e, 0x8957, 0x61b9, 0xc9d3, 0x9a96, 0x059f, 0x067f, 0x06ff, 0x071f, 0x073f, 0x075f, 0x267d, 0xb9d3, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xb152, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cf, 0x00f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x00f6, 0x18ce, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x38f1, 0x38f1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69b4, 0x6336, 0x6cd9, 0x4e5b, 0x07df, 0x8539, 0xd395, 0xd395, 0xbc17, 0x3e9c, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x06bd, 0x069c, 0x069c, 0x067c, 0x065c, 0x065c, 0x063c, 0x061c, 0x05fc, 0x05dc, 0x05bc, 0x05bd, 0x059d, 0x057d, 0x055d, 0x053e, 0x051e, 0x04fe, 0x04de, 0x04be, 0x04bf, 0x049f, 0x047f, 0x047f, 0x047f, 0x045f, 0x045f, 0x045f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x049f, 0x047f, 0x045f, 0x041f, 0x03df, 0x037f, 0x031f, 0x029f, 0x021f, 0x017f, 0x011f, 0x00bf, 0x005f, 0x001f, 0x001f, 0x00ff, 0x89b7, 0xc9b3, 0x447b, 0x065f, 0x06bf, 0x071f, 0x073f, 0x073f, 0x075f, 0x3d9b, 0xc972, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xa132, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x20cd, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x3110, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x40f1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61b3, 0x9274, 0xb2f5, 0xc355, 0xd395, 0xd395, 0xd395, 0xbc16, 0x469d, 0x8539, 0xd376, 0xd375, 0x6dba, 0x0f9f, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x077f, 0x06bc, 0x06bb, 0x069b, 0x067b, 0x065b, 0x063b, 0x063b, 0x061b, 0x05fb, 0x05db, 0x05bb, 0x059c, 0x059c, 0x057c, 0x055c, 0x053d, 0x051d, 0x04fd, 0x04dd, 0x04be, 0x049e, 0x047f, 0x047f, 0x045f, 0x043f, 0x043f, 0x041f, 0x041f, 0x041f, 0x041f, 0x041f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x043f, 0x041f, 0x03ff, 0x03bf, 0x037f, 0x033f, 0x02bf, 0x023f, 0x01df, 0x015f, 0x00df, 0x009f, 0x005f, 0x001f, 0x005f, 0x097f, 0xb9b3, 0xb214, 0x0dbf, 0x06ff, 0x075f, 0x073f, 0x073f, 0x075f, 0x077f, 0x6479, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x9132, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x08f4, 0x20cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x08f5, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x3110, 0x38f0, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xc335, 0xd395, 0xd395, 0xd395, 0xd395, 0xac57, 0x7d7a, 0x469c, 0x0f9f, 0xa4b8, 0xd395, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x075d, 0x06bb, 0x06bb, 0x069a, 0x067a, 0x065a, 0x065a, 0x063a, 0x061a, 0x05fa, 0x05da, 0x05db, 0x05bb, 0x059b, 0x057b, 0x055b, 0x053c, 0x053c, 0x051c, 0x04fc, 0x04dd, 0x04bd, 0x047e, 0x047e, 0x045e, 0x043f, 0x041f, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03df, 0x03bf, 0x035f, 0x031f, 0x02df, 0x027f, 0x01ff, 0x019f, 0x011f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x009f, 0x39db, 0xc992, 0x6399, 0x069f, 0x079f, 0x07ff, 0x07df, 0x07bf, 0x077f, 0x079f, 0x9af6, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc932, 0x7112, 0x3110, 0x30f0, 0x30ef, 0x28f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x18cf, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08d3, 0x10d2, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xcb75, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x1f7e, 0x07ff, 0x07ff, 0x36dd, 0xbc17, 0x8539, 0x1f5e, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x071b, 0x06da, 0x06ba, 0x06ba, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05f9, 0x05da, 0x05ba, 0x059a, 0x057a, 0x055a, 0x055b, 0x053b, 0x051b, 0x04fc, 0x04dc, 0x04bc, 0x049d, 0x047d, 0x045d, 0x043e, 0x041e, 0x03fe, 0x03df, 0x03df, 0x03bf, 0x03bf, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x039f, 0x037f, 0x035f, 0x031f, 0x02df, 0x027f, 0x023f, 0x01bf, 0x015f, 0x00ff, 0x009f, 0x005f, 0x001f, 0x003f, 0x011f, 0x99b6, 0xb9d3, 0x0d9f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f7e, 0xb9b3, 0xc952, 0xc952, 0xc952, 0xc952, 0xc931, 0xc932, 0xc132, 0x6111, 0x38f0, 0x30f0, 0x28f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xa2b4, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x6dba, 0x0fbf, 0x07ff, 0x07df, 0x07ff, 0x07df, 0x1f7e, 0x07df, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x06f9, 0x06f9, 0x06d9, 0x06b8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05f8, 0x05d8, 0x05b8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051a, 0x04fa, 0x04db, 0x04bb, 0x049c, 0x047c, 0x045d, 0x043d, 0x041e, 0x03fe, 0x03de, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02bf, 0x027f, 0x023f, 0x01ff, 0x019f, 0x013f, 0x00bf, 0x007f, 0x003f, 0x001f, 0x005f, 0x197e, 0xb993, 0x6379, 0x063f, 0x073f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dfb, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc932, 0xc912, 0xb912, 0x4111, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x08f6, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x20ae, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79f3, 0xb2f4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x94f9, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x079d, 0x0719, 0x06f8, 0x06f8, 0x06d7, 0x06b7, 0x06b7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05f7, 0x05d7, 0x05b7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04f9, 0x04da, 0x04bb, 0x049b, 0x047c, 0x043c, 0x041d, 0x041d, 0x03fe, 0x03de, 0x03be, 0x039e, 0x037f, 0x035f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x027f, 0x023f, 0x01ff, 0x019f, 0x015f, 0x00ff, 0x009f, 0x005f, 0x003f, 0x001f, 0x00bf, 0x59ba, 0xb9b3, 0x0d3f, 0x06bf, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7438, 0xc952, 0xc132, 0xc932, 0xc932, 0xc932, 0xc911, 0xc912, 0xa111, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x08f5, 0x011a, 0x0119, 0x00fa, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x5151, 0x79f3, 0xa2b4, 0xcb75, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xc3d6, 0x469c, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0xc335, 0x45d7, 0x0738, 0x0717, 0x06f6, 0x06f6, 0x06d6, 0x06b5, 0x06b5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05f5, 0x05f5, 0x05d6, 0x05b6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04f9, 0x04d9, 0x049a, 0x047b, 0x045b, 0x043c, 0x041c, 0x03dd, 0x03dd, 0x03be, 0x039e, 0x037e, 0x035f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x021f, 0x01ff, 0x01bf, 0x017f, 0x011f, 0x00df, 0x009f, 0x003f, 0x001f, 0x003f, 0x013f, 0xb174, 0x6339, 0x05ff, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb992, 0xc932, 0xc932, 0xc931, 0xc912, 0xc912, 0xc912, 0xc911, 0x8111, 0x30f0, 0x30f0, 0x28ef, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20d0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08f5, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f9, 0x0119, 0x18d0, 0x18cd, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x59b2, 0x7a13, 0x9a94, 0xbb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xac77, 0x2f1e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bc, 0x0759, 0xabb5, 0xc314, 0x1e97, 0x0736, 0x0716, 0x0715, 0x06f4, 0x06f4, 0x06f3, 0x06d3, 0x06b3, 0x06b2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05f4, 0x05d4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04f8, 0x04b9, 0x0499, 0x045a, 0x043b, 0x041b, 0x03fc, 0x03dd, 0x03bd, 0x039d, 0x037e, 0x035e, 0x033e, 0x033f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x021f, 0x01df, 0x019f, 0x017f, 0x013f, 0x00ff, 0x009f, 0x007f, 0x003f, 0x001f, 0x007f, 0x399b, 0xb993, 0x055f, 0x067f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x45db, 0xc132, 0xc932, 0xc912, 0xc132, 0xc912, 0xc912, 0xc911, 0xc912, 0x5111, 0x38f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ce, 0x10d3, 0x10f4, 0x18d0, 0x18ad, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x20cd, 0x20ae, 0x20ad, 0x20ae, 0x18ce, 0x20ae, 0x20ce, 0x20ce, 0x28ae, 0x20ce, 0x28ee, 0x5171, 0x69d2, 0x8232, 0xaaf4, 0xc334, 0xd375, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x757a, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07bd, 0x079b, 0x077a, 0x0779, 0x74d6, 0xd2d4, 0x9bf5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06f0, 0x06f0, 0x06d0, 0x06af, 0x06af, 0x066f, 0x0650, 0x0631, 0x0611, 0x05d2, 0x0594, 0x0554, 0x0515, 0x04f7, 0x04b8, 0x0478, 0x0459, 0x043a, 0x03fb, 0x03bc, 0x03bc, 0x039d, 0x037d, 0x035e, 0x033e, 0x031f, 0x031f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x027f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x013f, 0x011f, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x00df, 0xa175, 0x33bc, 0x05df, 0x06ff, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x92d5, 0xc911, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc112, 0xc912, 0xa8f1, 0x3110, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x390f, 0x4970, 0x59b0, 0x7a32, 0x9293, 0xaad3, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0x9cb8, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07dd, 0x07bc, 0x079b, 0x079a, 0x079a, 0x0779, 0x55b7, 0xd2b4, 0xd2b4, 0x4db5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074f, 0x074e, 0x074d, 0x074d, 0x074c, 0x072b, 0x072b, 0x072a, 0x070a, 0x06ea, 0x06ac, 0x064d, 0x05d0, 0x0573, 0x04f5, 0x04b6, 0x0478, 0x0438, 0x041a, 0x03fb, 0x03bc, 0x039c, 0x037c, 0x033d, 0x033d, 0x031e, 0x02fe, 0x02ff, 0x02df, 0x02bf, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x009f, 0x005f, 0x003f, 0x001f, 0x003f, 0x213d, 0x1b1e, 0x051f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f3d, 0xc912, 0xc912, 0xc112, 0xc112, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0x80f1, 0x30f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x392f, 0xd395, 0xc374, 0xa2d3, 0xaad3, 0x7a31, 0x7a31, 0x7a11, 0x7231, 0x5190, 0x496f, 0x496f, 0x4970, 0x496f, 0x494f, 0x412f, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x494f, 0x496f, 0x496f, 0x69f1, 0x7a31, 0x7a31, 0x9272, 0xa2d3, 0xaaf3, 0xc355, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd395, 0xac57, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x079a, 0x079a, 0x0799, 0x26b8, 0xcad4, 0xd2b4, 0xc314, 0x0f35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078f, 0x078e, 0x078e, 0x078d, 0x078c, 0x07aa, 0x07a9, 0x07a9, 0x07a8, 0x07c7, 0x07c5, 0x07c4, 0x07e4, 0x07a4, 0x0727, 0x068a, 0x05af, 0x0496, 0x0438, 0x03f9, 0x03ba, 0x039b, 0x035c, 0x035d, 0x031d, 0x031d, 0x02fe, 0x02df, 0x02bf, 0x02bf, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x005f, 0x001f, 0x001f, 0x007f, 0x023f, 0x041f, 0x05bf, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6498, 0xc911, 0xc912, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8d1, 0x50f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x0117, 0x10d2, 0x08f3, 0x10d3, 0x10d2, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc3d6, 0x8539, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07de, 0x07bd, 0x07bd, 0x07bc, 0x07bc, 0x07bb, 0x07ba, 0x07ba, 0x07b9, 0xd2b4, 0xd2b4, 0xd2b4, 0x6535, 0x07b5, 0x07b5, 0x07b4, 0x07b3, 0x07b2, 0x07b1, 0x07b0, 0x07af, 0x07ce, 0x07cd, 0x07cc, 0x07cb, 0x07ca, 0x07ca, 0x07c9, 0x07e8, 0x07e7, 0x07e6, 0x07e5, 0x07e5, 0x07e3, 0x07e3, 0x07e2, 0x07e1, 0x0726, 0x060c, 0x04b4, 0x03b9, 0x037b, 0x035c, 0x033d, 0x031d, 0x02de, 0x02df, 0x02be, 0x029f, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x019f, 0x019f, 0x015f, 0x015f, 0x013f, 0x00ff, 0x00df, 0x00bf, 0x007f, 0x007f, 0x003f, 0x001f, 0x001f, 0x011f, 0x02ff, 0x04df, 0x063f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xb972, 0xc8f2, 0xc8f2, 0xc0f1, 0xc8f2, 0xc0f2, 0xc0f1, 0xc8d1, 0xa0f1, 0x30f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x412f, 0x8a72, 0xc334, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xac57, 0x469c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x467c, 0x8519, 0x8519, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07de, 0x07de, 0x07de, 0x07dd, 0x07dc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x07da, 0x9bf5, 0xd2b4, 0xd2b4, 0xc2f4, 0x0f77, 0x07d6, 0x07d5, 0x07d4, 0x07d4, 0x07d3, 0x07d2, 0x07d1, 0x07d0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07ec, 0x07ea, 0x07e9, 0x07e9, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e4, 0x07e4, 0x07e3, 0x07e3, 0x07e2, 0x0785, 0x060c, 0x04d3, 0x035b, 0x031c, 0x02de, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x001f, 0x001f, 0x003f, 0x01df, 0x03bf, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d7a, 0xc111, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0d1, 0xc8d1, 0x68f1, 0x30f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x414f, 0x61d1, 0x8251, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xbc16, 0x8539, 0x469c, 0x17bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8518, 0xd355, 0xd355, 0xd335, 0xd335, 0x84f8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07fe, 0x07dd, 0x07dd, 0x07bc, 0x07dc, 0x07db, 0x07db, 0x07da, 0x8c56, 0xcab4, 0xcab4, 0xd294, 0x4df7, 0x07d7, 0x07d7, 0x07d6, 0x07f5, 0x07d5, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07e9, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e6, 0x07e6, 0x07e5, 0x07e5, 0x07e5, 0x07e5, 0x07e4, 0x07a6, 0x060e, 0x03f8, 0x02de, 0x02be, 0x029f, 0x027f, 0x025f, 0x023f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00df, 0x00bf, 0x009f, 0x007f, 0x005f, 0x003f, 0x001f, 0x001f, 0x00bf, 0x029f, 0x049f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1d3, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0f1, 0xc8d1, 0xb8d1, 0x40f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x08f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0x496f, 0x5990, 0x7a12, 0x7a32, 0x9272, 0xa2d3, 0xa2d3, 0xc375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xac77, 0x757a, 0x36fd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4e3c, 0xd355, 0xd335, 0xd355, 0xd335, 0xd335, 0xd334, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07dd, 0x07dd, 0x07dc, 0x07fc, 0x07dc, 0x07db, 0x6d38, 0xcab4, 0xd294, 0xd294, 0xab95, 0x07d8, 0x07d8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ec, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07e9, 0x07e9, 0x07e8, 0x07e8, 0x07e8, 0x07e8, 0x07e7, 0x07e7, 0x07e8, 0x07c8, 0x06eb, 0x0514, 0x033c, 0x027f, 0x025f, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x019f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0x015f, 0x037f, 0x057f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5a, 0xc8f1, 0xc8d1, 0xc0f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x78d1, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x496f, 0x496f, 0x4970, 0x7a12, 0x7a31, 0x8252, 0xaad3, 0xa2d3, 0xbb34, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcbd6, 0x94f8, 0x565b, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb3f6, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd334, 0x1f7e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07de, 0x07dd, 0x07fd, 0x07fd, 0x07fd, 0x07dd, 0x07dc, 0x6d38, 0xcab4, 0xd294, 0xca94, 0xd294, 0x1f39, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f5, 0x07f4, 0x07f3, 0x07f2, 0x07f2, 0x07f1, 0x07f0, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ed, 0x07ed, 0x07ec, 0x07ed, 0x07ec, 0x07eb, 0x07ec, 0x07eb, 0x07eb, 0x07ea, 0x07ea, 0x07ea, 0x07ca, 0x07ab, 0x076c, 0x070d, 0x05b2, 0x039b, 0x023f, 0x021f, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60d9, 0x0a3f, 0x047f, 0x063f, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9d3, 0xc0d1, 0xc8d1, 0xc0f1, 0xc8b1, 0xc0d1, 0xc8b1, 0xc0b1, 0xb8b1, 0x48f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x4970, 0x4970, 0x5990, 0x7a31, 0x7231, 0x7a31, 0x7a31, 0x9ab3, 0xaad4, 0xa2d4, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0x94f8, 0x565c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd334, 0xd335, 0xd335, 0xd335, 0xd335, 0xd314, 0xd315, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x6d58, 0xd294, 0xd293, 0xca94, 0xd274, 0x4df8, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f4, 0x07f3, 0x07f3, 0x07f2, 0x07f1, 0x07f1, 0x07f0, 0x07f0, 0x07f0, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ee, 0x07ed, 0x07cd, 0x078e, 0x076e, 0x0710, 0x06b1, 0x0574, 0x037b, 0x01ff, 0x01df, 0x01bf, 0x019f, 0x017f, 0x017f, 0x013f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x001f, 0x88d6, 0x6159, 0x031f, 0x053f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4d5b, 0xc0d1, 0xc8d1, 0xc8d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b1, 0x90d1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20cf, 0x20ce, 0x20ae, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x10d1, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x10cf, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ce, 0x18ad, 0x20ae, 0x20ad, 0x20ce, 0x20ce, 0x290f, 0x5170, 0x5170, 0x69f1, 0x7a32, 0x8232, 0xaaf3, 0xaaf4, 0xcb75, 0xd395, 0xd396, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xc3b6, 0x8539, 0x1f7f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xd335, 0xd335, 0xd335, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0x659a, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x6d39, 0xd294, 0xca94, 0xd274, 0xca74, 0x7c96, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07f5, 0x07f4, 0x07f4, 0x07f3, 0x07f3, 0x07f3, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f2, 0x07f1, 0x07f1, 0x07f1, 0x07f1, 0x07f0, 0x07f1, 0x07d0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02dd, 0x01bf, 0x019f, 0x017f, 0x015f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x00bf, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x001f, 0x60b8, 0xb8f3, 0x09bf, 0x041f, 0x061f, 0x073f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb1b3, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x48f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x00f9, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ae, 0x00f7, 0x011a, 0x011a, 0x011a, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x5172, 0x61b2, 0x8a54, 0x9a94, 0xb335, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0x9c97, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xac17, 0xd335, 0xd314, 0xd335, 0xd314, 0xd315, 0xd315, 0xd2f4, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6d59, 0xd274, 0xca94, 0xd274, 0xca74, 0xb334, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f6, 0x07f6, 0x07f6, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f5, 0x07f4, 0x07f4, 0x07f4, 0x07d3, 0x07b3, 0x0793, 0x0753, 0x0714, 0x06b5, 0x5516, 0x0538, 0x037c, 0x01ff, 0x017f, 0x015f, 0x013f, 0x011f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x6099, 0xc911, 0x491a, 0x02df, 0x051f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6459, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x90d1, 0x30f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69d3, 0x9274, 0xb2f5, 0xd395, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xa478, 0x36dd, 0x07ff, 0x07ff, 0x563c, 0xd335, 0xd334, 0xd315, 0xd315, 0xd2f4, 0xcb15, 0xbb96, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8498, 0xca94, 0xca94, 0xd274, 0xca74, 0xca74, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f6, 0x07f6, 0x07d6, 0x07b6, 0x0796, 0x0756, 0x0716, 0xa456, 0xbbd6, 0x3479, 0x02fd, 0x023f, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x003f, 0x003f, 0x003f, 0x78b7, 0xc111, 0xa114, 0x01ff, 0x041f, 0x05ff, 0x075f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xc0b1, 0xc0d2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x48f1, 0x30f0, 0x30ef, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x10cf, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x20cd, 0x20cd, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71f4, 0x9a75, 0xb2f5, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0x9c78, 0x36dd, 0x07ff, 0x9c57, 0xd335, 0xd315, 0xd334, 0xd314, 0xc355, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bf7, 0xca94, 0xd274, 0xca73, 0xca74, 0xd253, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07f9, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07fa, 0x07f9, 0x07f9, 0x07f9, 0x07f8, 0x07d8, 0x07b8, 0x0797, 0x0758, 0x0ef8, 0xbbf6, 0xd395, 0x6b99, 0x025f, 0x021f, 0x01bf, 0x013f, 0x011f, 0x00ff, 0x00df, 0x00bf, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x98d5, 0xc8f2, 0xc911, 0x195e, 0x033f, 0x053f, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b76, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x88d1, 0x30f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x10d2, 0x00f6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08d5, 0x10d0, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00fa, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8a16, 0xaad5, 0xcb55, 0xd375, 0xd355, 0xd354, 0xd355, 0xd335, 0xd335, 0xd335, 0xd335, 0xcb35, 0x84f9, 0x0fbf, 0x5ddb, 0xa457, 0x9c58, 0x84d8, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9bd6, 0xca74, 0xca74, 0xca74, 0xca74, 0xca74, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fb, 0x07fb, 0x07fb, 0x07fb, 0x07da, 0x07da, 0x07ba, 0x079a, 0x0779, 0x2e99, 0xc3d6, 0xd395, 0x8339, 0x0a3e, 0x01df, 0x019f, 0x015f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0x90d5, 0xc912, 0xc0f1, 0x7117, 0x027f, 0x049f, 0x065f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x269d, 0xc891, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8b1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x00f9, 0x10d0, 0x18ad, 0x20ad, 0x20ad, 0x10d1, 0x00f8, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18af, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0139, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ce, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28ef, 0x28cf, 0x28ef, 0x28d0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8b14, 0x4ad3, 0x7a94, 0xab14, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd314, 0xd335, 0xc355, 0x467c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc2d4, 0xca74, 0xca74, 0xd274, 0xca74, 0xd253, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07fc, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07fd, 0x07fd, 0x07fc, 0x07fc, 0x07db, 0x07bb, 0x07bb, 0x077b, 0x2eba, 0xc3d6, 0xd395, 0xb337, 0x09df, 0x01bf, 0x017f, 0x013f, 0x011f, 0x00df, 0x009f, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x003f, 0x7896, 0xc0f1, 0xc8f1, 0xa8f3, 0x01df, 0x03df, 0x05bf, 0x071f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0x68f1, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0139, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x20ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x0119, 0x08f6, 0x10d2, 0x10d0, 0x18cf, 0x18d0, 0x10d3, 0x0118, 0x0119, 0x011a, 0x00f9, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ef, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30ef, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9a75, 0xcb55, 0xcb75, 0x5bb4, 0x3b34, 0x42b3, 0x4a33, 0x6253, 0x9ab4, 0xd335, 0xd335, 0xd315, 0xd334, 0xd314, 0xd315, 0xd314, 0xd314, 0x5ddb, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f5e, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xca53, 0x369d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07fe, 0x07fd, 0x07dd, 0x07dd, 0x07bd, 0x079c, 0x561a, 0xd395, 0xd395, 0xab37, 0x099f, 0x015f, 0x013f, 0x011f, 0x00ff, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x003f, 0x003f, 0x305c, 0xc0f1, 0xc8f1, 0xc8d1, 0x215d, 0x033f, 0x051f, 0x06df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5cd9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x98d1, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0117, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x08f3, 0x0118, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x011a, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18cd, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xcb55, 0xd375, 0xbb95, 0x5474, 0x3c34, 0x3bb4, 0x4333, 0x42b3, 0x4a13, 0x49f3, 0x5a32, 0x9ab4, 0xd334, 0xd335, 0xd314, 0xd314, 0xd315, 0xd314, 0xd2f4, 0x84d8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x4ddb, 0xd274, 0xca74, 0xca73, 0xd274, 0xca54, 0xca54, 0x369c, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07fe, 0x07dd, 0x07de, 0x079d, 0x6d99, 0xd395, 0xd395, 0xab17, 0x097f, 0x011f, 0x011f, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x003f, 0x003f, 0x003f, 0xc8f1, 0xc8f1, 0xc8d1, 0x5119, 0x02df, 0x04ff, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x4910, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18d0, 0x00f8, 0x0119, 0x00f8, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ae, 0x10d2, 0x08f3, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xcb55, 0xd375, 0xd375, 0xb3d5, 0x3d55, 0x3515, 0x3495, 0x3c14, 0x3b94, 0x3b13, 0x4293, 0x4212, 0x49f3, 0x49f3, 0x5a13, 0x9ab4, 0xd314, 0xd315, 0xcb15, 0xd2f4, 0xd2f5, 0xd2f4, 0x7539, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8c37, 0xca74, 0xd273, 0xd253, 0xca54, 0xca53, 0xd253, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07df, 0x07df, 0x94d8, 0xd396, 0xd395, 0x8299, 0x00ff, 0x00ff, 0x00ff, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0xc8d1, 0xc0f1, 0xc0d1, 0xa0d4, 0x027f, 0x04bf, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8315, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x70f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0117, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x10d3, 0x08f3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x0117, 0x0119, 0x0119, 0x10cf, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x011a, 0x0118, 0x10d0, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0117, 0x18ae, 0x20cd, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x28cf, 0x28cf, 0x28cf, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xb2f4, 0xd375, 0xd375, 0xd375, 0x9435, 0x3d55, 0x2d55, 0x2d75, 0x3515, 0x3c94, 0x3414, 0x3b94, 0x4313, 0x4293, 0x4a13, 0x41f3, 0x49f2, 0x4a13, 0x5a33, 0xa2b4, 0xd314, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2f4, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x179f, 0xd274, 0xca53, 0xca73, 0xca53, 0xca53, 0xca53, 0xd253, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xbc16, 0xd395, 0xd395, 0x725a, 0x00bf, 0x00bf, 0x00bf, 0x009f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x90b5, 0xc8d1, 0xc8d1, 0xc0d1, 0x123e, 0x047f, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x90d1, 0x38f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x08f6, 0x011a, 0x0119, 0x0118, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x00f7, 0x011a, 0x00f8, 0x10d0, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x00f9, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x30f0, 0x38f0, 0x30f0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xcb55, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3bf4, 0x3b73, 0x42f4, 0x4273, 0x4a13, 0x4213, 0x49f2, 0x49f3, 0x49f3, 0x6a33, 0xbad4, 0xd2f5, 0xd2f4, 0xd2d4, 0xc335, 0x177e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xca54, 0xd273, 0xca54, 0xca53, 0xca53, 0xca53, 0x9bb6, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x077e, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x36dd, 0xd395, 0xd395, 0xd395, 0x51bc, 0x009f, 0x009f, 0x007f, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x7077, 0xc0d2, 0xc8d1, 0xc0d1, 0x49fa, 0x049f, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f1e, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x011a, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f8, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x08f5, 0x20ad, 0x18cd, 0x18ad, 0x18af, 0x0119, 0x0119, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ce, 0x08f7, 0x0119, 0x00f8, 0x18b0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x4952, 0xaab4, 0xd375, 0xd375, 0xd375, 0xd355, 0x9435, 0x3575, 0x3575, 0x2d75, 0x2d75, 0x2d75, 0x3555, 0x54d5, 0x6475, 0x83b5, 0x8b74, 0x9b34, 0xab14, 0xaad4, 0xb2d4, 0xaad4, 0xaab4, 0xaab4, 0xb2b4, 0x6b15, 0x8a94, 0xc2d4, 0xd2f4, 0xd2d4, 0x84b8, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb315, 0xd274, 0xca53, 0xca54, 0xca53, 0xca53, 0xd253, 0x653a, 0x07ff, 0x07ff, 0x07df, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x073f, 0x071f, 0x071e, 0x071e, 0x073e, 0x079f, 0x07df, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7d7a, 0xd395, 0xd395, 0xc375, 0x28fe, 0x007f, 0x007f, 0x005f, 0x005f, 0x003f, 0x005f, 0x003f, 0x003f, 0x183e, 0xc0d1, 0xc0d1, 0xc0d2, 0x7996, 0x04bf, 0x067f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa214, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0x58f1, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18af, 0x0119, 0x0119, 0x08f6, 0x20ae, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0118, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0139, 0x0119, 0x10f3, 0x18d0, 0x08f5, 0x0119, 0x0119, 0x18d0, 0x18ae, 0x18ae, 0x18cd, 0x0119, 0x011a, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x011a, 0x00f8, 0x18d0, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18cd, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f9, 0x0119, 0x0117, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x5972, 0xcb55, 0xd375, 0xd375, 0xd375, 0xd375, 0xabd5, 0x4515, 0x54f5, 0x7c75, 0x8c35, 0xabd5, 0xcb55, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0xd315, 0xd314, 0xd314, 0xc355, 0x9c37, 0x659a, 0x467c, 0x0fbf, 0x07ff, 0x07ff, 0x269d, 0x9c17, 0xd2d4, 0x9c17, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x5d9a, 0xd274, 0xca53, 0xca54, 0xca53, 0xca33, 0xca33, 0xca33, 0x26dd, 0x07ff, 0x07df, 0x07df, 0x07df, 0x07df, 0x07bf, 0x079f, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071e, 0x071e, 0x06fe, 0x06fe, 0x06ff, 0x06de, 0x06de, 0x06be, 0x06be, 0x06de, 0x073e, 0x079f, 0x07bf, 0x07bf, 0x079f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x077f, 0x079f, 0x079f, 0x079f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0xc3f6, 0xd395, 0xd395, 0xaaf7, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x001f, 0x001f, 0xa094, 0xc0d1, 0xc8b1, 0xa8f3, 0x04bf, 0x069f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x73d8, 0xb8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cf, 0x18ae, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x00f6, 0x0119, 0x08f3, 0x18ad, 0x20ad, 0x20ad, 0x00f6, 0x00f9, 0x08d4, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x10d3, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18cd, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18cd, 0x10cf, 0x0119, 0x00f9, 0x0117, 0x18ce, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x3111, 0x71f2, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd355, 0xd335, 0xd335, 0xcb14, 0xd334, 0xd334, 0xac16, 0x753a, 0x467d, 0x1f5e, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x369c, 0x4e1b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26fd, 0xc2b4, 0xca53, 0xca53, 0xca53, 0xd253, 0xca33, 0xca33, 0xa356, 0x07ff, 0x07ff, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x077f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06fe, 0x06fe, 0x06de, 0x06be, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x06be, 0x073e, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x075f, 0x077f, 0x077f, 0x077f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07df, 0x6dda, 0xd395, 0xd376, 0xd375, 0x79fa, 0x003f, 0x003f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x8896, 0xc0b1, 0xc0b1, 0xc8b1, 0x0c9f, 0x069f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0x98d1, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x08f6, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x011a, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x08f3, 0x20ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f3, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x9a93, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd355, 0xd355, 0xd335, 0xd335, 0xc375, 0x84f9, 0x4e3c, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9f, 0xab75, 0xca54, 0xd253, 0xca53, 0xca33, 0xca33, 0xd233, 0xca33, 0x4dbb, 0x07df, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x075f, 0x073f, 0x071f, 0x071f, 0x06ff, 0x06de, 0x06de, 0x06de, 0x06be, 0x06be, 0x069e, 0x067e, 0x067e, 0x067e, 0x065e, 0x063e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05fd, 0x067d, 0x06de, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x071e, 0x073f, 0x073f, 0x073f, 0x073e, 0x075f, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x0fbf, 0xc3d6, 0xd375, 0xd375, 0xd355, 0x30fd, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x6058, 0xc0b1, 0xc0b1, 0xc0b1, 0x33fc, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0f9e, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0b1, 0xb8d1, 0xb8d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18cd, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f6, 0x0119, 0x08d5, 0x18cd, 0x18ae, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x10d3, 0x10d0, 0x08f4, 0x0119, 0x0119, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30f0, 0x3910, 0xaaf4, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xb3d6, 0x7539, 0x271d, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2efd, 0xb315, 0xca53, 0xca54, 0xca33, 0xca53, 0xca34, 0xca34, 0xca33, 0xa335, 0x07bf, 0x07bf, 0x079f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06de, 0x06bf, 0x06be, 0x069e, 0x069e, 0x069e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05bd, 0x05be, 0x059d, 0x055e, 0x055e, 0x05be, 0x05fe, 0x061d, 0x067e, 0x06be, 0x06fe, 0x06fe, 0x071f, 0x071e, 0x073f, 0x073f, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x8539, 0xd375, 0xd355, 0xd355, 0xbaf6, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x403b, 0xc8b1, 0xc0b1, 0xc0b1, 0x6318, 0x06bf, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa9b3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x4910, 0x3910, 0x30f0, 0x30f0, 0x28cf, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x10d3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f3, 0x011a, 0x0118, 0x18ad, 0x18cd, 0x18ad, 0x18ce, 0x00f8, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x08f5, 0x18ad, 0x20cd, 0x18ad, 0x10d0, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x0117, 0x011a, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x30cf, 0x3910, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd354, 0xd355, 0xd355, 0xcb96, 0x8518, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbe, 0x653a, 0xca54, 0xca53, 0xd253, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x2e9d, 0x077f, 0x077f, 0x075f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06fe, 0x06df, 0x06de, 0x06bf, 0x06be, 0x06bf, 0x069e, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05be, 0x05be, 0x059e, 0x057e, 0x053e, 0x051e, 0x04fe, 0x04be, 0x049e, 0x041e, 0x03dd, 0x04de, 0x065e, 0x06be, 0x06de, 0x06de, 0x06fe, 0x071f, 0x073e, 0x077f, 0x079f, 0x079f, 0x07bf, 0x07df, 0x07df, 0x07ff, 0x36dd, 0xd355, 0xd355, 0xd355, 0xd335, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0xb8b2, 0xc091, 0xc0b1, 0x7a96, 0x06bf, 0x079f, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x82f5, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0x60f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x20cd, 0x10d2, 0x08d4, 0x08f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x011a, 0x0119, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18af, 0x08f6, 0x0119, 0x0119, 0x00f9, 0x08f4, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x00f8, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x08f7, 0x18ce, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20cf, 0x28cf, 0x28ef, 0x3910, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd355, 0xbbd6, 0x5dfb, 0x0fbf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x5d9a, 0xb315, 0xd254, 0xca53, 0xd254, 0xca53, 0xca53, 0xca33, 0xd233, 0xca33, 0xca33, 0x64d9, 0x077f, 0x073f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06be, 0x069f, 0x069f, 0x067e, 0x065e, 0x065e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x055e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043d, 0x03de, 0x03be, 0x039e, 0x037e, 0x03fe, 0x05fe, 0x069e, 0x069e, 0x06be, 0x06fe, 0x071e, 0x073f, 0x075f, 0x079f, 0x079f, 0x07df, 0x07df, 0x07df, 0x07ff, 0xbbf6, 0xd355, 0xd335, 0xd335, 0xc2f5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x9095, 0xc8b1, 0xc8b1, 0x91f5, 0x067f, 0x06ff, 0x073f, 0x075f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x80f2, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20cd, 0x20ae, 0x18ad, 0x18ae, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ae, 0x0117, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x00f6, 0x011a, 0x0117, 0x18ce, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18d0, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ce, 0x08f7, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x3110, 0xb314, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0x9c77, 0x563b, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x1f7e, 0x65db, 0x7cf9, 0x9c57, 0x9c57, 0x9c57, 0x9c57, 0x9c37, 0x9c37, 0x9c37, 0x9c37, 0x7539, 0x6d7a, 0x6579, 0x5dbb, 0x36bd, 0x36bd, 0x36bc, 0x2efd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x0fbf, 0x36bd, 0x5d9a, 0x8c37, 0xd274, 0xd273, 0xd254, 0xca53, 0xd254, 0xd253, 0xca33, 0xd233, 0xca34, 0xca13, 0xca33, 0x8418, 0x075f, 0x073f, 0x071f, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x069e, 0x069f, 0x067e, 0x067e, 0x065e, 0x065e, 0x063e, 0x061e, 0x061e, 0x05fe, 0x05de, 0x05de, 0x05be, 0x05be, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04be, 0x045e, 0x03fe, 0x03be, 0x039e, 0x037e, 0x037e, 0x035e, 0x033e, 0x035e, 0x061d, 0x067e, 0x067e, 0x069e, 0x06be, 0x06fe, 0x073f, 0x075f, 0x077f, 0x079f, 0x07df, 0x07df, 0x07ff, 0x7d59, 0xd335, 0xd335, 0xd335, 0xd314, 0x699a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x60d8, 0xc0b1, 0xc0b1, 0xb8f2, 0x05df, 0x061f, 0x065f, 0x06df, 0x073f, 0x077f, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0x90d1, 0x3911, 0x30f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x00f8, 0x011a, 0x00f8, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x0119, 0x0119, 0x011a, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x28ce, 0x28ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xd355, 0x9c77, 0x3edd, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x659a, 0xd315, 0xd314, 0xd315, 0xd314, 0xd314, 0xd314, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2f4, 0xcad4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca74, 0xca74, 0xca73, 0xca73, 0xd274, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xab15, 0x0edf, 0x06ff, 0x06ff, 0x06df, 0x06df, 0x06bf, 0x06bf, 0x06df, 0x06bf, 0x069f, 0x069f, 0x067e, 0x067f, 0x067e, 0x065e, 0x063f, 0x061e, 0x061e, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x059e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x04de, 0x049e, 0x043e, 0x03be, 0x039e, 0x039e, 0x035e, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x037e, 0x05fe, 0x065e, 0x067e, 0x069e, 0x06de, 0x06fe, 0x075f, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x271d, 0xd335, 0xd314, 0xd315, 0xd315, 0xc2d5, 0x083f, 0x001f, 0x001f, 0x001f, 0x001f, 0x009f, 0x60d8, 0xc0b1, 0xc0b2, 0xc0b1, 0x04bf, 0x053f, 0x05bf, 0x067f, 0x06df, 0x075f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0x98d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ce, 0x20ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x011a, 0x08f7, 0x10d0, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x0118, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x30ef, 0xb314, 0xd375, 0xd375, 0xd375, 0xd375, 0xd355, 0xd375, 0xac37, 0x36dd, 0x07ff, 0x07ff, 0x07ff, 0x0ebd, 0x1d7b, 0x1c99, 0x32f5, 0x3a75, 0x6193, 0x69b3, 0x79f4, 0x8a14, 0xb294, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xd274, 0xca53, 0xca54, 0xca54, 0xca53, 0xd253, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x8b97, 0x35fd, 0x5d7b, 0x6d3a, 0x6d3a, 0x5d5b, 0x35fd, 0x06bf, 0x0e7e, 0x457c, 0x6c99, 0x6479, 0x6459, 0x4cba, 0x0e1e, 0x063e, 0x063e, 0x061e, 0x05fe, 0x05fe, 0x05fe, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x051e, 0x051e, 0x04fe, 0x04de, 0x047e, 0x03de, 0x03be, 0x037e, 0x037f, 0x035e, 0x033e, 0x033e, 0x031e, 0x02fe, 0x02fe, 0x02fe, 0x02de, 0x03fe, 0x05be, 0x063e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073e, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0xbbb6, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0x697a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x48fa, 0xc0b1, 0xc0b1, 0xc0b1, 0x331c, 0x047f, 0x053f, 0x05ff, 0x069f, 0x073f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9a14, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x20cf, 0x20ae, 0x18cf, 0x08f6, 0x011a, 0x0119, 0x0119, 0x08f4, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0119, 0x0119, 0x0119, 0x08f6, 0x10d2, 0x10d0, 0x18d0, 0x18d1, 0x10d2, 0x00f8, 0x0119, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x9273, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xc3b6, 0x5dfb, 0x07ff, 0x0e3b, 0x1c98, 0x2ad5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79d3, 0x9a54, 0xc294, 0xd2f4, 0xd2d5, 0xcad4, 0xd2d4, 0xd2b4, 0xcad4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xca73, 0xd253, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca33, 0xca33, 0xca33, 0x99d4, 0x6358, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd375, 0x06bf, 0x5cfa, 0xd2b4, 0xca94, 0xca33, 0xca13, 0xc9d3, 0xb9d3, 0x4c5a, 0x061e, 0x061e, 0x05de, 0x05de, 0x05be, 0x059e, 0x059e, 0x057e, 0x053e, 0x051e, 0x051d, 0x04de, 0x04be, 0x043e, 0x03be, 0x03be, 0x037f, 0x0b7e, 0x337c, 0x333c, 0x335c, 0x333c, 0x333c, 0x331c, 0x331c, 0x32fc, 0x32fc, 0x32dc, 0x2b7c, 0x05de, 0x061e, 0x065e, 0x069e, 0x06de, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07df, 0x84f9, 0xd314, 0xcb14, 0xcaf4, 0xd2d5, 0xb275, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x08df, 0xb8d2, 0xc0b1, 0xc0b1, 0x3a7b, 0x03ff, 0x04df, 0x05bf, 0x067f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7b77, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x38f1, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x20cf, 0x0918, 0x013a, 0x011a, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ae, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x08f6, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0139, 0x00f9, 0x10d2, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x7a32, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0x9c78, 0x261b, 0x1b96, 0x3171, 0x30f0, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81f3, 0xaa73, 0xcad4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca74, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xca53, 0xca53, 0xca53, 0xd233, 0xca33, 0xca33, 0xd233, 0xc234, 0x7994, 0x5975, 0xb315, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xc375, 0x067f, 0x067f, 0x6c79, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc912, 0x34bb, 0x05fe, 0x05de, 0x05be, 0x059e, 0x055e, 0x055e, 0x053e, 0x051e, 0x04fe, 0x249d, 0x347b, 0x6bfa, 0x7b99, 0x9b98, 0xab97, 0xdb95, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd396, 0xd395, 0xbbd6, 0x9c37, 0x8499, 0x6d1a, 0x363c, 0x1edd, 0x079f, 0x07bf, 0x07df, 0x4e1b, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0x40fc, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x78d7, 0xc0b1, 0xc0b1, 0x61d8, 0x03bf, 0x049f, 0x057f, 0x065f, 0x071f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x4111, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ae, 0x10f3, 0x013a, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011a, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x10d2, 0x08f3, 0x08f4, 0x10d1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x10f2, 0x00f7, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x10d0, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x5170, 0xd395, 0xd375, 0xd375, 0xd375, 0xd355, 0x6519, 0x22b3, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79b3, 0xa233, 0xd2b4, 0xcab4, 0xd294, 0xca94, 0xd294, 0xca94, 0xca74, 0xca94, 0xca74, 0xca74, 0xd274, 0xca54, 0xd274, 0xd253, 0xca54, 0xca54, 0xca33, 0xd233, 0xca34, 0xca33, 0xca33, 0xa1d3, 0x5954, 0x5954, 0x79f5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd335, 0x8c18, 0x067f, 0x065f, 0x063f, 0xa2d5, 0xc9d3, 0xc972, 0xc952, 0xc111, 0xc8d1, 0x8a55, 0x05de, 0x05be, 0x059e, 0x057e, 0x055e, 0x34dc, 0x6c5a, 0xa3f7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd335, 0xd335, 0xd335, 0xbbb6, 0x84d9, 0x4e1b, 0x465c, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0x81d8, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x6098, 0xc0b1, 0xc0d1, 0x59b8, 0x035f, 0x045f, 0x055f, 0x063f, 0x06ff, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x363c, 0xc0d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x58f1, 0x3911, 0x30f0, 0x3110, 0x30cf, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x08f6, 0x013a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x00f9, 0x08f8, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x00f8, 0x08f8, 0x0118, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00fa, 0x00f8, 0x08f7, 0x08f7, 0x18b0, 0x18ad, 0x18ae, 0x08f4, 0x0119, 0x08f8, 0x08f8, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x10d4, 0x10d0, 0x18ad, 0x20ad, 0x08f8, 0x10d3, 0x18ad, 0x18ad, 0x10f4, 0x10d1, 0x18ad, 0x18ad, 0x08f8, 0x00f7, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ae, 0x20ce, 0x20ae, 0x28ee, 0xcb55, 0xd375, 0xd375, 0xd375, 0xbb14, 0x34f9, 0x2930, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91f2, 0xc254, 0xca93, 0xca94, 0xca94, 0xca74, 0xca74, 0xd274, 0xca73, 0xd273, 0xca73, 0xd254, 0xca53, 0xca53, 0xca54, 0xca33, 0xca34, 0xa1f3, 0x6973, 0x4953, 0x5134, 0x5154, 0xaaf5, 0xd395, 0xd395, 0xd395, 0xd375, 0xd335, 0xd314, 0x5cda, 0x065f, 0x063f, 0x063f, 0xb254, 0xc972, 0xc952, 0xc112, 0xc8d1, 0xc0b1, 0xc0b1, 0x05be, 0x059e, 0x2d1c, 0x9438, 0xcbb6, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xca94, 0x087f, 0x003f, 0x001f, 0x001f, 0x001f, 0x385b, 0xc0b1, 0xc0b1, 0x9135, 0x031f, 0x043f, 0x053f, 0x063f, 0x071f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb8d1, 0x5911, 0x3911, 0x38f0, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x0917, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x011a, 0x08f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ce, 0x0118, 0x0119, 0x011a, 0x00f7, 0x08f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x20ad, 0x10d1, 0x10d0, 0x18ad, 0x08d5, 0x10d1, 0x18ad, 0x20ae, 0x00f7, 0x18ad, 0x18ae, 0x18ad, 0x08f7, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x18ae, 0x18ad, 0x18ae, 0x0118, 0x18ae, 0x18ad, 0x08f4, 0x18d0, 0x18ad, 0x18ad, 0x10d1, 0x10d5, 0x18ae, 0x18ad, 0x08f5, 0x10d1, 0x20ad, 0x18ad, 0x00f8, 0x08f7, 0x18af, 0x18ad, 0x08d4, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x20ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0118, 0x011a, 0x00f9, 0x0119, 0x00f9, 0x10d2, 0x20ad, 0x18cd, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x20ce, 0x8252, 0xd375, 0xd375, 0xd375, 0x9a93, 0x30ef, 0x20cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81d2, 0xaa13, 0xba33, 0xca54, 0xca74, 0xca53, 0xca54, 0xca53, 0xca53, 0xb213, 0xa1f3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xd395, 0xd395, 0xd396, 0xd375, 0xd334, 0xd2f5, 0xd2b4, 0x2d9d, 0x063f, 0x063f, 0x061f, 0xc993, 0xc952, 0xc911, 0xc8f1, 0xc0b1, 0xc0b1, 0xb8d1, 0x059e, 0x057e, 0xabf7, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd315, 0xd335, 0xcb15, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0x411c, 0x003f, 0x003f, 0x001f, 0x001f, 0x203c, 0xc0b1, 0xc0b1, 0x9135, 0x02ff, 0x041f, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xa1b3, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x68f1, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28cf, 0x20ce, 0x10f3, 0x0119, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x00f9, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x10f4, 0x08f7, 0x18ad, 0x18ae, 0x18ad, 0x08f8, 0x20ae, 0x18ad, 0x18ad, 0x10d1, 0x10f4, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x18ad, 0x18ad, 0x10d1, 0x08f6, 0x18ad, 0x20ad, 0x08f4, 0x10d3, 0x18d1, 0x18d1, 0x08f5, 0x18d2, 0x18ad, 0x20ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x08f7, 0x18af, 0x08f7, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x208e, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x10d2, 0x00f9, 0x0119, 0x0119, 0x011a, 0x011a, 0x10d2, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x20ce, 0x412f, 0xd375, 0xd375, 0xd375, 0x71d1, 0x20ce, 0x28cf, 0x20cf, 0x28ce, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3110, 0x3110, 0x38f0, 0x30f0, 0x3111, 0x3111, 0x38f1, 0x38f1, 0x38f0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8a34, 0xd395, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xb2f6, 0x065f, 0x061f, 0x061f, 0x34dc, 0xc952, 0xc912, 0xc8d2, 0xc0b1, 0xc0d1, 0xb8d1, 0x89b4, 0x2bba, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71d4, 0x69f4, 0x71d3, 0x69d4, 0x71d3, 0x7a14, 0x8a75, 0x9274, 0x9254, 0x9254, 0x9a95, 0xb315, 0xbb14, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xcb14, 0xd2f4, 0xd2f4, 0xd2d4, 0xcad4, 0xcab4, 0xd2b4, 0xcab4, 0xca94, 0xca94, 0x81b8, 0x005f, 0x005f, 0x003f, 0x001f, 0x001f, 0xa8b3, 0xc0b1, 0xb0d2, 0x02df, 0x03ff, 0x051f, 0x061f, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f2, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20cf, 0x0918, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ad, 0x10d0, 0x00fa, 0x0119, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f7, 0x18d1, 0x18ad, 0x20ad, 0x08f8, 0x18ad, 0x18ad, 0x18ad, 0x18d1, 0x08d4, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ae, 0x00fa, 0x08f8, 0x00f7, 0x08f6, 0x18ae, 0x18ad, 0x18ad, 0x08f4, 0x08f6, 0x08d4, 0x08f6, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ae, 0x18ae, 0x08f8, 0x18ad, 0x08f3, 0x10d3, 0x10d5, 0x10d0, 0x18ad, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x20ae, 0x20cd, 0x20ae, 0x20cd, 0x9272, 0xd375, 0xc334, 0x61d1, 0x20cf, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x30f0, 0x3110, 0x3110, 0x30f0, 0x3110, 0x38f0, 0x30f0, 0x38f0, 0x3111, 0x38f0, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xb2f5, 0xd395, 0xd375, 0xd355, 0xd2f4, 0xd2b4, 0xd274, 0x83b8, 0x063f, 0x061f, 0x061e, 0x6398, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61b3, 0x7a34, 0x9a95, 0xb2f5, 0xd375, 0xd375, 0xd355, 0xd355, 0xd355, 0xd335, 0xd335, 0xd314, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xd294, 0xd294, 0xd274, 0xca74, 0xc254, 0x007f, 0x005f, 0x005f, 0x003f, 0x001f, 0x5878, 0xb8d1, 0xc0b1, 0x02bf, 0x03bf, 0x04ff, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6478, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20cf, 0x0917, 0x011a, 0x011a, 0x0119, 0x08f4, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x10d1, 0x18cf, 0x18ad, 0x10d1, 0x10f4, 0x18ad, 0x18ad, 0x08f7, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f8, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x18d1, 0x18ad, 0x18ad, 0x08f6, 0x18cf, 0x18ae, 0x20ae, 0x10d4, 0x18d1, 0x18ad, 0x20ae, 0x00f8, 0x18ad, 0x18ad, 0x08f7, 0x08f6, 0x18b1, 0x18ae, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20cd, 0x18ce, 0x20ae, 0x390f, 0xd375, 0xcb35, 0x414f, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30ef, 0x30f0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x28f0, 0x30f0, 0x30ef, 0x3110, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f1, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3910, 0x3911, 0x38f1, 0x3911, 0x3912, 0x4952, 0xd395, 0xd375, 0xd335, 0xd2f4, 0xd2b4, 0xd274, 0xca33, 0x4c9a, 0x05ff, 0x061f, 0x05ff, 0xa1f4, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa0f1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xa274, 0xc315, 0xd335, 0xd314, 0xd315, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xcab4, 0xca94, 0xca74, 0xca74, 0xca74, 0xca54, 0x20fd, 0x009f, 0x007f, 0x005f, 0x003f, 0x105d, 0xc0b1, 0xc0d1, 0x029f, 0x03bf, 0x04df, 0x05ff, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x54d9, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20cf, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x00f7, 0x00f9, 0x0117, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x011a, 0x0119, 0x08d4, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x0117, 0x10f4, 0x00f8, 0x18af, 0x18ad, 0x18ad, 0x08f7, 0x08f4, 0x10d5, 0x00f7, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08f8, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18cd, 0x10d1, 0x10d3, 0x18ad, 0x18ad, 0x08f4, 0x10d1, 0x18ad, 0x18ad, 0x08f8, 0x18ae, 0x18ad, 0x18af, 0x00fa, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x10d2, 0x011a, 0x0119, 0x00fa, 0x0119, 0x011a, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ae, 0x61d0, 0xbb14, 0x412f, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x28ce, 0x20ce, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28cf, 0x28f0, 0x30d0, 0x28ef, 0x28cf, 0x30cf, 0x30f0, 0x30d0, 0x30d0, 0x28f0, 0x30f0, 0x30f0, 0x30f0, 0x30d0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x61b2, 0xd375, 0xd335, 0xd2f4, 0xcad4, 0xca74, 0xd233, 0xca13, 0x1d9d, 0x05ff, 0x05ff, 0x1d3d, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8a14, 0xaa74, 0xcaf4, 0xd2f5, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xcab4, 0xd2b4, 0xd294, 0xca94, 0xca73, 0xd274, 0xd253, 0xd254, 0x597a, 0x00bf, 0x00bf, 0x009f, 0x009f, 0x005f, 0xa8b3, 0xc0b1, 0x31fc, 0x039f, 0x04df, 0x05df, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x00f9, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18b1, 0x18ce, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x10d0, 0x10d1, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x10d0, 0x18ae, 0x18ad, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x188d, 0x18ad, 0x18ae, 0x10d0, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10d2, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18af, 0x18af, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ae, 0x390f, 0x28ce, 0x20ae, 0x20ce, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28ef, 0x28ef, 0x28cf, 0x28ef, 0x28ef, 0x30ef, 0x28ef, 0x28ef, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x30f0, 0x3911, 0x71f2, 0xd335, 0xd2f4, 0xd2b4, 0xca74, 0xd233, 0xca13, 0xa295, 0x05ff, 0x05ff, 0x05ff, 0x5399, 0xc0d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9a34, 0xc2b4, 0xd2b5, 0xd2b3, 0xcab4, 0xd294, 0xd294, 0xca93, 0xd274, 0xd274, 0xca53, 0xca54, 0xca53, 0x81d8, 0x00df, 0x00df, 0x00df, 0x00bf, 0x00bf, 0x68b7, 0xb8d1, 0x31dc, 0x033f, 0x049f, 0x05df, 0x06ff, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x26bd, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d2, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f1, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x08d3, 0x08f3, 0x10d2, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f7, 0x011a, 0x0119, 0x0118, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18b0, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x011a, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x20cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28cf, 0x28ef, 0x28f0, 0x28f0, 0x30f0, 0x30f0, 0x38f0, 0x8213, 0xd2f5, 0xcad4, 0xd274, 0xca53, 0xc9f3, 0xc9d2, 0x7398, 0x05ff, 0x05ff, 0x05df, 0xa953, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x98f2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38f0, 0x38f0, 0x38f0, 0x38f0, 0x3911, 0x38f0, 0x38f0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xca94, 0xd294, 0xca94, 0xd274, 0xca74, 0xd274, 0xca53, 0xca54, 0xca53, 0xca34, 0x99f6, 0x011f, 0x011f, 0x00ff, 0x00ff, 0x00ff, 0x38db, 0xc0b1, 0x28fc, 0x02df, 0x047f, 0x059f, 0x06df, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x38f0, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x011a, 0x011a, 0x00f9, 0x011a, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x0117, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x00f9, 0x0119, 0x00f9, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x310e, 0x7a32, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd335, 0xd2b4, 0xca94, 0xca33, 0xd1f3, 0xc9d3, 0xc993, 0xc972, 0xc992, 0xc972, 0xc932, 0xc0d1, 0xc0b1, 0xb8d1, 0xb0d2, 0xb9f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x015f, 0x013f, 0x013f, 0x013f, 0x011f, 0x093f, 0xc0b1, 0x311c, 0x01bf, 0x03ff, 0x059f, 0x069f, 0x079f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x10f2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x18af, 0x18ad, 0x18ad, 0x18ae, 0x18b0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x20ad, 0x18ad, 0x496f, 0xaad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2f4, 0xca74, 0xca33, 0xca13, 0xc9d3, 0xc992, 0xc952, 0xc111, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xca53, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x097f, 0x017f, 0x015f, 0x017f, 0x015f, 0x015f, 0x88f5, 0x293c, 0x013f, 0x02df, 0x053e, 0x067f, 0x077f, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9234, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18af, 0x18cd, 0x18ae, 0x10d0, 0x0118, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ee, 0x8252, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd3b5, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd2b4, 0xd233, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8b1, 0xb8d1, 0xb8d1, 0xc253, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xca13, 0x31bc, 0x01bf, 0x019f, 0x019f, 0x019f, 0x019f, 0x5139, 0x315c, 0x017f, 0x01bf, 0x045e, 0x063e, 0x077f, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8a95, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f9, 0x08f7, 0x18ad, 0x20ad, 0x10d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x00fa, 0x0119, 0x0119, 0x011a, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd4f8, 0xd65c, 0xd6dd, 0xd6fd, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xcb15, 0xca13, 0xc9d3, 0xc992, 0xc932, 0xc911, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc397, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xc9f3, 0x31fc, 0x01df, 0x01df, 0x01df, 0x01df, 0x01df, 0x01bf, 0x01df, 0x01bf, 0x01bf, 0x02df, 0x05fd, 0x073e, 0x07fe, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x8ab5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb8d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08d5, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f9, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18b0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ae, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x28ee, 0xcb55, 0xd375, 0xd395, 0xd395, 0xd3d6, 0xd5db, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xdfff, 0xca13, 0xc9b3, 0xc992, 0xc952, 0xc912, 0xc0d1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb0f1, 0xba95, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9f3, 0x31fd, 0x021f, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01df, 0x01ff, 0x051d, 0x071d, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x6bf7, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x78f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00f7, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x0119, 0x011a, 0x00f8, 0x18b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28ee, 0xb314, 0xd395, 0xd395, 0xd395, 0xd477, 0xd77e, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc9d3, 0xc992, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb152, 0xd79e, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x323c, 0x023f, 0x023f, 0x021f, 0x023f, 0x023f, 0x021f, 0x021f, 0x021f, 0x021f, 0x021f, 0x037e, 0x06dc, 0x07fd, 0x07fd, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0x7911, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ae, 0x18ae, 0x011a, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x00f9, 0x18af, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x8252, 0xd395, 0xd395, 0xd396, 0xd4b8, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xc972, 0xc952, 0xc912, 0xc8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xd63c, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xdfff, 0xdfff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xdfff, 0xd7ff, 0xdfff, 0xd539, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc9d3, 0x325c, 0x027f, 0x025f, 0x025f, 0x025f, 0x023f, 0x025f, 0x025f, 0x023f, 0x023f, 0x023f, 0x029f, 0x067c, 0x07fc, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d1, 0x70f1, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x011a, 0x011a, 0x0118, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x10d0, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x10cf, 0x0119, 0x0119, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x496f, 0xd395, 0xd395, 0xd395, 0xd457, 0xd7bf, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xcf3e, 0xc67c, 0xc53a, 0xc951, 0xc912, 0xc0d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xbb97, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd65b, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd396, 0xd395, 0xc9b3, 0x327c, 0x029f, 0x029f, 0x029f, 0x029f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x025f, 0x027f, 0x05bc, 0x07db, 0x07fc, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x5c78, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0x58f1, 0x3911, 0x3111, 0x30f0, 0x28f0, 0x28f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d1, 0x18ad, 0x18ae, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18d0, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cf, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ce, 0x18ae, 0x18d0, 0x0118, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xa2d3, 0xd395, 0xd395, 0xd3d6, 0xd75e, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfdf, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7df, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xcfff, 0xcfff, 0xd7ff, 0xcfff, 0xd7df, 0xcfff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xcfff, 0xd7ff, 0xcfdf, 0xd7df, 0xcfdf, 0xcfff, 0xd7df, 0xacd8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa8f1, 0xa972, 0xd77e, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xcfff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7df, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd7ff, 0xd7df, 0xd65c, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc193, 0x0a7f, 0x02ff, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x027f, 0x029f, 0x027f, 0x04dd, 0x07bb, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x07ff, 0x3dbb, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0x5911, 0x3911, 0x30f0, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x20ad, 0x08f5, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x18d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x10d0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18af, 0x0118, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x310e, 0xd395, 0xd375, 0xd375, 0xd5ba, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5b, 0xbe3c, 0xb57a, 0xacb8, 0xbdbb, 0xc63c, 0xbe3b, 0xc71e, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc77e, 0xbe5c, 0xb5db, 0xacb8, 0xac98, 0xbd5a, 0xbe3c, 0xc61c, 0xc69d, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xacb9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa111, 0xa911, 0xbc78, 0xcfdf, 0xcfdf, 0xcfdf, 0xd7df, 0xcfdf, 0xcf5e, 0xbe5c, 0xbe5c, 0xc63c, 0xc61c, 0xcefd, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfff, 0xcfdf, 0xd63b, 0xd375, 0xd395, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd395, 0xd375, 0xd375, 0xd375, 0xd395, 0x089f, 0x011f, 0x031f, 0x02ff, 0x02ff, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x02bf, 0x03fd, 0x079a, 0x07fa, 0x07fc, 0x07fe, 0x07ff, 0x07ff, 0x2e5c, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb8d1, 0x5912, 0x3911, 0x38f1, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x08f5, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d0, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ae, 0x0117, 0x011a, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ce, 0x18ad, 0x18ad, 0x0118, 0x011a, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x79f1, 0xd355, 0xd355, 0xd355, 0xcf7e, 0xc7df, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xcfbf, 0xbefd, 0xacb8, 0x8a52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xa192, 0xab96, 0xbe7d, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xcfdf, 0xcfbf, 0xc75e, 0xad19, 0x92b4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xa111, 0x9931, 0xa111, 0x9911, 0xab36, 0xbd5a, 0xc75e, 0xcfdf, 0xc7bf, 0xc7bf, 0xcfdf, 0xc7df, 0xc7bf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfbf, 0xc7df, 0xc7bf, 0xcfbf, 0xc7df, 0xa4b8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xbe3b, 0xcfbf, 0xcfdf, 0xcfbf, 0xcfdf, 0xcfdf, 0xb5da, 0x8a12, 0x8971, 0x9931, 0x9931, 0xa111, 0x9931, 0xab35, 0xc75e, 0xcfbf, 0xcfdf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfbf, 0xc7df, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xc7df, 0xcfdf, 0xcfdf, 0xcfdf, 0xce1b, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x007f, 0x009e, 0x023f, 0x033f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x031f, 0x02ff, 0x02df, 0x02df, 0x02df, 0x039e, 0x075a, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4911, 0x3911, 0x38f0, 0x30f0, 0x28f0, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x20ad, 0x20ad, 0x08f5, 0x00f9, 0x00fa, 0x0119, 0x011a, 0x0119, 0x10d2, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x00f9, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18cd, 0x0119, 0x00f9, 0x011a, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa293, 0xd335, 0xd335, 0xcc98, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc75e, 0xa4b8, 0x8191, 0x9151, 0x9911, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xab35, 0xbefe, 0xc7bf, 0xc7be, 0xc7bf, 0xb5db, 0x89f1, 0x8971, 0x9931, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa132, 0x9911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa172, 0xbd3a, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7be, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xac98, 0x8191, 0x9151, 0x9931, 0xa111, 0xa131, 0xa111, 0xa131, 0xa111, 0x9931, 0xbe1b, 0xc79f, 0xc7bf, 0xc7bf, 0xc7bf, 0xbefd, 0x89f2, 0x8991, 0x9931, 0xa112, 0xa131, 0xa111, 0xa111, 0xa111, 0xab97, 0xc7bf, 0xc7bf, 0xc7be, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc7bf, 0xc6dd, 0xd375, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd335, 0xd335, 0x009f, 0x009f, 0x013f, 0x033f, 0x037f, 0x035f, 0x033f, 0x031f, 0x031f, 0x031f, 0x031f, 0x02ff, 0x02ff, 0x033f, 0x06f9, 0x07f9, 0x07fb, 0x07fd, 0x07ff, 0x07ff, 0x2e3c, 0xb8d2, 0xb0f1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0d1, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x3110, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18b0, 0x10f2, 0x10d3, 0x08d3, 0x08f3, 0x10f3, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x08f5, 0x0119, 0x00f9, 0x011a, 0x0119, 0x011a, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x011a, 0x011a, 0x00f9, 0x10cf, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x0119, 0x00f9, 0x011a, 0x011a, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xd315, 0xd315, 0xd314, 0xc5fb, 0xc79f, 0xc79e, 0xc7bf, 0xc7bf, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xbf9e, 0xbfbf, 0xbfbe, 0xb67c, 0x8a53, 0x8971, 0xa131, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa172, 0xb539, 0xbf9f, 0x9bf6, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xab15, 0xbf3d, 0xc79f, 0xc7be, 0xc79f, 0xc79f, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79e, 0xc79f, 0xc79e, 0xc79f, 0xc79e, 0xc79e, 0xc7bf, 0xc79f, 0xa4b8, 0x8191, 0x9151, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xbdfb, 0xc79f, 0xc79e, 0xc7be, 0xc79f, 0xacf9, 0x8191, 0x9171, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa131, 0xa111, 0xbf3e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xc7bf, 0xc79e, 0xc79e, 0xc79e, 0xbfbf, 0xc79e, 0xc79e, 0xc79e, 0xbf9e, 0xc79f, 0xc79e, 0xbfbe, 0xc79e, 0xc6bd, 0xd355, 0xd2f5, 0xd315, 0xcb14, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd315, 0xd315, 0xd315, 0xd314, 0x007f, 0x007f, 0x00ff, 0x027f, 0x039f, 0x039f, 0x037f, 0x231d, 0x5259, 0x5a3a, 0x033f, 0x033f, 0x031f, 0x031f, 0x0699, 0x07f8, 0x07fa, 0x07fd, 0x07ff, 0x07ff, 0x363c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0x4112, 0x38f1, 0x3911, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x08f7, 0x011a, 0x011a, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x00f7, 0x10d1, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10f2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0118, 0x18b0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0915, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x0915, 0x00f9, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2f4, 0xcaf4, 0xd2f4, 0xc65c, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf7f, 0xb67c, 0x8a12, 0x8971, 0xa111, 0xa111, 0xa911, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa912, 0xa911, 0xa1f3, 0x8191, 0x9931, 0xa111, 0xa111, 0xa912, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa112, 0xa911, 0xaa54, 0xbf1d, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xb79e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa911, 0xb5fb, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9f, 0xa498, 0x8191, 0x9951, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa111, 0xa911, 0xb5fb, 0xbf7e, 0xbf9e, 0xbf9e, 0xbf9f, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbf9e, 0xbebd, 0xd335, 0xcaf4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xcaf4, 0xd2f4, 0xd2f5, 0xcaf4, 0x007f, 0x007f, 0x00bf, 0x021f, 0x2abd, 0x7a36, 0xb953, 0xc112, 0xc911, 0xc912, 0x0b3f, 0x035f, 0x035f, 0x033f, 0x05fa, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa0f1, 0x68f1, 0x4111, 0x30f0, 0x30f0, 0x28ef, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x0119, 0x0118, 0x08f7, 0x08f6, 0x00f7, 0x0118, 0x0119, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x10d2, 0x00f9, 0x011a, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d4, 0x0118, 0x0119, 0x08f6, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x011a, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2d4, 0xd2d4, 0xd2d4, 0xbe5c, 0xb77e, 0xb79e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xb77e, 0xb79e, 0xbf7e, 0xae7b, 0x89f2, 0x8971, 0xa111, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa912, 0xa911, 0xa911, 0xa111, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa111, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa912, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xaa34, 0xb71e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7f, 0xb77e, 0x9c97, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xb5db, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xa478, 0x8191, 0x9951, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa8f1, 0xa911, 0xb5db, 0xb77f, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xb77e, 0xbf7e, 0xbf7e, 0xb77e, 0xb77e, 0xbf7e, 0xbe9d, 0xcb75, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2d5, 0x007f, 0x007f, 0x30bb, 0x9955, 0xc931, 0xc932, 0xc932, 0xc912, 0xc0f2, 0xc8f2, 0x32fc, 0x037f, 0x037f, 0x037f, 0x059b, 0x07f7, 0x07f9, 0x07fc, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d2, 0xb0d1, 0xb0f1, 0x98f1, 0xb0f1, 0x88f1, 0x3110, 0x30f0, 0x30f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x0119, 0x00f7, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x00f7, 0x011a, 0x0119, 0x00f7, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x011a, 0x011a, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd2b4, 0xd2b4, 0xd2b4, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb71d, 0x8a53, 0x8191, 0xa111, 0xa8f1, 0xb0f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f2, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb2f5, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c78, 0x8191, 0x9951, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0x9c77, 0x8191, 0x9151, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xb5db, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb77e, 0xb75e, 0xb71d, 0xcb96, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xcab4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xca94, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0x087e, 0x70f8, 0xc952, 0xc932, 0xc912, 0xc932, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0x331c, 0x03bf, 0x039f, 0x039f, 0x051b, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa0f1, 0xb0f1, 0xb0d1, 0x50f0, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0116, 0x0119, 0x0119, 0x08d5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d3, 0x00fa, 0x0119, 0x08f6, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ae, 0x10d2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x011a, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x188d, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd294, 0xd294, 0xca94, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0x9416, 0x8991, 0x9951, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xacf9, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf7e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5d, 0xb75e, 0xaf5e, 0xaf5e, 0x9c77, 0x8191, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xb75e, 0xb75e, 0xb75e, 0xb75e, 0x9c78, 0x8991, 0x9951, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb5bb, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xb75e, 0xb75e, 0xb75e, 0xaf5e, 0xaf5e, 0xb75e, 0xaf5e, 0xaf1d, 0xcb75, 0xca93, 0xd294, 0xca74, 0xca94, 0xca74, 0xd274, 0xca74, 0xd294, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xca93, 0xca94, 0xd293, 0xca74, 0x9915, 0xc932, 0xc932, 0xc932, 0xc912, 0xc111, 0xc8f2, 0xc0f2, 0xc8d1, 0xc8d1, 0x333c, 0x03ff, 0x03df, 0x03bf, 0x04dc, 0x07d6, 0x07f7, 0x07fb, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28f0, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08d3, 0x0119, 0x0119, 0x10d1, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xd274, 0xd274, 0xca53, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf5d, 0xaf3d, 0xaf3e, 0xa69c, 0x8191, 0x8191, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0d1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xaa13, 0xb418, 0xa438, 0x9ab4, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xaa74, 0xac78, 0xacf9, 0x9b35, 0x9931, 0xa8f1, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f2, 0xb0d1, 0xb0f1, 0xa9b3, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0x9c77, 0x8191, 0x9931, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xadbb, 0xaf3e, 0xaf3e, 0xaf5d, 0xaf3e, 0x9477, 0x8191, 0x9951, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xadba, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3d, 0xaf5e, 0xaf5e, 0xaf5e, 0xaf3d, 0xaf3d, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf5e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaf3e, 0xaefd, 0xcb56, 0xca53, 0xca74, 0xd253, 0xd274, 0xd274, 0xd273, 0xca73, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd254, 0xca74, 0xca54, 0xca54, 0xca74, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f1, 0xc8d1, 0xc8d1, 0xc8d1, 0x335c, 0x041f, 0x03ff, 0x03ff, 0x047d, 0x0795, 0x07f6, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0x40f0, 0x28cf, 0x28ef, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cd, 0x00f8, 0x011a, 0x08f6, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x08d3, 0x08f3, 0x08f3, 0x18af, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x0118, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca53, 0xca53, 0xca53, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0x9457, 0x8191, 0x9931, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb1b3, 0xad9a, 0xaf3d, 0xaf3d, 0xa73d, 0xa73d, 0x9dda, 0x89d1, 0x9951, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb213, 0xad9b, 0xa73e, 0xa73d, 0xaf3e, 0xaf3e, 0x9dda, 0x81f2, 0x9171, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb8d1, 0xb8d2, 0xb0f1, 0xad39, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3d, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73e, 0xaf3e, 0xaf1e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xa73e, 0xaf3e, 0xa73e, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xa73e, 0xa73d, 0xaf3d, 0xa73d, 0xaf3d, 0xa73e, 0xa73e, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xa73e, 0x9478, 0x8191, 0x9931, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb8d1, 0xad9a, 0xa73e, 0xa73d, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xa73d, 0xa73d, 0xaf3e, 0xa73e, 0xa73d, 0xa73d, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xaf3d, 0xaf3e, 0xa73d, 0xa73d, 0xaf3d, 0xa73e, 0xaf3d, 0xaf3d, 0xaf3d, 0xa73e, 0xa73d, 0xa73d, 0xaf3d, 0xa73d, 0xaedd, 0xc376, 0xca53, 0xca53, 0xca53, 0xca53, 0xca33, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xca53, 0xd233, 0xca53, 0xd253, 0xca53, 0xca53, 0x309c, 0x005f, 0x58b9, 0xc912, 0xc111, 0xc8f1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x337c, 0x045f, 0x041f, 0x041f, 0x045e, 0x0775, 0x07f5, 0x07fa, 0x07fe, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0d1, 0x80f1, 0x28ef, 0x28cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x011a, 0x011a, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca33, 0xca13, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0x8a53, 0x8191, 0xa8f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb213, 0xa6bd, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0x9e1b, 0x81f1, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb1f3, 0xa6bd, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0x9e1b, 0x89f2, 0x8991, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb336, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71e, 0xa71d, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa73e, 0xa71d, 0xa73e, 0xa73d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa73d, 0xa73e, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa73e, 0xa73d, 0xa73d, 0xa71d, 0xa71d, 0x9477, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa59a, 0xa71d, 0xa73d, 0xa73e, 0xa71d, 0xa71d, 0xa71e, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71e, 0xa71d, 0xa73d, 0xa71d, 0xa73d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73d, 0xa73d, 0xa71d, 0xa73e, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xa71d, 0xbbf7, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca13, 0xca14, 0xd233, 0xca33, 0x003f, 0x003f, 0x005f, 0x78d7, 0xc0f2, 0xc8f1, 0xc0d1, 0xc0d1, 0xc0d1, 0xc8b1, 0x4b1a, 0x047f, 0x045f, 0x043f, 0x045f, 0x0735, 0x07f4, 0x07f9, 0x07fe, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xa8f1, 0xb0f1, 0xb0d1, 0xb0f1, 0xa0f1, 0x28cf, 0x28ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x10d1, 0x08f3, 0x10f3, 0x10d2, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x10d3, 0x0119, 0x0119, 0x18cd, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x00f9, 0x08f6, 0x0119, 0x0119, 0x0119, 0x18af, 0x20ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d3, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xca13, 0xca13, 0xca13, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x8191, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa5db, 0x9f1d, 0x9f1d, 0x9efd, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xa5db, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0x9f1d, 0x94f9, 0x8191, 0x9931, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb932, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1e, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e1b, 0x9457, 0x92d4, 0xa1f3, 0xa911, 0xb0f1, 0xb0f1, 0xa911, 0xb274, 0xb254, 0xb254, 0xabf7, 0xa5db, 0xa6fd, 0xa6fd, 0xa71d, 0xa71d, 0x9f1d, 0x9f1d, 0xa6fd, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e7c, 0x9498, 0x8b14, 0x9a13, 0xa131, 0xa912, 0xb0f1, 0xa8f1, 0xb255, 0xb274, 0xb254, 0xab97, 0xad1a, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9457, 0x8191, 0xa131, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xa57a, 0x9f1d, 0xa71d, 0x9f1d, 0xa71d, 0x9e7c, 0x9dba, 0xa59a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa57a, 0xa69c, 0x9f1d, 0x9f1d, 0x9f1d, 0xa71d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9f1d, 0x9e5c, 0x94b8, 0x8af4, 0x9a13, 0xa131, 0xa8f1, 0xb0f1, 0xb0f1, 0xb932, 0xb274, 0xb254, 0xb336, 0xacb9, 0xa63c, 0x9f1d, 0xbbf7, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xca13, 0xca13, 0xca13, 0xca13, 0xca13, 0x003f, 0x003f, 0x005f, 0x58b9, 0xc0f1, 0xc0d1, 0xc8d1, 0xc8b2, 0xc0b1, 0xc0b1, 0x62b8, 0x04bf, 0x047f, 0x047f, 0x045f, 0x0715, 0x07f4, 0x07f9, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xa8f1, 0xa8f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0x58f0, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x20ad, 0x20cd, 0x18ae, 0x08f3, 0x0119, 0x00f9, 0x18ae, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x10d4, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc9d3, 0xc9d3, 0xc9d3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x959a, 0x8191, 0x9151, 0xc0b1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb2b5, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8252, 0x8191, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb1f3, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9f1d, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x8a93, 0x8191, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xa63c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x94f8, 0x8a53, 0x9171, 0xb0f1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8b1, 0xb8b1, 0xc0b1, 0xc0d1, 0xc0d1, 0xb8d1, 0xc0d1, 0xb8b1, 0xb992, 0xacb9, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e5c, 0x8b96, 0x8991, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb932, 0xabf7, 0x9e9c, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9437, 0x8191, 0xa131, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xb8d1, 0xa57a, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9efd, 0x9e9c, 0x8b96, 0x8971, 0xa131, 0xb8d1, 0xb8d1, 0xc0b1, 0xb8d1, 0xc0b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb8d1, 0xb8d1, 0xc0d1, 0xb335, 0xa63c, 0xbbd7, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9f3, 0xc9d3, 0x001f, 0x003f, 0x003f, 0x00df, 0x88f6, 0xc8d1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0x62d9, 0x04ff, 0x04bf, 0x049f, 0x047f, 0x06b6, 0x07f3, 0x07f8, 0x07fd, 0x07ff, 0x2e3c, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0x98f2, 0xb0f1, 0xb0f1, 0xb0f1, 0x78f0, 0x90f1, 0x80d1, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x08f7, 0x0119, 0x011a, 0x08f4, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x18cd, 0x08f3, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x08f7, 0x0119, 0x08f5, 0x18cd, 0x18ad, 0x18ad, 0x08f6, 0x011a, 0x08f6, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0xc9b3, 0xc9b3, 0xc9b3, 0x9edd, 0x96fd, 0x9edd, 0x96fd, 0x9efc, 0x96fd, 0x96fd, 0x9599, 0x8991, 0x9171, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xabd7, 0x9efc, 0x96fd, 0x96fd, 0x96dd, 0x96fd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x9efd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xab76, 0x9edd, 0x9efd, 0x9efd, 0x9edd, 0x9edd, 0x96dd, 0x9efd, 0x9edd, 0x96fd, 0x9edd, 0x8c37, 0x8191, 0xa131, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xa55a, 0x96fd, 0x9edd, 0x9efd, 0x96fd, 0x963b, 0x8af4, 0x8991, 0xa911, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xb992, 0xa55a, 0x9edd, 0x9efc, 0x96fd, 0x9edd, 0x96fd, 0x9efd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x96fd, 0x94f9, 0x81f1, 0x9171, 0xb8d2, 0xc0b1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb992, 0x9dbb, 0x96fd, 0x9edd, 0x96fd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x9edd, 0x96fd, 0x96fd, 0x9efd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa55a, 0x96fd, 0x9efd, 0x96fd, 0x9efd, 0x9efd, 0x96fd, 0x9efd, 0x96fd, 0x9539, 0x81f1, 0x9171, 0xb0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb911, 0xacfa, 0xb458, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9d3, 0xc9d3, 0xc9b3, 0x001f, 0x003f, 0x003f, 0x00bf, 0x311c, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x6278, 0x053f, 0x04ff, 0x04bf, 0x049f, 0x0696, 0x07f2, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x8912, 0xb0f1, 0xb0f1, 0xb0d1, 0x48f0, 0x28f0, 0x28ef, 0x28cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x011a, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x10d3, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x00f6, 0x18ad, 0x18ad, 0x208d, 0x08f3, 0x0119, 0x00f9, 0x18ae, 0x18ae, 0x18ce, 0x00f9, 0x0119, 0x08f3, 0x18ad, 0x20ae, 0x18ad, 0x08f6, 0x011a, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18cf, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc993, 0xc993, 0xc992, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8d79, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xabd7, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x95da, 0x89f2, 0x8971, 0xb8d1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dc, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0x9931, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa499, 0x96dc, 0x96dd, 0x8c37, 0x8191, 0xa111, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x96dd, 0x8cd8, 0x8191, 0x9951, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xac79, 0xacf9, 0xc992, 0xc993, 0xc9b2, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0xc992, 0xc992, 0xc992, 0xc993, 0xc993, 0xc993, 0x003f, 0x003f, 0x003f, 0x00bf, 0x011f, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x79d6, 0x051f, 0x051f, 0x04ff, 0x04bf, 0x0638, 0x07f1, 0x07f7, 0x07fc, 0x07ff, 0x2e3c, 0xb0f1, 0xb0f2, 0xb0f1, 0xb0f1, 0x80f2, 0xb0f1, 0xb0f1, 0xb0f2, 0x3110, 0x30f0, 0x28cf, 0x28ef, 0x20ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x011a, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d1, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0118, 0x18ae, 0x18ad, 0x18ad, 0x18ce, 0x0119, 0x0119, 0x0118, 0x08f5, 0x00f8, 0x0119, 0x0119, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x00f8, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18d0, 0x0119, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ce, 0x0117, 0x011a, 0x0119, 0x0119, 0x011a, 0x00f7, 0x18ce, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x10d2, 0x08f3, 0x10f3, 0x10d2, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc972, 0xc972, 0xc972, 0x8ebc, 0x8ebd, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8d7a, 0x8191, 0x9151, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d39, 0x8ebd, 0x8edd, 0x8dba, 0x81f2, 0x9171, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc0b1, 0xc8b2, 0xc8b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xa437, 0x8ebc, 0x8edd, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebc, 0x8ebd, 0x8ebc, 0x8ebd, 0x8ebd, 0x8cd8, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc8b1, 0xa4d9, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc8b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0x9d3a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa131, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8edc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8cd8, 0x8191, 0x9951, 0xc8b1, 0xc0b1, 0xc8b1, 0xc8b2, 0xc8b1, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc8b1, 0xc8b1, 0xc8d1, 0xa478, 0xa4d9, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0xc972, 0x003f, 0x003f, 0x001f, 0x009f, 0x00df, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x9174, 0x049f, 0x057f, 0x051f, 0x04ff, 0x0619, 0x07f1, 0x07f6, 0x07fc, 0x07ff, 0x35bb, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x6912, 0xb0f1, 0xb0f1, 0x98f1, 0x30f0, 0x30f0, 0x28ef, 0x28cf, 0x28ef, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x10d3, 0x20ad, 0x18ad, 0x10d3, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18d0, 0x011a, 0x011a, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x10d2, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x18b0, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0119, 0x00f9, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f5, 0x011a, 0x0119, 0x0117, 0x00f7, 0x00f9, 0x0119, 0x08f5, 0x20ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x011a, 0x00fa, 0x011a, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x20ad, 0x18ae, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc952, 0xc952, 0xc952, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d59, 0x8191, 0x9171, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xabd7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa931, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc0f2, 0xabb7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8437, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d3a, 0x8ebc, 0x8e1b, 0x81f2, 0x8971, 0xb912, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8d1, 0xc112, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8f2, 0xc8d1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f1, 0xa498, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8dba, 0x8991, 0x8991, 0xc0f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc8f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc0f2, 0xc8f1, 0xc0f1, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc132, 0x8e5c, 0x8c17, 0x8191, 0xa931, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f2, 0xc8f2, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c17, 0x8191, 0xa951, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc8f1, 0x9d5a, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebd, 0x8dba, 0x81f2, 0x8991, 0xc111, 0xc8f1, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8f1, 0xc8f1, 0xc0f2, 0xc8d2, 0xc8f1, 0xc8f2, 0xc0f1, 0xc0f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f2, 0xc8f2, 0xc8f1, 0xc8f1, 0xc8f2, 0xc152, 0x95fb, 0xa4b8, 0xc152, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x68b7, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xa8f3, 0x041f, 0x057f, 0x053f, 0x051f, 0x05f9, 0x07f0, 0x07f6, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0x5912, 0xb0f1, 0xb0f1, 0x90f1, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ae, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f4, 0x0119, 0x011a, 0x00f7, 0x00f8, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x0117, 0x0119, 0x08f6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x08f3, 0x00f6, 0x08f3, 0x18af, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18cd, 0x20ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x0117, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0119, 0x0119, 0x08f3, 0x18cd, 0x20ae, 0x10d3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc932, 0xc932, 0xc932, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8d79, 0x8191, 0x9171, 0xc132, 0xc131, 0xc912, 0xc912, 0xc132, 0xc911, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc911, 0xc912, 0xc912, 0xc112, 0xc912, 0xc912, 0xabf7, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8ebc, 0x8c36, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ad4, 0x8191, 0xb152, 0xc912, 0xc131, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc912, 0xc912, 0xc911, 0xc112, 0xc932, 0xc912, 0xc912, 0xc932, 0xc911, 0xc912, 0xc912, 0xc932, 0xc131, 0x9dba, 0x8ebc, 0x96bc, 0x8ebc, 0x8edc, 0x96bb, 0x8ebc, 0x8edc, 0x82d4, 0x8191, 0xb932, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc112, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc131, 0xc912, 0xc132, 0xc131, 0xc912, 0xc912, 0xc911, 0xc911, 0xc131, 0xc912, 0xc912, 0xb356, 0x8c36, 0x8191, 0xa151, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc912, 0xc112, 0x9d59, 0x8ebc, 0x96bc, 0x8ebc, 0x8ebc, 0x8c37, 0x8191, 0xa951, 0xc912, 0xc912, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0x9d59, 0x8ebc, 0x8ebc, 0x8ebc, 0x96bc, 0x8ebc, 0x82f4, 0x8991, 0xb151, 0xc912, 0xc912, 0xc932, 0xc912, 0xc912, 0xc131, 0xc932, 0xc912, 0xc911, 0xc911, 0xc932, 0xc911, 0xc912, 0xc911, 0xc932, 0xc932, 0xc112, 0xc911, 0xc132, 0xc912, 0xc912, 0xc932, 0xb336, 0x96bc, 0xa4f9, 0xc192, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0xc932, 0x001f, 0x001f, 0x001f, 0x007f, 0x00bf, 0x009f, 0x90b5, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x0b9e, 0x053f, 0x057f, 0x053f, 0x05da, 0x07ef, 0x07f5, 0x07fb, 0x07ff, 0x5478, 0xb0d1, 0xb0f1, 0xb0f1, 0x9111, 0x5912, 0xa8f1, 0xb0f1, 0x70f1, 0x30f0, 0x28ef, 0x20ef, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x011a, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ae, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f8, 0x0119, 0x08f7, 0x18ae, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18d0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10d0, 0x20ae, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc912, 0xc912, 0xc912, 0x9edb, 0x9edb, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9edb, 0x9578, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xb417, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa518, 0x9edb, 0x96db, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9436, 0x8191, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x94d8, 0x8191, 0x9991, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc253, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xbab5, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x9599, 0x8191, 0x91b1, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b5, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc972, 0xc952, 0xc952, 0xc972, 0xc1b2, 0x9436, 0x8191, 0xa972, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edb, 0x9edb, 0x9edb, 0x8c36, 0x8991, 0xa171, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa579, 0x9edb, 0x9edc, 0x9edb, 0x9edb, 0x9598, 0x8191, 0x9191, 0xc952, 0xc952, 0xc952, 0xc952, 0xc152, 0xc952, 0xc172, 0xc952, 0xc952, 0xc952, 0xc1f3, 0xc2b4, 0xb952, 0xc152, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xc952, 0xa61a, 0x9edc, 0xa5da, 0xc172, 0xc912, 0xc911, 0xc911, 0xc912, 0xc912, 0xc111, 0xc912, 0xc912, 0xc912, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x6098, 0xc0b1, 0xb8b1, 0xc0b1, 0xc0b1, 0x2afc, 0x04ff, 0x05bf, 0x055f, 0x05fb, 0x07cf, 0x07f4, 0x07fc, 0x07ff, 0x5c79, 0xb0f1, 0xb0f1, 0xb0f1, 0x8112, 0x5912, 0xb0f1, 0xb0f1, 0x68f1, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20cf, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ae, 0x18ad, 0x10d2, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ae, 0x18ad, 0x0119, 0x011a, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x00f6, 0x0119, 0x0119, 0x10d2, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x10d3, 0x0119, 0x0119, 0x08d6, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0x18ad, 0x18ae, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x20ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ae, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x20ad, 0x18ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x18d0, 0x18ad, 0x18ad, 0x10d0, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xc8f1, 0xc8f1, 0xc8f2, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6da, 0xa6fa, 0x9d98, 0x8191, 0x9191, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc992, 0xb436, 0xa6fb, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad99, 0x8a32, 0x8991, 0xc192, 0xc992, 0xc992, 0xc972, 0xc992, 0xc992, 0xc973, 0xc992, 0xc992, 0xc992, 0xbc36, 0xa69a, 0xa6fa, 0xa6fa, 0xa69a, 0x9395, 0x8991, 0xb992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0xad98, 0xa6db, 0xa6da, 0xa6fa, 0xa6fb, 0xa6fa, 0x9395, 0x8191, 0xb192, 0xc992, 0xc992, 0xc992, 0xc993, 0xc972, 0xc972, 0xc992, 0xc972, 0xc233, 0xad98, 0xa6fa, 0xa6fb, 0xa639, 0x8a93, 0x9992, 0xc192, 0xc972, 0xc992, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc972, 0x9a93, 0x8191, 0xa992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6fa, 0xa6fb, 0xa6fa, 0xa6fa, 0x9436, 0x8191, 0xa992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xad98, 0xa6da, 0xa6da, 0xa6fa, 0xa6da, 0x8b95, 0x8191, 0xb192, 0xc972, 0xc992, 0xc972, 0xc992, 0xc992, 0xc972, 0xc992, 0xc972, 0xc294, 0xadf9, 0xa6fa, 0xa6da, 0xa69a, 0x9334, 0x9191, 0xb992, 0xc992, 0xc993, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xc992, 0xb497, 0xaefb, 0xaefb, 0xb5d9, 0xc952, 0xc8f1, 0xc8f2, 0xc0f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0xc8f1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x005f, 0x7897, 0xc0b1, 0xc0d1, 0xc0b1, 0xb8d1, 0x6238, 0x04df, 0x05bf, 0x059f, 0x05fa, 0x07ce, 0x07f4, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x7112, 0x5912, 0xb0f1, 0xa8f1, 0x5110, 0x30f0, 0x30cf, 0x28cf, 0x28cf, 0x28cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x20ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x08f6, 0x18d0, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x08f6, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18d0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f5, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011a, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f3, 0x18ad, 0x18ad, 0x08f3, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0xc0d1, 0xc0d1, 0xc8d2, 0xb71a, 0xb71a, 0xb71a, 0xaefa, 0xb71a, 0xaf1a, 0xaefa, 0xa598, 0x8191, 0x9191, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc9d3, 0xbc76, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0x9c55, 0x8191, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xc9d3, 0xb5b8, 0xb71a, 0xaf1a, 0xb71a, 0xb6fa, 0xb71a, 0xb71a, 0xb71a, 0xb71a, 0xb6fa, 0xaf1a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xa3b5, 0x8191, 0x9992, 0xc9b2, 0xc9b3, 0xc9d2, 0xc9b2, 0xc9b3, 0xc9b2, 0xc9b3, 0xc9d3, 0xca13, 0xbdb8, 0xaefa, 0xaf1a, 0xb71a, 0xb6fa, 0xaefa, 0xaf19, 0xa4f7, 0x8991, 0xb1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9d2, 0xc9b3, 0xc9b3, 0xc314, 0xaf1a, 0xaf1a, 0xaef9, 0xaf1a, 0xaf1a, 0x89f1, 0x8191, 0xc1b2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9d3, 0xc9b3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xaefa, 0xb71a, 0xb6b9, 0x8a93, 0x8991, 0xc1d2, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b2, 0xa992, 0x8191, 0xa9b2, 0xc9d3, 0xc9b3, 0xc9d3, 0xc9b2, 0xc9b2, 0xc9b2, 0xc9b3, 0xb5b8, 0xaf1a, 0xaefa, 0xaf1a, 0xb71a, 0x9c56, 0x8191, 0xa992, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xb5b8, 0xb6fa, 0xaf1a, 0xaf1a, 0xb6fa, 0x89f2, 0x8191, 0xc1b2, 0xc9b3, 0xc9b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9d3, 0xcab4, 0xb6b9, 0xaf1a, 0xb71a, 0xb71a, 0xb6fa, 0xb71a, 0x92f3, 0x89b1, 0xc1b2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9d3, 0xc315, 0xb71a, 0xb71a, 0xb71a, 0xbdd9, 0xc132, 0xc0d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc8d1, 0xc0d1, 0xc0d1, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x007f, 0x6878, 0xb8b1, 0xc0b1, 0xc0d1, 0xb8d1, 0x9954, 0x047f, 0x05bf, 0x05bf, 0x061a, 0x07ce, 0x07f2, 0x07fc, 0x07ff, 0x5c78, 0xb0f1, 0xb0f1, 0xb0f1, 0x6112, 0x5912, 0xa8f1, 0xa8f1, 0x60f0, 0x30f0, 0x28ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x08f6, 0x0119, 0x0119, 0x0119, 0x0118, 0x00f6, 0x10d3, 0x08f6, 0x0118, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x208d, 0x18b0, 0x00f8, 0x0139, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x00f8, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x00f7, 0x00f7, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xc0b1, 0xc8b1, 0xc0b1, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa4b5, 0x8191, 0xa1b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xd1f3, 0xc496, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf39, 0xa455, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0x99f2, 0x8991, 0xb1d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc577, 0xbf19, 0xbf39, 0xbf39, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9bf5, 0x8191, 0xb1d2, 0xc9f3, 0xc9f3, 0xd1f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf19, 0xbf19, 0xb6b9, 0x8191, 0x8991, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9d3, 0xc9f3, 0xc9f3, 0xbed8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0xbf39, 0xad57, 0x8191, 0x99b2, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xb9d3, 0x8191, 0xa9b2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xbf19, 0x9c75, 0x8191, 0xa9d2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbdd8, 0xbf19, 0xbf19, 0xbf19, 0xb6b8, 0x8191, 0x8191, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xbe78, 0xbf19, 0xbf39, 0xbf19, 0xbf39, 0xbf19, 0xbf19, 0xadb7, 0x8191, 0x91b1, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f3, 0xc9f3, 0xc9f3, 0xc9f3, 0xc71a, 0xbf1a, 0xc73a, 0xbf3a, 0xc659, 0xc9d3, 0xc0b1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc8b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x003f, 0x001f, 0x7076, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0x0bff, 0x05df, 0x05bf, 0x0639, 0x07cd, 0x07f2, 0x07fc, 0x07ff, 0x63f7, 0xb0f1, 0xb0f1, 0xb0f1, 0x4132, 0x4111, 0xa0f1, 0xb0f1, 0x90f1, 0x30f0, 0x28ef, 0x28ce, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x00f9, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d1, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f8, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x10d1, 0x08f3, 0x08f3, 0x10d2, 0x18cd, 0x20ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ce, 0x00f7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18cd, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ae, 0xc0b1, 0xc0b1, 0xc0b1, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8991, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca34, 0xca13, 0xca33, 0xca33, 0xccb6, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa455, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca33, 0xca33, 0xca33, 0xd213, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0x91b1, 0x8191, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xca13, 0xc455, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0xc738, 0x8a52, 0x8991, 0xc213, 0xca13, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcd56, 0xc738, 0xc738, 0xc739, 0xb5d7, 0x8191, 0x91b1, 0xca13, 0xca13, 0xca13, 0xd233, 0xca33, 0xca33, 0xca33, 0xcb55, 0xcf38, 0xc738, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0x8191, 0x8191, 0xca13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xd233, 0xca13, 0x8191, 0xa9d2, 0xca33, 0xca33, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xcdf7, 0xc738, 0xc738, 0xc738, 0xc739, 0xa475, 0x8191, 0xa9d2, 0xca13, 0xca33, 0xca33, 0xca33, 0xca33, 0xca13, 0xca33, 0xc5f7, 0xc738, 0xc738, 0xc738, 0xb5d6, 0x8191, 0x99b2, 0xca33, 0xca33, 0xd213, 0xca33, 0xca33, 0xca33, 0xca33, 0xcb74, 0xc739, 0xc738, 0xc738, 0xc738, 0xc738, 0xc739, 0xc738, 0xc738, 0x8ab2, 0x8191, 0xba13, 0xca13, 0xca13, 0xca33, 0xca13, 0xca33, 0xca33, 0xca13, 0xcf39, 0xc739, 0xc759, 0xcf3a, 0xcf39, 0xced9, 0xc9f3, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x001f, 0x001f, 0x9894, 0xb8d1, 0xb8d1, 0xb8d1, 0x42da, 0x059f, 0x05ff, 0x0678, 0x07cc, 0x07f1, 0x07fc, 0x07ff, 0x82b5, 0xa8f1, 0xb0f1, 0x98f2, 0x4132, 0x3912, 0x70f1, 0xa8f1, 0xa8f1, 0x50f0, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x10d4, 0x08f5, 0x08f6, 0x08f4, 0x08d3, 0x10cf, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d2, 0x10d3, 0x08f3, 0x10d2, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xcf57, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xca54, 0xca53, 0xca53, 0xca53, 0xca54, 0xccd6, 0xcf58, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf58, 0xac75, 0x8191, 0xa9f2, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca53, 0xd254, 0xce17, 0xcf57, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0x99d2, 0x89b1, 0xca53, 0xca53, 0xca53, 0xca53, 0xd253, 0xca53, 0xca53, 0xca54, 0xd6b7, 0xd758, 0xcf58, 0xcf57, 0xcf58, 0xd758, 0xd757, 0xd758, 0xd757, 0xd758, 0xcf58, 0xb535, 0x8191, 0xa1d2, 0xca53, 0xca53, 0xca53, 0xd254, 0xca73, 0xca53, 0xca53, 0xcc95, 0xd758, 0xd758, 0xcf58, 0xbdd6, 0x8191, 0x99d2, 0xca53, 0xca53, 0xca54, 0xca53, 0xca53, 0xd254, 0xca54, 0xd435, 0xd758, 0xd758, 0xcf58, 0xd758, 0xd758, 0xcf57, 0xd738, 0xcf58, 0x9af3, 0x8991, 0xc213, 0xca54, 0xca53, 0xca53, 0xd253, 0xca53, 0xca54, 0xca73, 0x8191, 0xa9f2, 0xca53, 0xd253, 0xd253, 0xca54, 0xd253, 0xca53, 0xca54, 0xce17, 0xcf58, 0xd758, 0xd758, 0xcf58, 0xac74, 0x8191, 0xa9f2, 0xca53, 0xca54, 0xd253, 0xca53, 0xca53, 0xca54, 0xca53, 0xd617, 0xd758, 0xcf58, 0xcf58, 0xbdd6, 0x8191, 0x91b2, 0xca53, 0xd254, 0xca53, 0xca53, 0xca54, 0xd253, 0xd253, 0xccd6, 0xd758, 0xd758, 0xd758, 0xd758, 0xcf57, 0xd757, 0xcf58, 0xd758, 0x9af3, 0x8191, 0xba33, 0xca54, 0xca53, 0xd253, 0xca54, 0xca53, 0xd253, 0xca53, 0xd758, 0xd758, 0xdf59, 0xd779, 0xd759, 0xd759, 0xd6f9, 0xc1f2, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x001f, 0x001f, 0x001f, 0x183e, 0xb0d2, 0xb8d1, 0xb8d1, 0x9974, 0x059f, 0x061f, 0x0698, 0x07cc, 0x07f0, 0x07fc, 0x07ff, 0x82b5, 0xb0f1, 0xb0f1, 0x88f1, 0x4132, 0x4111, 0x3910, 0x98f1, 0xa8f2, 0x88f1, 0x28ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x10d0, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x10d0, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0xc0b1, 0xc0b1, 0xc0b1, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xca74, 0xca94, 0xca94, 0xca94, 0xca94, 0xd294, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xb494, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0x99d2, 0x91d2, 0xd294, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xca94, 0xd3d4, 0xdf77, 0xdf77, 0xdf77, 0xdf76, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xdf77, 0x8191, 0x8992, 0xca94, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xca94, 0xd3d5, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xca94, 0xca94, 0xd273, 0xca94, 0xd294, 0xca94, 0xd294, 0xd515, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xca94, 0xca94, 0xd294, 0xca94, 0xca93, 0xd294, 0xca94, 0x8191, 0xaa12, 0xd294, 0xd294, 0xd294, 0xca94, 0xca94, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf57, 0xdf77, 0xb474, 0x8191, 0xaa12, 0xca94, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xde36, 0xdf77, 0xdf77, 0xdf77, 0xc5f5, 0x8191, 0x99d2, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xca94, 0xca93, 0xd4f5, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0xdf77, 0x9b12, 0x8191, 0xba53, 0xd294, 0xca94, 0xca94, 0xd294, 0xca94, 0xd294, 0xca94, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xdf78, 0xe779, 0xdf19, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x385b, 0xb8d1, 0xb8d1, 0xb8d1, 0x2c3c, 0x061f, 0x06b7, 0x07cb, 0x07f0, 0x07fb, 0x07ff, 0xb0f1, 0xb0f1, 0xa8f1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xa0f1, 0xa8f1, 0x48ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x00f9, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x208e, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xc0d1, 0xe776, 0xe796, 0xe797, 0xe797, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2d4, 0xd2b4, 0xd2b4, 0xdd35, 0xe776, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xe796, 0xb474, 0x8191, 0xaa33, 0xd2d4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2d4, 0xe656, 0xef96, 0xe776, 0xe797, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0x99d2, 0x99f2, 0xcab4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd2b4, 0xd3f5, 0xe777, 0xe797, 0xef97, 0xe796, 0xe796, 0xe776, 0xe777, 0xe796, 0xe796, 0xe796, 0xe777, 0xef97, 0x8191, 0x8191, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcad4, 0xd3d5, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xcad4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2b4, 0xcab4, 0xd2b4, 0xdd35, 0xe777, 0xef76, 0xe796, 0xe797, 0xe797, 0xe776, 0xe796, 0xe776, 0xc534, 0xb494, 0xcc15, 0xd3f5, 0xdbf4, 0xdbf4, 0xdbf5, 0xd3f5, 0xd3f4, 0xcb34, 0x8191, 0xaa32, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xcab4, 0xe656, 0xe776, 0xe796, 0xe796, 0xe776, 0xb494, 0x8191, 0xaa33, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xde56, 0xe796, 0xe796, 0xe796, 0xce15, 0x8191, 0x99f2, 0xd2b4, 0xd2b4, 0xd2d4, 0xd2b4, 0xd2d4, 0xcad4, 0xcad4, 0xdd15, 0xe796, 0xe796, 0xe776, 0xe796, 0xef96, 0xe796, 0xe796, 0xe796, 0x9b13, 0x8191, 0xba73, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xd2b4, 0xe797, 0xef97, 0xef77, 0xef97, 0xef78, 0xef98, 0xef98, 0xef98, 0xc992, 0xb8d1, 0xc0d1, 0xc0b1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x7096, 0xb8d1, 0xb8d1, 0x8a35, 0x063f, 0x06d6, 0x07ea, 0x07f1, 0x07fc, 0x07ff, 0xa8f1, 0xa8f1, 0xa8f1, 0x6132, 0x4132, 0x4111, 0x38f1, 0x3110, 0x48f0, 0xa8f1, 0x98f1, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10d0, 0x00f9, 0x0119, 0x08f7, 0x18ae, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xf796, 0xf7b6, 0xf796, 0xf795, 0xf795, 0xf796, 0xefb6, 0xbc93, 0x8191, 0xaa52, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f4, 0xdd55, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xf7b6, 0xefb6, 0xbc93, 0x8191, 0xaa53, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xe675, 0xf796, 0xf795, 0xf796, 0xf796, 0xf796, 0xf7b6, 0xf7b5, 0xf7b5, 0xef96, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0x99f2, 0x99f2, 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2d4, 0xd2f4, 0xd2f4, 0xdc75, 0xf795, 0xf795, 0xf795, 0xf796, 0xf7b5, 0xf796, 0xf796, 0xf796, 0xf796, 0xefb6, 0xf7b5, 0xf796, 0x8191, 0x8991, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xdc15, 0xf796, 0xf796, 0xf796, 0xd615, 0x8191, 0x99f2, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xe535, 0xf7b6, 0xf7b5, 0xf796, 0xefb6, 0xf796, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xf795, 0xf796, 0xf796, 0xf795, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xbc93, 0x8191, 0xaa53, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf796, 0xf7b5, 0xf796, 0xbc93, 0x8191, 0xaa33, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xee75, 0xf796, 0xf7b5, 0xf795, 0xd634, 0x8191, 0x99f2, 0xd2f4, 0xd2f5, 0xd2f4, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2d4, 0xe555, 0xf796, 0xf7b5, 0xf7b6, 0xf7b6, 0xf795, 0xf7b6, 0xf796, 0xf7b6, 0xa311, 0x8191, 0xba94, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xf796, 0xf796, 0xf797, 0xf797, 0xf797, 0xf7b7, 0xf798, 0xf798, 0xd273, 0xb8d1, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x98b4, 0xb8d1, 0xb8d1, 0x3c9b, 0x06f5, 0x07e9, 0x07f1, 0x07fd, 0x26bd, 0xb0f1, 0xb0f2, 0xb0f1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30f0, 0x60f0, 0xa911, 0x70f0, 0x20ce, 0x20cf, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x00f8, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x18ad, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x0118, 0x18d0, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xff94, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd315, 0xd335, 0xd335, 0xd335, 0xd334, 0xd315, 0xd335, 0xe575, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xf675, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb4, 0xffb5, 0xffb5, 0xff95, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0x99f2, 0x99f2, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd315, 0xd335, 0xdc54, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0x8191, 0x8191, 0xd334, 0xd315, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xdc34, 0xffb4, 0xffb5, 0xffb5, 0xde34, 0x8191, 0x99f2, 0xd314, 0xd335, 0xd315, 0xd334, 0xd334, 0xd335, 0xd335, 0xe574, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb4, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xc4b3, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd314, 0xd315, 0xd335, 0xd335, 0xd335, 0xedf5, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xc493, 0x8191, 0xaa53, 0xd335, 0xd335, 0xd335, 0xd335, 0xd315, 0xd315, 0xd335, 0xf694, 0xffb5, 0xffb5, 0xffb5, 0xde14, 0x8191, 0x99f2, 0xd335, 0xd335, 0xd314, 0xd334, 0xd314, 0xd334, 0xd315, 0xe555, 0xffb5, 0xffb5, 0xffb5, 0xffb4, 0xffb5, 0xffb5, 0xffb5, 0xffb5, 0xa332, 0x8191, 0xbab4, 0xd335, 0xd335, 0xd335, 0xd315, 0xd334, 0xd335, 0xd335, 0xffb5, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb6, 0xffb7, 0xffb8, 0xdbd4, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x083f, 0x70f7, 0xb8d1, 0xa952, 0x0e94, 0x07c9, 0x07f2, 0x07fd, 0x2e3c, 0xa8f1, 0xa8f1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30f0, 0x30f0, 0x30ef, 0x58f0, 0xa8f1, 0x40cf, 0x20ae, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18b0, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18cf, 0x00f8, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x00f9, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb8d1, 0xb8d1, 0xb8d1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xc3f0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xf590, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xc3ef, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0x9a12, 0x91f2, 0xd355, 0xd354, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdbd4, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0x8191, 0x8191, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xdc13, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x99f2, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, 0xecd1, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe2e, 0xfe2e, 0xc3cf, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xe4d1, 0xfe4e, 0xfe2e, 0xfe2e, 0xfe4e, 0xc3d0, 0x8191, 0xaa73, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xf590, 0xfe4e, 0xfe2e, 0xfe2e, 0xe50f, 0x8191, 0x9a12, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xecd2, 0xfe2e, 0xfe4e, 0xfe2e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe2f, 0xa2b0, 0x8191, 0xc2f4, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xfe2f, 0xfe50, 0xfe50, 0xfe50, 0xfe51, 0xfe51, 0xfe52, 0xfe52, 0xe3d2, 0xb8d2, 0xb8d1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x001f, 0x003f, 0x00df, 0x59f8, 0xb8d1, 0x8291, 0x07c9, 0x07f2, 0x07fe, 0x455a, 0xb0f1, 0xa8f1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28cf, 0x50cf, 0x48ef, 0x20ae, 0x20ae, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18af, 0x00f8, 0x0139, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18af, 0x0118, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0119, 0x00f8, 0x10cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xb8d1, 0xb0d1, 0xb0d2, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xc30f, 0x81b1, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd375, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd375, 0xd395, 0xd395, 0xd375, 0xd395, 0xd396, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0x9a12, 0x8191, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xdbd3, 0xfc8d, 0xfc6d, 0xfc6d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc8d, 0xfc6d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd375, 0xd395, 0xf42f, 0xfc6d, 0xfc6d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd375, 0xd395, 0xd376, 0xd395, 0xd395, 0xebf1, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc8d, 0xfc6d, 0xfc6d, 0xfc6d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfc8e, 0xfc8f, 0xfc8f, 0xfc8f, 0xfcb0, 0xfcb0, 0xfcb1, 0xfcb1, 0xf3b2, 0xb8d1, 0xb0f1, 0xb8d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x031f, 0x2d3b, 0x99b2, 0x454b, 0x07f3, 0x07fe, 0x5498, 0xb0f1, 0xa8f1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x30cf, 0x28cf, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18cd, 0x10d1, 0x08f3, 0x08d3, 0x10d1, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x00f8, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0x9a12, 0x8191, 0xc334, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfc8e, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfc8d, 0xfc8d, 0xfc8d, 0xe3ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb2f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xc30f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf44f, 0xfc8d, 0xfc8d, 0xfc8d, 0xcb6f, 0x8191, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec11, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xfc8d, 0xa250, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfc8e, 0xfc8f, 0xfcaf, 0xfcaf, 0xfcb0, 0xfcb0, 0xfcb0, 0xfcb2, 0xf451, 0xb0d1, 0xb0d1, 0xb0d1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x003f, 0x005f, 0x025f, 0x06fd, 0x0770, 0x0f88, 0x07f4, 0x07ff, 0x5478, 0xa8f1, 0xa8f1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f9, 0x0119, 0x0119, 0x00f7, 0x18ae, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cf, 0x0118, 0x0119, 0x00f7, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f7, 0x0119, 0x00f8, 0x18cf, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xb0f1, 0xb0d1, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xcb4e, 0x8191, 0xaa73, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xbb11, 0x8191, 0xaa73, 0xd396, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xdbb4, 0xfcae, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfcad, 0xfcad, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xdbd3, 0xfcad, 0xfccd, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfcad, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfccd, 0xdbee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd3, 0xfccd, 0xfccd, 0xfccd, 0xfccd, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf46f, 0xfcad, 0xfccd, 0xfccd, 0xc32f, 0x8991, 0xaa94, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec31, 0xfccd, 0xfccd, 0xfcad, 0xfccd, 0xfcad, 0xfcad, 0xfcad, 0xfcad, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfcce, 0xfccf, 0xfccf, 0xfcef, 0xfcd0, 0xfcf0, 0xfcf1, 0xfcf1, 0xfcf2, 0xb0f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x021f, 0x06fc, 0x078d, 0x07e7, 0x07f6, 0x07ff, 0x82b5, 0xa8f1, 0xa111, 0x4932, 0x4132, 0x4111, 0x38f1, 0x38f0, 0x30f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x08f5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08f4, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x10cf, 0x0118, 0x0119, 0x0117, 0x18ae, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd0d, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfd0d, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xc32f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec6f, 0x91d1, 0x89d1, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xdbb4, 0xec70, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xfced, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbf3, 0xfced, 0xfced, 0xfced, 0xe42e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfd0d, 0xfced, 0xec6e, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xf4af, 0xfd0d, 0xfced, 0xfd0d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf48f, 0xfced, 0xfced, 0xfced, 0xc34f, 0x8191, 0xaa93, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec51, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xfced, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd0e, 0xfd0f, 0xfd0f, 0xfd0f, 0xfd10, 0xfd10, 0xfd31, 0xfd31, 0xfd32, 0xb0f1, 0xb0f1, 0xb0f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x005f, 0x021f, 0x073b, 0x07ac, 0x07e7, 0x07f7, 0x07ff, 0x82b5, 0xa8f1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30f0, 0x30ef, 0x28cf, 0x28cf, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ae, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x10f3, 0x18ad, 0x18ad, 0x10f3, 0x0119, 0x0119, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x0117, 0x0119, 0x00f7, 0x18ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x208d, 0x18ad, 0x20ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18cd, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x10cf, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xb0f1, 0xa8f1, 0xb0f1, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xe44e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xc34f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4cf, 0xc34f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xe431, 0xec71, 0xec71, 0xdbf0, 0xe450, 0xf4cf, 0xfd0e, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdbd4, 0xf4af, 0xf4cf, 0xf4af, 0xdc10, 0x9a12, 0xaa73, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2c, 0xfd2c, 0x9211, 0x8191, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfcee, 0xfd2d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc10, 0xe44e, 0xdc2e, 0xe44e, 0xb2f0, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xfd2d, 0xa270, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd2e, 0xfd2f, 0xfd2f, 0xfd4f, 0xfd50, 0xfd50, 0xfd51, 0xfd51, 0xfd71, 0xa8f1, 0xb0f1, 0xb0f2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x023f, 0x073b, 0x07ab, 0x07e8, 0x07f9, 0x07ff, 0xa152, 0xa8f1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ce, 0x0119, 0x0119, 0x10d0, 0x18ad, 0x18ad, 0x18d0, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08f7, 0x18ad, 0x20ad, 0x18ad, 0x20cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa8f1, 0xa8f1, 0xa8f2, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xe46e, 0x8191, 0x9212, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xc36f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf4ef, 0xfd2d, 0x9211, 0x89b2, 0xcb75, 0xd396, 0xd375, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xcb95, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd4d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xbb2f, 0x8191, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec71, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xfd6d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfd6e, 0xfd6f, 0xfd6f, 0xfd8f, 0xfd90, 0xfd90, 0xfd91, 0xfd91, 0xfd92, 0xa8f1, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x005f, 0x007f, 0x009f, 0x023f, 0x0779, 0x07aa, 0x07e8, 0x07fb, 0x07ff, 0xa8f1, 0xa8f1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x0119, 0x0119, 0x10d3, 0x18ad, 0x18ad, 0x10d3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00f6, 0x20ae, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x0116, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0xa8f1, 0xa8f1, 0xa8f1, 0xec6f, 0xfd8d, 0xfdad, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xe48e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfdad, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xc38f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf52f, 0xfd8d, 0xe4ae, 0x8991, 0x9a32, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xe491, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfd8d, 0xfdad, 0xf52d, 0x8191, 0x91f2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xec91, 0xfd8d, 0xfd8d, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfdad, 0xfd8d, 0xa290, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdaf, 0xfdb0, 0xfdb0, 0xfdb1, 0xfdd1, 0xe4b2, 0xa911, 0xa8f1, 0xa8f1, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x02bf, 0x0778, 0x07c8, 0x07e9, 0x07fd, 0x173e, 0xa8f1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38f0, 0x30ef, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x08f4, 0x0119, 0x0119, 0x00f7, 0x08f6, 0x0119, 0x0119, 0x08f4, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x00f7, 0x0119, 0x0118, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18cd, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa911, 0xec8e, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xe4ce, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfded, 0xfdcd, 0xc3af, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf54f, 0xfded, 0xfdcd, 0xd44f, 0x8191, 0xb2b3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0x8991, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xfdcd, 0xbb6f, 0x8191, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecb1, 0xfded, 0xfded, 0xfdcd, 0xfdcd, 0xfded, 0xfded, 0xfded, 0xfded, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xfdee, 0xfdef, 0xfdef, 0xfdf0, 0xfdf0, 0xfdf0, 0xfdf1, 0xfdf1, 0xecb1, 0xa0f1, 0xa911, 0xa911, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x005f, 0x007f, 0x009f, 0x009f, 0x041f, 0x0797, 0x07c7, 0x07eb, 0x07fe, 0x2e5c, 0xa8f1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ae, 0x00f6, 0x0118, 0x0118, 0x0119, 0x0119, 0x00f6, 0x18ce, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f7, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0xa911, 0xa911, 0xa111, 0xe42e, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xe4ee, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xc3cf, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf56f, 0xfe0d, 0xfe0d, 0xfe0d, 0xd44f, 0x8191, 0xbad3, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xecd1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0d, 0xf5ad, 0x9a70, 0x89b1, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecd1, 0xfe0d, 0xfe0d, 0xfe0d, 0xfe0e, 0xfe0d, 0xfe0e, 0xfe0e, 0xfe0e, 0xa2b0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe0f, 0xfe0f, 0xfe0f, 0xfe30, 0xfe30, 0xfe30, 0xfe31, 0xfe31, 0xdc32, 0xa111, 0xa911, 0xa111, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x043f, 0x0794, 0x07e6, 0x07ec, 0x07fe, 0x35db, 0xa911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20ce, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x20ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0119, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x10d1, 0x10d3, 0x10f2, 0x10d1, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ae, 0x00f6, 0x0119, 0x00f8, 0x18cf, 0x20ad, 0x18ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x80f0, 0xa111, 0xa111, 0xc2b0, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8991, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xc3ef, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf58f, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xe50e, 0x89d1, 0xa253, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd376, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xf60e, 0x9a70, 0x91f2, 0xcb75, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf2, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xfe4d, 0xfe4e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe4e, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe50, 0xfe71, 0xfe51, 0xba52, 0xa111, 0xa111, 0x78d5, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x005f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x043f, 0x07b3, 0x07c5, 0x07ee, 0x07ff, 0x5478, 0x6ad6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0119, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f8, 0x18cf, 0x18ac, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x60ef, 0xa111, 0xa111, 0xa112, 0xfe2d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xe54e, 0x8191, 0x9a12, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xf5cf, 0xfe6d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe6d, 0xc40f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ce, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6c, 0xfe8d, 0xf62d, 0xc40f, 0x9a12, 0xb2d4, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xecf1, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed11, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe8d, 0xfe6d, 0xfe2d, 0xbbcf, 0x89b1, 0xbaf4, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd396, 0xc314, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xa2d0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfe90, 0xfe91, 0xe471, 0xa111, 0xa112, 0xa111, 0x60d5, 0x001f, 0x283c, 0x7097, 0x405a, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00bf, 0x00bf, 0x00df, 0x045f, 0x07d2, 0x07e4, 0x07ef, 0x07ff, 0x2e3c, 0x2d1a, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38f0, 0x30f0, 0x30ef, 0x28cf, 0x28ce, 0x28ce, 0x20ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x0119, 0x0118, 0x18ad, 0x18ac, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18cc, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x18ae, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x20ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x00f6, 0x0118, 0x00f7, 0x18cf, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x20ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x28cd, 0xa111, 0xa111, 0xa111, 0xcbcf, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xf5ed, 0x89d1, 0x91d2, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd396, 0xd395, 0xed11, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xc42f, 0x81b1, 0xaa93, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfecc, 0xfead, 0xc42f, 0x8191, 0xaa93, 0xd395, 0xd395, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xf5ef, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf64d, 0xd4ce, 0xbbd0, 0xc3b2, 0xc314, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xed12, 0x8191, 0x8191, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xd395, 0xd395, 0xed31, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xee0d, 0xcc6f, 0xbb51, 0xbad4, 0xcb55, 0xd395, 0xd395, 0xd395, 0xd395, 0xc334, 0x8191, 0xb294, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd375, 0xd395, 0xed11, 0xfeae, 0xfece, 0xfead, 0xfeae, 0xfead, 0xfece, 0xfeae, 0xfeae, 0xa2f0, 0x8191, 0xc314, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xd395, 0xdc34, 0xfeaf, 0xfed0, 0xfeaf, 0xfed0, 0xfeb0, 0xfed1, 0xe491, 0xa911, 0xa111, 0x9931, 0xa111, 0x58d6, 0x88b5, 0xb8d1, 0xb8d1, 0x5059, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x00df, 0x047f, 0x07d2, 0x07e3, 0x07f1, 0x07ff, 0x07ff, 0x2cba, 0x4933, 0x4132, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30f0, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x0118, 0x0118, 0x18ad, 0x18ad, 0x18ad, 0x20ad, 0x18cd, 0x20ad, 0x20ad, 0x18ac, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x00f6, 0x18ad, 0x18ad, 0x18ac, 0x20ac, 0x18ac, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x18ac, 0x18ad, 0x00f6, 0x0118, 0x0118, 0x18cf, 0x20ad, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x20ac, 0x20ad, 0x18ad, 0x8110, 0x9911, 0xa111, 0xa171, 0xf5ed, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe6d, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5cf, 0xf5ef, 0xf5cf, 0xfe4d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe4e, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ee, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe8d, 0xfeac, 0xfeac, 0xfeac, 0xfeac, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xf64d, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xfe6e, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xf60e, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5cf, 0xf64e, 0xfeac, 0xfead, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5ef, 0xf5ef, 0xf5ef, 0xf5cf, 0xfe4d, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe6d, 0xf5ef, 0xf5ef, 0xf5cf, 0xf5cf, 0xfead, 0xf62e, 0xf5ef, 0xf5d0, 0xf5ef, 0xf5cf, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5ef, 0xf5f0, 0xfe4f, 0xfece, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeaf, 0xf610, 0xf5d0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf5f0, 0xf610, 0xfeaf, 0xfeaf, 0xfeaf, 0xfed0, 0xfeb0, 0xfeb1, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x6933, 0xb0f1, 0xb0d1, 0xb0d1, 0x283c, 0x001f, 0x001f, 0x001f, 0x003f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x011f, 0x047f, 0x07d1, 0x07e3, 0x07f3, 0x07ff, 0x07ff, 0x3b77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38f0, 0x38f0, 0x30ef, 0x30ef, 0x28ef, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ac, 0x18ad, 0x0118, 0x0118, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ad, 0x20ad, 0x0118, 0x0118, 0x20ad, 0x20ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x20ac, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, 0x18ad, + 0x0118, 0x00f6, 0x18cd, 0x18ac, 0x18ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cc, 0x20ac, 0x18ad, 0x00f6, 0x0118, 0x0117, 0x18cf, 0x18ad, 0x18ac, 0x18ac, 0x18ad, 0x18ac, 0x20ad, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18cd, 0x18ac, 0x20ac, 0x38ce, 0x9931, 0x9931, 0x9931, 0xaa31, 0xfe2d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfeac, 0xfeac, 0xfead, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfead, 0xfe8c, 0xfe8c, 0xfead, 0xfead, 0xfeac, 0xfeac, 0xfe8c, 0xfe8c, 0xfeac, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfe8d, 0xfe8c, 0xfead, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfeac, 0xfe8c, 0xfeac, 0xfe8d, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfeac, 0xfe8d, 0xfe8c, 0xfead, 0xfead, 0xfe8c, 0xfe8c, 0xfe8c, 0xfead, 0xfe8c, 0xfeac, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8c, 0xfeac, 0xfe8d, 0xfeac, 0xfead, 0xfead, 0xfe8c, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfead, 0xfeac, 0xfe8c, 0xfead, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfead, 0xfead, 0xfead, 0xfead, 0xfe8d, 0xfe8e, 0xfead, 0xfeae, 0xfeae, 0xfead, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfeae, 0xfeae, 0xfeae, 0xfe8e, 0xfe8e, 0xfeae, 0xfeaf, 0xfeae, 0xfeae, 0xfeaf, 0xfe8e, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfeaf, 0xfe8f, 0xfeb0, 0xfeaf, 0xfeb0, 0xfe90, 0xe471, 0xb8d2, 0xa111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xb0f1, 0xb0d1, 0xb0d2, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x007f, 0x00df, 0x00df, 0x011f, 0x011f, 0x049f, 0x07f0, 0x07e2, 0x07f4, 0x07ff, 0x07ff, 0x3af6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ee, 0x28ce, 0x28ce, 0x20ce, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x20ad, 0x18ad, 0x0118, 0x0118, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ad, 0x18ad, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x00f8, 0x0118, 0x00f5, 0x18ad, 0x20ac, 0x18ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x18cd, 0x0116, 0x0118, 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x60ef, 0x9912, 0x9931, 0x9931, 0xb270, 0xf62d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe6d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8c, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8d, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8e, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xfeb0, 0xfeb0, 0xe471, 0xb8d1, 0xa111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xb0f1, 0xb0d1, 0x90b4, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x049f, 0x07f1, 0x07e2, 0x07f6, 0x07ff, 0x0f9f, 0x4a35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38f0, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28ce, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ad, 0x20ad, 0x0118, 0x0118, 0x18ce, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ad, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, + 0x18ce, 0x0117, 0x0118, 0x0115, 0x18ad, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ad, 0x00f6, 0x0118, 0x0117, 0x18ce, 0x18ac, 0x20cc, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x18cc, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x28ad, 0x8110, 0x9931, 0x9931, 0x9911, 0xaa31, 0xf5cd, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe8c, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe8e, 0xfe8d, 0xfe8d, 0xfe6e, 0xfe8d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe6f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe8f, 0xfe8f, 0xfe6f, 0xfe90, 0xfe8f, 0xfe8f, 0xfe90, 0xfe90, 0xe471, 0xb0d1, 0xa111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xb0d1, 0xb0d1, 0x7896, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x00bf, 0x011f, 0x011f, 0x013f, 0x017f, 0x04bf, 0x07f2, 0x07e2, 0x07f5, 0x07ff, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x00f5, 0x0117, 0x00f7, 0x18ce, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x18ae, 0x0117, 0x0118, 0x08f5, 0x18ad, 0x18ac, 0x18cd, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x08f3, 0x0118, 0x0117, 0x18ce, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x28ad, 0x9111, 0x9931, 0x9931, 0x9931, 0xa171, 0xcbcf, 0xf60d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6c, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6d, 0xfe6d, 0xfe6d, 0xfe4d, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6e, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe70, 0xfe70, 0xfe6f, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe90, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xe471, 0xa8f1, 0xa111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xb0d1, 0xb0d1, 0x5878, 0x001f, 0x001f, 0x003f, 0x007f, 0x009f, 0x00ff, 0x013f, 0x013f, 0x017f, 0x019f, 0x033f, 0x07f3, 0x07e2, 0x07f3, 0x07ff, 0xa8f1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30ef, 0x30ef, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ad, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ad, 0x20ac, 0x18ac, 0x18ad, 0x00f5, 0x0118, 0x0117, 0x18ce, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x18ac, 0x20ac, 0x18ce, 0x08f5, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0117, 0x00f7, 0x18ce, 0x20ac, 0x18cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x28cd, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xbab0, 0xdc6f, 0xe50f, 0xe50e, 0xfe4e, 0xfe6e, 0xfe4e, 0xfe6d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4d, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe4e, 0xfe4e, 0xfe6e, 0xfe6e, 0xfe4e, 0xfe6f, 0xfe6e, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe6f, 0xfe4f, 0xfe6f, 0xfe70, 0xfe50, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe70, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xfe71, 0xf612, 0xe531, 0xe512, 0xd472, 0xb271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xb0f1, 0xb0f1, 0x285c, 0x003f, 0x005f, 0x007f, 0x00bf, 0x00ff, 0x013f, 0x015f, 0x017f, 0x019f, 0x01bf, 0x02ff, 0x07f4, 0x07e3, 0x07f1, 0x2e5c, 0xa911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ad, 0x20ad, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x0118, 0x0118, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x18ad, 0x0115, 0x0118, 0x00f7, 0x18ae, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x10d0, 0x10d2, 0x08d2, 0x18ae, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, + 0x18ac, 0x20ac, 0x20ac, 0x18cd, 0x0116, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x18ce, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x28cc, 0x610f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xb0f1, 0xb0d1, 0x087f, 0x009f, 0x00bf, 0x00df, 0x011f, 0x015f, 0x019f, 0x019f, 0x019f, 0x01df, 0x01df, 0x01ff, 0x07f7, 0x07e3, 0x07ef, 0x5498, 0xa8f1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30ef, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x20cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x0117, 0x0117, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x18ad, 0x0115, 0x0117, 0x00f7, 0x18ae, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ad, 0x00f5, 0x0117, 0x0118, 0x0117, 0x0117, 0x08f3, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20cc, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, + 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x40ce, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xb0f1, 0x98f3, 0x00df, 0x00ff, 0x011f, 0x013f, 0x017f, 0x01bf, 0x01bf, 0x01df, 0x01df, 0x01ff, 0x01ff, 0x021f, 0x06d9, 0x07e5, 0x07ec, 0x7355, 0xa8f1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390f, 0x30ef, 0x30ee, 0x28ce, 0x28ce, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x0117, 0x00f7, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ad, 0x00f5, 0x0117, 0x0116, 0x18cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x00f5, 0x0117, 0x0118, 0x08f5, 0x0116, 0x0117, 0x0117, 0x10f2, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x18ac, 0x20ab, 0x20ac, 0x20ac, + 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x30cc, 0x58cf, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xa111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xa8f1, 0xb0f1, 0x80f5, 0x013f, 0x017f, 0x019f, 0x01bf, 0x01df, 0x01ff, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x023f, 0x057d, 0x07e8, 0x07e9, 0x82d5, 0xa0f1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38f0, 0x38ef, 0x30ef, 0x30ee, 0x28ce, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cd, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x00f7, 0x0117, 0x10d0, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18cd, 0x00f5, 0x0117, 0x08f5, 0x18ad, 0x20ac, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ad, 0x0117, 0x0117, 0x10d0, 0x20ac, 0x20ac, 0x08f3, 0x0117, 0x0115, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20cc, + 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ad, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ce, 0x28ee, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ee, 0x38ef, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xa932, 0xa131, 0xb131, 0xc912, 0xc911, 0xc8f2, 0xc8f2, 0xc8f2, 0xc8d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xc0d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0x5158, 0x01bf, 0x01df, 0x01ff, 0x021f, 0x023f, 0x023f, 0x021f, 0x023f, 0x025f, 0x025f, 0x025f, 0x025f, 0x041f, 0x07ed, 0x07e4, 0x7ab4, 0xa911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x10d0, 0x0117, 0x00f7, 0x10d0, 0x20ac, 0x20cc, 0x18ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x00f5, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x20ac, 0x20ac, 0x20ac, 0x10ef, 0x0117, 0x0117, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, + 0x20ac, 0x18ac, 0x18ac, 0x18cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28ad, 0x28ce, 0x30ce, 0x30ce, 0x30ee, 0x8151, 0xb192, 0xc9b3, 0xc9b2, 0xc992, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc932, 0xc912, 0xc912, 0xc111, 0xc8f1, 0xc8f1, 0xc8d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0d1, 0xb8b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d2, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x39bb, 0x021f, 0x023f, 0x025f, 0x027f, 0x027f, 0x025f, 0x025f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x029f, 0x07f3, 0x07e2, 0x9972, 0xa911, 0xa112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38ef, 0x30ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x08f2, 0x0117, 0x0116, 0x10d0, 0x20ac, 0x20ab, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ad, 0x00f4, 0x00f7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x18cf, 0x20ac, 0x20ac, 0x10d1, 0x00f7, 0x0115, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x18cc, 0x18ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x18ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30cd, 0x28ee, 0x30ee, 0x490e, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc912, 0xc912, 0xc0f2, 0xc8d1, 0xc0d1, 0xc0d1, 0xc8b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb0d1, 0xb8d2, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0f2, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0x123e, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x029f, 0x02bf, 0x02bf, 0x02bf, 0x029f, 0x029f, 0x02df, 0x06b9, 0x07e3, 0xa111, 0xa911, 0xa111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390f, 0x38ef, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x08d3, 0x0116, 0x0117, 0x10cf, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x18ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x00f4, 0x0117, 0x0116, 0x08f2, 0x08f2, 0x0117, 0x0116, 0x08f2, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x18ac, 0x20ac, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x30ed, 0x692f, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc132, 0xc912, 0xc912, 0xc8f2, 0xc8f1, 0xc8d1, 0xc0d1, 0xc0d1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xc0b1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0d1, 0xb8d1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0x9933, 0x02df, 0x02df, 0x02ff, 0x02ff, 0x02df, 0x02bf, 0x02df, 0x02df, 0x02df, 0x02df, 0x02df, 0x02bf, 0x02bf, 0x02ff, 0x051e, 0x07e8, 0xa912, 0xa111, 0xa111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410f, 0x390f, 0x38ee, 0x30ee, 0x30ee, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0117, 0x10d0, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x18cb, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ab, 0x20ab, 0x18ae, 0x0115, 0x0117, 0x0116, 0x0116, 0x0116, 0x00f4, 0x18cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b8, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ac, 0x20ac, 0x28ac, 0x20cc, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cd, 0x28ed, 0x28cd, 0x30cd, 0x9191, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc932, 0xc932, 0xc912, 0xc932, 0xc912, 0xc112, 0xc8f2, 0xc8f2, 0xc8d1, 0xc8d1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88b4, 0x88b5, 0x88b5, 0xb8d1, 0xb8d1, 0xb8d1, 0xb8d1, 0xb0f1, 0xb0f1, 0xb0d1, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x69d6, 0x033f, 0x033f, 0x033f, 0x031f, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02ff, 0x02df, 0x02ff, 0x035f, 0x03ff, 0x07f0, 0x8a4f, 0xa111, 0xa111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410f, 0x390f, 0x30ee, 0x30ee, 0x30cd, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0116, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20cc, 0x08d1, 0x08f3, 0x08f3, 0x10d0, 0x20ab, 0x20ac, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b8, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cc, 0x20ac, 0x28cc, 0x28cc, 0x28cc, 0x20cc, 0x28cc, 0x28cc, 0x28cd, 0x40ee, 0xa9b2, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b2, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc972, 0xc952, 0xc952, 0xc952, 0xc932, 0xc932, 0x90d5, 0x88d6, 0x6098, 0x5879, 0x303c, 0x305c, 0x081e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x291c, 0x411a, 0x6118, 0x8915, 0xb0d1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f1, 0xb0f2, 0xa8f1, 0xb0f1, 0x429a, 0x039f, 0x039f, 0x035f, 0x035f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x033f, 0x031f, 0x031f, 0x031f, 0x037f, 0x03ff, 0x06d7, 0x7acf, 0xa111, 0xa111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410f, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cd, 0x28cd, 0x28cc, 0x28cc, 0x20cc, 0x20cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0116, 0x0116, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x20ab, 0x20ab, 0x20ab, 0x20ab, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cd, 0x28cc, 0x490e, 0xc1d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc9b3, 0xc992, 0xc992, 0xc972, 0xc952, 0x98f5, 0x60b8, 0x407b, 0x183e, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x007f, 0x007f, 0x009f, 0x00bf, 0x00ff, 0x011f, 0x013f, 0x017f, 0x019f, 0x01df, 0x021f, 0x21fd, 0x49d9, 0x7996, 0xa112, 0xa8f1, 0xb0f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0x139e, 0x03df, 0x03bf, 0x039f, 0x039f, 0x037f, 0x037f, 0x037f, 0x037f, 0x035f, 0x035f, 0x033f, 0x033f, 0x035f, 0x03bf, 0x041f, 0x05de, 0x7ad1, 0xa111, 0xa111, 0xa111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40ef, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x08f2, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x18ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b8, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x692f, 0xc9f3, 0xc9d3, 0xc9d3, 0xc9b2, 0xc9b3, 0xc992, 0xc9b2, 0xc972, 0xb973, 0x80f7, 0x387b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01bf, 0x01ff, 0x023f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x2adc, 0x5a58, 0x8994, 0xa8f1, 0xa8f1, 0x81d4, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x03bf, 0x039f, 0x037f, 0x035f, 0x037f, 0x039f, 0x03ff, 0x047f, 0x04ff, 0x6375, 0xa112, 0xa111, 0xa111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390f, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x692e, 0xc9f3, 0xc9d2, 0xc9d3, 0xc9b3, 0xc9b3, 0xc992, 0xc993, 0x80f7, 0x389b, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x083c, 0x085b, 0x105b, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187a, 0x105b, 0x085d, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x003f, 0x005f, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x01bf, 0x01ff, 0x021f, 0x025f, 0x029f, 0x02df, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03df, 0x041f, 0x043f, 0x0c3f, 0x2bbc, 0x0c3f, 0x045f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03ff, 0x03ff, 0x03df, 0x03df, 0x03bf, 0x039f, 0x037f, 0x039f, 0x03df, 0x043f, 0x04bf, 0x053f, 0x5398, 0xa111, 0xa111, 0xa111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x08f1, 0x0115, 0x0115, 0x10ce, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x1378, 0x1378, 0x1358, 0x1358, 0x1378, 0x1378, 0x1358, 0x1378, 0x1358, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cb, 0x614e, 0xd1f3, 0xc9f3, 0xc9d3, 0xc9b2, 0xc9b3, 0xb173, 0x60d9, 0x081e, 0x003d, 0x083b, 0x1878, 0x1877, 0x28d2, 0x28d2, 0x40ee, 0x38ee, 0x390f, 0x390f, 0x390f, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4130, 0x38f3, 0x28b6, 0x189a, 0x003e, 0x001f, 0x001f, 0x003f, 0x005f, 0x005f, 0x007f, 0x00bf, 0x00df, 0x00ff, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x027f, 0x029f, 0x02ff, 0x033f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x047f, 0x04bf, 0x04df, 0x04df, 0x04bf, 0x04bf, 0x047f, 0x047f, 0x043f, 0x043f, 0x043f, 0x041f, 0x041f, 0x03ff, 0x03df, 0x03bf, 0x03bf, 0x03df, 0x043f, 0x047f, 0x04df, 0x057f, 0x3c1a, 0xa111, 0xa111, 0xa111, 0xa111, 0x5931, 0x4910, 0x4110, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0115, 0x10cf, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x3af9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3af9, 0x3af9, 0x3af9, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28cb, 0x20cb, 0x28ab, 0x692e, 0xc9d3, 0xc9d3, 0xc9d3, 0xc9b3, 0xb1b2, 0x58f3, 0x1895, 0x28b2, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x492f, 0x4930, 0x4910, 0x38f3, 0x20b8, 0x087d, 0x007f, 0x009f, 0x00df, 0x00ff, 0x011f, 0x015f, 0x017f, 0x019f, 0x01df, 0x021f, 0x025f, 0x02bf, 0x02df, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x04ff, 0x051f, 0x051f, 0x053f, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x047f, 0x047f, 0x045f, 0x045f, 0x043f, 0x041f, 0x03ff, 0x03df, 0x03ff, 0x043f, 0x045f, 0x04bf, 0x053f, 0x05bf, 0x2cdc, 0xa112, 0xa111, 0xa111, 0xa111, 0x7131, 0x4930, 0x4130, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x08f1, 0x0115, 0x0114, 0x10ce, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x625a, 0x625b, 0x5a5a, 0x5a5a, 0x625b, 0x20ca, 0x20aa, 0x20aa, 0x20aa, + 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28cb, 0x28cb, 0x612e, 0xc9f3, 0xc9d3, 0xc9d3, 0xb992, 0x692e, 0x28cc, 0x28ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x30ed, 0x38ed, 0x38ed, 0x390e, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x38ee, 0x40ee, 0x40ee, 0x390f, 0x390e, 0x410e, 0x40ef, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4910, 0x4910, 0x4930, 0x4113, 0x28f8, 0x08fe, 0x013f, 0x015f, 0x019f, 0x01df, 0x021f, 0x023f, 0x029f, 0x02bf, 0x031f, 0x035f, 0x039f, 0x03df, 0x041f, 0x045f, 0x049f, 0x04df, 0x051f, 0x053f, 0x057f, 0x059f, 0x057f, 0x055f, 0x053f, 0x04ff, 0x04ff, 0x04df, 0x04bf, 0x049f, 0x049f, 0x047f, 0x045f, 0x043f, 0x041f, 0x041f, 0x043f, 0x045f, 0x04bf, 0x04ff, 0x055f, 0x05df, 0x0e1f, 0xa111, 0xa111, 0xa111, 0xa112, 0x8931, 0x4930, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x0114, 0x10cf, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20cb, 0x10cf, 0x10ef, 0x10ef, 0x18ce, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x81db, 0x81dc, 0x81db, 0x81db, 0x81bc, 0x81bb, 0x81bc, 0x81dc, 0x81dc, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x20cb, 0x612e, 0xd1f3, 0xc9f3, 0xc1b2, 0x612e, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197a, 0x01de, 0x021f, 0x027f, 0x02bf, 0x02ff, 0x033f, 0x037f, 0x03bf, 0x03ff, 0x045f, 0x049f, 0x04df, 0x051f, 0x057f, 0x059f, 0x05df, 0x05df, 0x05df, 0x05bf, 0x059f, 0x055f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04bf, 0x047f, 0x045f, 0x043f, 0x043f, 0x047f, 0x04bf, 0x04ff, 0x053f, 0x05bf, 0x061f, 0x069f, 0x9972, 0xa111, 0xa111, 0xa111, 0xa111, 0x5130, 0x4910, 0x410f, 0x390f, 0x390e, 0x38ed, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x00f4, 0x18cc, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18cc, 0x00f3, 0x0115, 0x0114, 0x0115, 0x00f4, 0x00f2, 0x20cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0xa93d, 0xa93d, 0xa95c, 0xa93d, 0xa95c, 0xa95d, 0xa93c, 0xa95d, 0xa93d, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x510d, 0xd1f3, 0xc9d2, 0x816f, 0x30cc, 0x28ac, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4110, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31b6, 0x0a9d, 0x02ff, 0x035f, 0x039f, 0x03ff, 0x043f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x05bf, 0x05df, 0x061f, 0x063f, 0x063f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x047f, 0x047f, 0x047f, 0x049f, 0x04df, 0x053f, 0x057f, 0x05ff, 0x065f, 0x06df, 0x7a95, 0xa111, 0xa111, 0xa111, 0xa111, 0x6911, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x08f1, 0x0114, 0x0114, 0x18cd, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x08f2, 0x0115, 0x0114, 0x0115, 0x0114, 0x0115, 0x0114, 0x10ef, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0xc8be, 0xd0be, 0xc8be, 0xc8be, 0xd0be, 0xc8be, 0xd0be, 0xd0be, 0xc8be, + 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x40ec, 0xc1d2, 0xc1b3, 0x490d, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39d5, 0x131c, 0x041f, 0x047f, 0x04bf, 0x051f, 0x055f, 0x059f, 0x05df, 0x061f, 0x067f, 0x069f, 0x069f, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x04ff, 0x04df, 0x04bf, 0x04bf, 0x04bf, 0x04df, 0x051f, 0x057f, 0x05bf, 0x063f, 0x069f, 0x071f, 0x5438, 0xa111, 0xa111, 0xa111, 0xa111, 0x8111, 0x4930, 0x410f, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x08f1, 0x0115, 0x00f4, 0x18cc, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x18cc, 0x00f5, 0x0115, 0x00f4, 0x0115, 0x0115, 0x0114, 0x0115, 0x00f4, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, 0xf03f, + 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x30cb, 0xa992, 0xa9b1, 0x30cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3a15, 0x237b, 0x053f, 0x059f, 0x5358, 0x349b, 0x0e1f, 0x06bf, 0x06ff, 0x06ff, 0x06df, 0x06bf, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x057f, 0x055f, 0x051f, 0x04ff, 0x04df, 0x04df, 0x04ff, 0x051f, 0x055f, 0x059f, 0x05ff, 0x065f, 0x06df, 0x073f, 0x359b, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x4930, 0x4910, 0x412f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x00f3, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x0115, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ca, + 0x790f, 0x68ee, 0x50ed, 0x38cc, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x692f, 0x816f, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28cb, 0x28cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49d4, 0x243a, 0xa132, 0xa8f1, 0xa8f1, 0xa8f1, 0x8295, 0x8295, 0x5418, 0x351b, 0x06df, 0x069f, 0x067f, 0x065f, 0x063f, 0x05ff, 0x05ff, 0x05bf, 0x059f, 0x057f, 0x055f, 0x053f, 0x051f, 0x051f, 0x053f, 0x057f, 0x059f, 0x05df, 0x063f, 0x069f, 0x06ff, 0x077f, 0x0f5f, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0x6911, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x18cb, 0x00f2, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x00f5, 0x0114, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, + 0x8130, 0x8930, 0x8930, 0x8910, 0x8930, 0x790f, 0x690e, 0x48cd, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20cb, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28cb, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ee, 0x38ed, 0x38ed, 0x390e, 0x390e, 0x390e, 0x410e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xa8f1, 0xa911, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa8f1, 0xa172, 0x4c39, 0x2d5c, 0x069f, 0x065f, 0x063f, 0x061f, 0x05ff, 0x05df, 0x059f, 0x057f, 0x055f, 0x055f, 0x055f, 0x057f, 0x059f, 0x05df, 0x061f, 0x067f, 0x06df, 0x073f, 0x079f, 0x07df, 0x8254, 0xa111, 0xa131, 0xa111, 0x9911, 0x8131, 0x4910, 0x410f, 0x410e, 0x38ee, 0x38ed, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x08f2, 0x00f5, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x10f0, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, + 0x8930, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8910, 0x8130, 0x710f, 0x60ee, 0x48ed, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x390f, 0x410f, 0x410f, 0x410f, 0x412f, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xa111, 0xa8f1, 0xa8f1, 0xa8f1, 0xa8f1, 0xa911, 0xa111, 0xa911, 0xa0f1, 0x9972, 0x4419, 0x067f, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05bf, 0x059f, 0x059f, 0x05bf, 0x05bf, 0x05df, 0x061f, 0x065f, 0x06bf, 0x06ff, 0x075f, 0x07bf, 0x07ff, 0x5498, 0xa131, 0xa111, 0xa111, 0xa111, 0x9911, 0x4930, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20cc, 0x00f3, 0x00f4, 0x0114, 0x0114, 0x0114, 0x08f2, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, + 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x58ed, 0x48cc, 0x30cb, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x28cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cc, 0x30ec, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x390f, 0x410f, 0x410f, 0x490f, 0x412f, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xa8f1, 0xa8f1, 0xa911, 0xa8f1, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa111, 0x7a55, 0x34bb, 0x065f, 0x061f, 0x05ff, 0x05df, 0x05df, 0x05df, 0x05df, 0x05ff, 0x063f, 0x065f, 0x069f, 0x06df, 0x071f, 0x077f, 0x07bf, 0x07ff, 0x2e3c, 0x9911, 0xa111, 0xa111, 0x9931, 0x9931, 0x6910, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20cb, 0x10cf, 0x10d0, 0x10ef, 0x10ce, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, + 0x8910, 0x8910, 0x8910, 0x810f, 0x890f, 0x890f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x690f, 0x58ee, 0x40cd, 0x30cc, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xa911, 0xa8f1, 0xa911, 0xa911, 0xa911, 0xa911, 0xa8f1, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x62f6, 0x347b, 0x061f, 0x061f, 0x063f, 0x063f, 0x065f, 0x067f, 0x06bf, 0x071f, 0x073f, 0x079f, 0x07df, 0x07ff, 0x07ff, 0xa111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410f, 0x410e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x810f, 0x810f, 0x810f, 0x890f, 0x8910, 0x8910, 0x8110, 0x8110, 0x8110, 0x8110, 0x8910, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x810f, 0x710f, 0x50ed, 0x40cc, 0x28ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x38ee, 0x38ee, 0x390f, 0x410f, 0x410f, 0x410f, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xa911, 0xa911, 0xa911, 0xa911, 0xa111, 0xa911, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x91b3, 0x349b, 0x065f, 0x067f, 0x069f, 0x06bf, 0x06ff, 0x073f, 0x077f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0xa111, 0x9911, 0xa111, 0x9931, 0x9931, 0x4930, 0x410f, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x8910, 0x8910, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x810f, 0x710f, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xa111, 0xa911, 0xa111, 0xa111, 0xa911, 0xa112, 0xa111, 0xa911, 0xa111, 0xa112, 0xa0f1, 0xa111, 0xa111, 0xa111, 0x7a75, 0x15fd, 0x06bf, 0x06ff, 0x071f, 0x075f, 0x079f, 0x07bf, 0x07ff, 0x07ff, 0x07ff, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410f, 0x390e, 0x390e, 0x38ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x790f, 0x690e, 0x50ed, 0x38cc, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20ab, 0x28ab, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x40ee, 0x410f, 0x410f, 0x410f, 0x4130, 0x4930, 0x4930, 0x5931, 0x90f1, 0xa911, 0xa912, 0xa111, 0xa111, 0xa111, 0xa911, 0xa911, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0x9972, 0x353b, 0x071f, 0x073f, 0x077f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x2e3c, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410f, 0x410f, 0x38ee, 0x38ee, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8130, 0x8930, 0x8930, 0x790f, 0x690e, 0x50ed, 0x38cc, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x390e, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x8111, 0xa911, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0xa112, 0xa111, 0xa111, 0x4499, 0x077f, 0x079f, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x9931, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490f, 0x410f, 0x38ee, 0x30ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x90ef, 0x88ef, 0x80ef, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x60ee, 0x48ed, 0x38ec, 0x20aa, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x28ab, 0x28ab, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cc, 0x30cd, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x310e, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x412f, 0x4930, 0x4930, 0x7131, 0xa111, 0xa111, 0xa112, 0xa111, 0xa0f1, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa131, 0x6397, 0x07bf, 0x07df, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x7ad4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390f, 0x38ee, 0x38ee, 0x38ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x990f, 0x990f, 0x910f, 0x910f, 0x890f, 0x88ef, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x710f, 0x58ee, 0x48ed, 0x30cb, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ec, 0x30ed, 0x38ee, 0x30ed, 0x38ed, 0x390e, 0x38ee, 0x410e, 0x410f, 0x410f, 0x4930, 0x4930, 0x6931, 0xa111, 0xa111, 0xa112, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x6397, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x5c14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410f, 0x390e, 0x390e, 0x30ed, 0x30ed, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x910f, 0x98ef, 0x910f, 0x910f, 0x98ef, 0x990f, 0x910f, 0x890f, 0x88ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x8110, 0x8910, 0x8910, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710f, 0x58ed, 0x40ed, 0x30cb, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x30ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0x9931, 0x5498, 0x07ff, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x35f5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510f, 0x390e, 0x390e, 0x38ed, 0x30ed, 0x30cc, 0x30cc, 0x28cc, 0x28cb, 0x28cb, 0x28ab, 0x20cb, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x890f, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x88ef, 0x890f, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x890f, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x68ef, 0x50ed, 0x40cc, 0x28cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20cb, 0x28ab, 0x28cb, 0x20cb, 0x28ab, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30cd, 0x30ed, 0x30ed, 0x38ed, 0x38ee, 0x38ee, 0x390e, 0x410f, 0x410f, 0x412f, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xa111, 0xa111, 0xa111, 0xa131, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa111, 0xa111, 0x3d7a, 0x07ff, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390e, 0x38ee, 0x30ee, 0x30ed, 0x30cd, 0x30cc, 0x28cc, 0x28cc, 0x28cb, 0x28ab, 0x28ab, 0x20ab, 0x20ab, 0x20ca, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x18aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x78ee, 0x78ee, 0x80ee, 0x80ee, 0x80ee, 0x78ee, 0x80ee, 0x80ee, 0x80ef, 0x80ef, 0x80ef, 0x80ee, 0x80ef, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x8910, 0x8110, 0x8130, 0x8910, 0x810f, 0x8110, 0x810f, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x8110, 0x690f, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20cb, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20cb, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x18aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x28cb, 0x20ab, 0x20cb, 0x20cb, 0x28cb, 0x28cb, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x28cc, 0x30cc, 0x30ec, 0x30ed, 0x30ed, 0x30ed, 0x38ee, 0x38ee, 0x390e, 0x390e, 0x410f, 0x410f, 0x410f, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xa111, 0xa111, 0xa111, 0x9931, 0xa111, 0xa111, 0xa112, 0x9931, 0x9911, 0x9192, 0x1ebd, 0x07ff, 0x07ff, 0x07fe, 0x07f6, 0x7a71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410e, 0x38ee, 0x30ed, 0x30ed, 0x30ed, 0x28cc, 0x28cc, 0x28cb, 0x28cb, 0x20ab, 0x28ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ca, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x208a, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, + 0x78ee, 0x78ee, 0x78ee, 0x78ee, 0x80ee, 0x78ee, 0x78ee, 0x80ee, 0x80ee, 0x80ef, 0x80ef, 0x80ee, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810e, 0x810f, 0x80ef, 0x80ef, 0x80ef, 0x80ef, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x810f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x890f, 0x8110, 0x810f, 0x890f, 0x890f, 0x810f, 0x810f, 0x810f, 0x890f, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8130, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8910, 0x8910, 0x8130, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8130, 0x8930, 0x710f, 0x690e, 0x50ed, 0x38cc, 0x28ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20cb, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20aa, 0x20ca, 0x20aa, 0x20ab, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20aa, 0x20ab, 0x20aa, 0x20ab, 0x20ab, 0x20ac, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cc, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x20cd, 0x28cd, 0x28cd, 0x28cd, 0x28cd, 0x20cd, 0x28ce, 0x28ce, 0x28ce, 0x28ee, 0x28ce, 0x28ee, 0x30ee, 0x30ef, 0x30ef, 0x30ef, 0x390f, 0x390f, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xa111, 0xa111, 0xa111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07ff, 0x07ff, 0x07fd, 0x07f6, 0x5c32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390f, 0x30ef, 0x30ef, 0x30ee, 0x30ce, 0x28cd, 0x28ee, 0x28ed, 0x28cd, 0x20cd, 0x20ac, 0x20cd, 0x20cd, 0x20ad, 0x20cd, 0x20ad, 0x20cc, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20cd, 0x20ad, 0x18cc, 0x20cc, 0x20ac, 0x20cc, 0x20ad, 0x20cc, 0x20ac, 0x20ac, 0x20cc, 0x18cc, 0x18cc, 0x20cc, 0x20cc, 0x20cc, 0x20cc, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x20ac, 0x18ac, 0x20ac, 0x20ac, 0x20ac, 0x20cc, 0x18ac, 0x18ac, 0x20ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ac, 0x18ab, 0x18ab, 0x18ab, 0x18ac, 0x18ac, 0x18ac, 0x18ab, + 0x78d0, 0x78d0, 0x78d0, 0x78f0, 0x78f0, 0x78f1, 0x78f0, 0x78f0, 0x78f0, 0x78f1, 0x78f1, 0x80f0, 0x78f1, 0x78f0, 0x80f1, 0x80d1, 0x80f1, 0x80f1, 0x80f1, 0x80f1, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x80f0, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8111, 0x8111, 0x8111, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8911, 0x8110, 0x8110, 0x8111, 0x8110, 0x8911, 0x8911, 0x8911, 0x8111, 0x8911, 0x8911, 0x8910, 0x8911, 0x8911, 0x8911, 0x8911, 0x8111, 0x8131, 0x8131, 0x8931, 0x8911, 0x8911, 0x8911, 0x8911, 0x8931, 0x8911, 0x8131, 0x8131, 0x8931, 0x8130, 0x8131, 0x8911, 0x8931, 0x7931, 0x6111, 0x4911, 0x30d2, 0x18f2, 0x10f2, 0x18d2, 0x18d2, 0x10f2, 0x18d2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x20f2, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f2, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f3, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xa111, 0xa111, 0x9931, 0x9911, 0xa111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5c38, 0x07ff, 0x07fd, 0x07f6, 0x44f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20f3, 0x20f3, 0x2113, 0x1912, 0x18f2, 0x20f3, 0x18f2, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x10d2, 0x10d2, 0x10d2, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10b1, 0x10b1, 0x10b1, 0x10b1, 0x10d0, 0x10b0, 0x10d0, 0x10b0, 0x10b0, 0x10d0, 0x10b0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, + 0x0051, 0x0071, 0x0071, 0x0071, 0x0071, 0x0051, 0x0071, 0x0070, 0x0870, 0x0870, 0x0071, 0x0071, 0x0091, 0x0870, 0x0071, 0x0091, 0x0071, 0x0871, 0x0871, 0x0891, 0x0871, 0x0871, 0x0871, 0x0871, 0x0891, 0x0891, 0x0891, 0x0891, 0x0871, 0x0871, 0x0871, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0891, 0x0891, 0x0891, 0x0892, 0x0891, 0x0891, 0x08b1, 0x08b1, 0x08b1, 0x08b2, 0x10b2, 0x08b1, 0x08b2, 0x08b1, 0x08b2, 0x08b2, 0x08b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x08b2, 0x10b2, 0x10b2, 0x08b2, 0x08b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10b2, 0x10d2, 0x10d2, 0x10d2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x18d2, 0x18d2, 0x10f2, 0x18d2, 0x18d2, 0x10d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f2, 0x18f3, 0x18f3, 0x20f2, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x18f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2112, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x20f2, 0x20f3, 0x20f2, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x20f3, 0x2113, 0x28f3, 0x2113, 0x20f3, 0x2113, 0x28f3, 0x20f3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28f3, 0x28f3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28f3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28f3, 0x28f3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28f3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xa111, 0xa112, 0xa111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2e5c, 0x07fc, 0x07f6, 0x2e53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20f3, 0x2112, 0x20f3, 0x20d3, 0x1912, 0x18f2, 0x18f3, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x20f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18d2, 0x18d2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x18f2, 0x18f2, 0x18f2, 0x10f2, 0x10f2, 0x18f2, 0x18f2, 0x18d2, 0x18f2, 0x10f2, 0x18f2, 0x18d2, 0x10f2, 0x18f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10f2, 0x10f2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d2, 0x10d1, 0x10d1, 0x10d2, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10d1, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x10b0, 0x08b0, 0x10b0, 0x10b0, 0x08b0, 0x08b0, 0x10b0, 0x10d0, 0x08d0, 0x08b0, 0x08b0, 0x08b0, 0x08b0, + 0x0cdc, 0x0cdc, 0x0cdb, 0x0cdc, 0x0cfb, 0x0cdc, 0x14dc, 0x14fc, 0x0cdc, 0x14fc, 0x14dc, 0x0cfc, 0x0cfc, 0x14fc, 0x0cfc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x14fc, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x153c, 0x153c, 0x153c, 0x153c, 0x151c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x155c, 0x153c, 0x153c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x155c, 0x155c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x157c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x259c, 0x1dbc, 0x1d9d, 0x259d, 0x1d9c, 0x259c, 0x259c, 0x259c, 0x259c, 0x259c, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x1ddd, 0x25dd, 0x25dd, 0x25dd, 0x25bd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25dd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x25fd, 0x25fd, 0x25fd, 0x25fd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x2dfd, 0x25fd, 0x2dfe, 0x2dfd, 0x2dfd, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3e, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x365e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x365e, 0x365e, 0x2e5d, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e5e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3e, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3e, 0x2e3d, 0x2e3e, 0x2e3d, 0x363d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e3d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x2e1d, 0x361d, 0x361d, 0x361d, 0x361d, 0x361d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1d, 0x3e1e, 0x461e, 0x461d, 0x4dfe, 0x4dfd, 0x4e3e, 0x4dfe, 0x55dd, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7a74, 0x07fb, 0x07f6, 0x07f6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4cfb, 0x3dfe, 0x35dd, 0x35dd, 0x2ddd, 0x2ddd, 0x2ddd, 0x2ddd, 0x25dd, 0x25dd, 0x25bd, 0x25bd, 0x25dd, 0x25dd, 0x25bd, 0x25dc, 0x25bd, 0x25bd, 0x25bd, 0x1dbd, 0x25bc, 0x1dbd, 0x1dbd, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1dbc, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9d, 0x1d9c, 0x1d9c, 0x1dbc, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9c, 0x1d9d, 0x1d9c, 0x1d9d, 0x1d9c, 0x1d7c, 0x1d7c, 0x1d7d, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d7c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x157c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x1d5c, 0x155c, 0x155c, 0x155c, 0x1d5c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x153c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151b, 0x151b, 0x151b, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, 0x151c, + 0x0bfb, 0x0bfb, 0x0bfb, 0x0bfb, 0x0bfb, 0x0c1b, 0x0c1b, 0x0c1b, 0x0c1b, 0x141b, 0x141b, 0x145b, 0x14dc, 0x0cdb, 0x14bc, 0x143b, 0x141b, 0x0c1b, 0x0c1b, 0x141c, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143c, 0x143b, 0x145b, 0x151c, 0x0d1b, 0x151c, 0x145b, 0x143b, 0x145c, 0x143b, 0x145c, 0x1c5b, 0x143b, 0x145c, 0x145c, 0x145c, 0x145c, 0x145c, 0x145b, 0x145c, 0x145b, 0x145b, 0x1c5c, 0x145c, 0x147c, 0x147c, 0x147c, 0x145c, 0x1c7c, 0x1c5c, 0x147c, 0x147c, 0x1c7c, 0x1cdc, 0x1d5c, 0x155c, 0x1cbc, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7b, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x249c, 0x1c9c, 0x1d9d, 0x1d7c, 0x1cfc, 0x1c9c, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24dc, 0x24dc, 0x24dc, 0x253d, 0x25bd, 0x253d, 0x24dd, 0x24bc, 0x24bc, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24dd, 0x24fd, 0x24dc, 0x24dc, 0x24fd, 0x24fd, 0x24fc, 0x24dd, 0x24fd, 0x251c, 0x25fd, 0x255d, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fc, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x24fd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x251d, 0x24fd, 0x24fd, 0x251d, 0x2d1d, 0x24fd, 0x2cfd, 0x25bd, 0x25bd, 0x253c, 0x2cfc, 0x2d1d, 0x251d, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1c, 0x2d5d, 0x2dde, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2e1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d3d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2ddd, 0x2d5d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2d1d, 0x2d1d, 0x2cfd, 0x2cfd, 0x2cfd, 0x2dbd, 0x2dbd, 0x2cfd, 0x2d1d, 0x251c, 0x251c, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x2cfd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x34fd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3d1d, 0x451d, 0x451d, 0x451d, 0x4d1d, 0x4d1d, 0x553d, 0x91b3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa112, 0x9931, 0x9931, 0x5496, 0x07f7, 0x07f7, 0x8a13, 0xa111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34dd, 0x34dd, 0x2cdd, 0x2cdc, 0x2cdd, 0x2cbc, 0x24dc, 0x24bc, 0x24bc, 0x253c, 0x25bd, 0x253c, 0x24bc, 0x24bc, 0x24bc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x24bc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c7c, 0x1c9c, 0x1cdc, 0x1d7c, 0x1d5c, 0x1c9c, 0x1c9c, 0x1c7b, 0x1c7c, 0x1c9c, 0x1c7b, 0x1c9c, 0x1c9c, 0x1c9c, 0x1c7c, 0x1c9c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x147c, 0x147c, 0x147c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c7c, 0x1c5c, 0x1c9c, 0x153c, 0x155c, 0x14bc, 0x145b, 0x145b, 0x1c5c, 0x147b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145b, 0x145c, 0x145c, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x143b, 0x151c, 0x14fb, 0x14fc, 0x145b, 0x143b, 0x143b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, 0x141b, + 0x0a5a, 0x0a5a, 0x0a5a, 0x0a5a, 0x0a7a, 0x0a5a, 0x0afa, 0x0c1b, 0x0cbb, 0x0c9b, 0x0b9b, 0x0a9a, 0x125a, 0x0a7a, 0x0a7a, 0x0a7a, 0x0a7a, 0x127a, 0x127a, 0x0a7a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x127a, 0x129a, 0x129a, 0x129a, 0x133b, 0x145b, 0x0d1c, 0x149c, 0x131b, 0x129b, 0x129b, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129b, 0x129a, 0x129b, 0x129b, 0x129b, 0x129b, 0x129b, 0x129b, 0x129a, 0x129b, 0x1abb, 0x129b, 0x131b, 0x147c, 0x153b, 0x145c, 0x12fb, 0x1abb, 0x12ba, 0x1abb, 0x1abb, 0x12bb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1b3b, 0x1cfc, 0x157c, 0x1c1c, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x22db, 0x22fb, 0x231c, 0x1d1c, 0x1d5c, 0x235b, 0x22dc, 0x22db, 0x22dc, 0x22fb, 0x22fc, 0x22dc, 0x22dc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fb, 0x22fb, 0x22fb, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231b, 0x22fc, 0x233c, 0x253c, 0x1cfd, 0x22fc, 0x22fc, 0x22fb, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x22fc, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x2afc, 0x2afc, 0x231c, 0x2b1c, 0x2b1c, 0x259c, 0x247c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x231c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x25bd, 0x2bbc, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x25dd, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b7c, 0x259d, 0x2b1c, 0x2b1c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x231c, 0x245d, 0x259c, 0x22fc, 0x2afc, 0x231c, 0x2afc, 0x22fc, 0x231c, 0x231c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2b1c, 0x2afc, 0x2b1c, 0x2b1c, 0x2b1c, 0x331c, 0x331c, 0x331c, 0x331c, 0x331c, 0x3b1c, 0x3b3d, 0x3b3d, 0x3b3d, 0x433c, 0x433d, 0x4b3d, 0x435d, 0x5a9a, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07f9, 0x72d4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331c, 0x32fc, 0x2afb, 0x2afc, 0x2afb, 0x22fb, 0x22dc, 0x22dc, 0x22fb, 0x22db, 0x22db, 0x235c, 0x1d5c, 0x1d1d, 0x231b, 0x1adb, 0x1adb, 0x1adb, 0x22db, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1adb, 0x1abb, 0x1abb, 0x1abb, 0x1adb, 0x1bfc, 0x1d5c, 0x14dc, 0x1b3b, 0x1abb, 0x1adb, 0x1abb, 0x1abb, 0x12db, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x1abb, 0x129b, 0x12bb, 0x129a, 0x12ba, 0x129a, 0x12db, 0x143b, 0x151b, 0x14bb, 0x1afb, 0x12ba, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x129a, 0x127a, 0x127a, 0x127a, 0x131b, 0x147c, 0x14db, 0x145b, 0x131a, 0x127a, 0x127a, 0x127a, 0x127a, + 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b5a, 0x0c1b, 0x0c9b, 0x0c9b, 0x0bba, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3b, 0x0b3a, 0x0b3a, 0x0b3b, 0x133b, 0x0b3b, 0x0b3b, 0x0b3b, 0x133a, 0x0b3a, 0x0c3b, 0x14dc, 0x14bc, 0x13fb, 0x0b3a, 0x133b, 0x133b, 0x133b, 0x135b, 0x0b5b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x135b, 0x0b5a, 0x135b, 0x135b, 0x135b, 0x135b, 0x0b5b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x13fb, 0x151c, 0x14fc, 0x13db, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x137b, 0x1b5b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x14fb, 0x153c, 0x13fb, 0x1b7b, 0x139b, 0x1b7b, 0x1b7c, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1b9b, 0x1b9b, 0x139c, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1b9b, 0x1d3c, 0x1d5c, 0x1bfb, 0x1b9c, 0x1bbb, 0x1b9b, 0x1bbc, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbc, 0x1bbb, 0x1cdc, 0x1d7d, 0x23fc, 0x1bdc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x1bbc, 0x1bbc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x247c, 0x1d9c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x241c, 0x259d, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x1dbd, 0x243c, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x259c, 0x247c, 0x23bc, 0x23bc, 0x23dc, 0x23bc, 0x23dc, 0x23dc, 0x23bc, 0x23bc, 0x23bc, 0x23dc, 0x23dc, 0x23dc, 0x23dc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x2bdc, 0x33dc, 0x33dc, 0x33dc, 0x33dc, 0x3bdc, 0x3bfc, 0x3bfc, 0x3bdc, 0x43fc, 0x43fd, 0x6b18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6b53, 0x07fa, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbb, 0x23bb, 0x23bb, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bdb, 0x1d5c, 0x1d1c, 0x1b9b, 0x1b9b, 0x139b, 0x139c, 0x1b9b, 0x1b7b, 0x1b7b, 0x139b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b9b, 0x139b, 0x1b7b, 0x1b7b, 0x1b9b, 0x1b9b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b9b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x139b, 0x1bbb, 0x151c, 0x151c, 0x13db, 0x137b, 0x137b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x13da, 0x14fb, 0x0cfb, 0x141b, 0x133a, 0x135b, 0x133b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x0b5b, 0x133b, 0x133a, 0x0b3a, 0x133a, 0x133a, 0x0b3b, 0x0b3b, 0x0b3b, 0x0b3a, 0x133a, 0x0b1a, 0x0b3b, 0x0b3a, 0x0bda, 0x14bb, 0x0cbb, 0x0c1b, 0x0b3a, 0x0b3b, 0x0b3a, + 0x0bdb, 0x0c7b, 0x0c7b, 0x0c1a, 0x0b3a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c1b, 0x0cbb, 0x0c9b, 0x0bbb, 0x0b5a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x0b3a, 0x133b, 0x0b3a, 0x133a, 0x0b3a, 0x133a, 0x0b3a, 0x135a, 0x133a, 0x133b, 0x133a, 0x133b, 0x0b3a, 0x0c7b, 0x0cfb, 0x147b, 0x137b, 0x0b5b, 0x0b5b, 0x135a, 0x135a, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x137b, 0x135a, 0x135a, 0x137b, 0x135a, 0x135b, 0x139b, 0x14bb, 0x14fb, 0x13fb, 0x137b, 0x137b, 0x135b, 0x137b, 0x137a, 0x137a, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x1bbb, 0x153c, 0x151c, 0x1b7b, 0x139b, 0x137b, 0x139b, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x13bb, 0x139b, 0x1b9b, 0x139b, 0x1b9b, 0x1b9b, 0x1b9c, 0x1c3b, 0x1d5c, 0x1c3c, 0x1b9b, 0x1bbb, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbb, 0x1bbb, 0x1c9c, 0x1d1c, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bdb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1cfc, 0x1c7c, 0x1bbb, 0x1bdb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bdc, 0x23bc, 0x1bbb, 0x1d7c, 0x1bbb, 0x1bdc, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1b9c, 0x1bdc, 0x1bbb, 0x1c5b, 0x1cfb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbb, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbb, 0x1bbb, 0x1bbb, 0x1b9b, 0x1d3c, 0x1cbc, 0x1bbb, 0x1bbb, 0x1b9b, 0x1b9c, 0x1b9c, 0x1b9b, 0x1b9b, 0x1bbb, 0x1b9c, 0x1b9b, 0x1bbb, 0x239b, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x23bc, 0x2bbc, 0x2bbc, 0x2bbc, 0x2bbc, 0x33bc, 0x33bc, 0x33dc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4c98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4b19, 0x23bc, 0x239b, 0x239b, 0x239b, 0x1b9b, 0x1b9b, 0x1b9b, 0x1b7b, 0x1b7b, 0x1b7b, 0x1b7b, 0x137b, 0x137b, 0x137b, 0x14bb, 0x151b, 0x13db, 0x137b, 0x137a, 0x137b, 0x137b, 0x137a, 0x137b, 0x137b, 0x137b, 0x135b, 0x137b, 0x135b, 0x135b, 0x135b, 0x137b, 0x137b, 0x137b, 0x137b, 0x137b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x135a, 0x13bb, 0x14db, 0x14bb, 0x137b, 0x135a, 0x135b, 0x0b5a, 0x135b, 0x135b, 0x135a, 0x0b5a, 0x135a, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x0b5a, 0x0b5a, 0x135a, 0x133a, 0x135a, 0x133a, 0x0b3a, 0x133b, 0x133a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0c5b, 0x0cbb, 0x0c5b, 0x0b7a, 0x0b3a, 0x0b3b, 0x0b1a, 0x133b, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b9a, 0x0c9b, 0x0c9b, + 0x0bda, 0x02f9, 0x01f9, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0178, 0x0178, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0178, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a1a, 0x0b1a, 0x0c3a, 0x0c1b, 0x0ada, 0x09f9, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x09f9, 0x0b1a, 0x0c7b, 0x0c1b, 0x0aba, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11ba, 0x11ba, 0x11b9, 0x09b9, 0x11ba, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x11da, 0x0b3a, 0x0c9b, 0x0bfb, 0x127a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x12ba, 0x14bb, 0x13fb, 0x11db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11bb, 0x11ba, 0x11da, 0x11ba, 0x11da, 0x11ba, 0x11ba, 0x11da, 0x11ba, 0x127a, 0x14db, 0x137b, 0x11da, 0x19ba, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x11db, 0x19db, 0x11da, 0x19da, 0x1a3b, 0x14fb, 0x1afb, 0x19da, 0x11db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19db, 0x19da, 0x1a1b, 0x153c, 0x1a3b, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19db, 0x19db, 0x19da, 0x19db, 0x153b, 0x19db, 0x19da, 0x19db, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x19da, 0x11db, 0x19db, 0x19da, 0x19db, 0x19fb, 0x153c, 0x123a, 0x19da, 0x19da, 0x11da, 0x11da, 0x11da, 0x11da, 0x11da, 0x19da, 0x11db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x19db, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x19db, 0x19ba, 0x11da, 0x11ba, 0x1abb, 0x14fb, 0x1a5b, 0x19ba, 0x19ba, 0x11da, 0x11da, 0x19db, 0x19db, 0x19da, 0x19db, 0x19ba, 0x19da, 0x19da, 0x19db, 0x19db, 0x19db, 0x21db, 0x21db, 0x21db, 0x21fb, 0x21fb, 0x29fb, 0x29fb, 0x29fb, 0x29fb, 0x31fb, 0x321b, 0x31fb, 0x321b, 0x41fa, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72d4, 0x4c98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21db, 0x21da, 0x19da, 0x19da, 0x19da, 0x11da, 0x11da, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11d9, 0x137a, 0x149b, 0x131a, 0x11ba, 0x119a, 0x11b9, 0x11ba, 0x11ba, 0x119a, 0x11ba, 0x119a, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x11ba, 0x0999, 0x1199, 0x1199, 0x1199, 0x1199, 0x11ba, 0x11ba, 0x1199, 0x0999, 0x09b9, 0x0999, 0x0a1a, 0x0bfb, 0x0c9b, 0x131a, 0x09da, 0x119a, 0x0999, 0x0999, 0x0999, 0x1199, 0x099a, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0aba, 0x0bda, 0x0c5b, 0x0b3a, 0x09f9, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0979, 0x0979, 0x0979, 0x0999, 0x0979, 0x0999, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0178, 0x0199, 0x0179, 0x0979, 0x0999, 0x02b9, + 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02d9, 0x02d9, 0x02b9, 0x0ab9, 0x0ad9, 0x02d9, 0x0ad9, 0x0ab9, 0x0ab9, 0x03ba, 0x043a, 0x043a, 0x0359, 0x02d9, 0x0ad9, 0x02d9, 0x0ad9, 0x02d9, 0x02d9, 0x0ad9, 0x0ad9, 0x0ad9, 0x02d9, 0x0ad9, 0x02d9, 0x02d9, 0x0ada, 0x0afa, 0x02fa, 0x02fa, 0x02d9, 0x02fa, 0x0ada, 0x0afa, 0x02fa, 0x0afa, 0x0afa, 0x0ad9, 0x0afa, 0x0ada, 0x0afa, 0x0b5a, 0x0c5b, 0x047a, 0x0bba, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0c3a, 0x0c9a, 0x0bda, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bdb, 0x14bb, 0x0bfa, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0b3a, 0x131a, 0x0b3a, 0x0b1a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133b, 0x133b, 0x133a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x0b3a, 0x133a, 0x0b3a, 0x137a, 0x0cdb, 0x0c5b, 0x133b, 0x133b, 0x0b3a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x135b, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x135a, 0x0b5b, 0x133b, 0x143a, 0x147b, 0x135b, 0x135a, 0x133b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x13bb, 0x14db, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135b, 0x133b, 0x14fb, 0x135a, 0x135b, 0x135a, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x135a, 0x133a, 0x135b, 0x135a, 0x135b, 0x135b, 0x149b, 0x13fb, 0x133a, 0x135b, 0x135b, 0x135a, 0x135a, 0x135a, 0x135b, 0x135b, 0x135b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133b, 0x133a, 0x133b, 0x133a, 0x135a, 0x133a, 0x143b, 0x147b, 0x133a, 0x133a, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133b, 0x133a, 0x133a, 0x133a, 0x135b, 0x133b, 0x133b, 0x1b3b, 0x1b5b, 0x1b5b, 0x1b3b, 0x1b5b, 0x235b, 0x235b, 0x235b, 0x235b, 0x2b5b, 0x2b5b, 0x2b7b, 0x2b7b, 0x335b, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72d5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71b4, 0x1b3b, 0x1b3b, 0x133a, 0x133b, 0x133a, 0x131a, 0x131a, 0x131a, 0x131a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0afa, 0x0b1a, 0x0afa, 0x0bda, 0x0cbb, 0x0bda, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0bba, 0x049b, 0x0c3a, 0x0b3a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x0ada, 0x0ada, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02da, 0x0ada, 0x0ada, 0x0ada, 0x02d9, 0x02d9, 0x02da, 0x02fa, 0x02d9, 0x0ad9, 0x0ad9, 0x0b5a, 0x045a, 0x045a, 0x033a, 0x0ad9, 0x02d9, 0x02d9, 0x02da, 0x0ada, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ab9, 0x0ab9, 0x02d9, 0x02d9, 0x0ab9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ab9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x0ab9, + 0x0299, 0x0299, 0x0298, 0x0298, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02b8, 0x02b9, 0x0299, 0x02b8, 0x039a, 0x041a, 0x03fa, 0x0339, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x03ba, 0x043a, 0x03fa, 0x02f9, 0x02d9, 0x02d9, 0x0ab9, 0x0ab9, 0x02d9, 0x02b9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ad9, 0x0ad9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f9, 0x02d9, 0x02da, 0x0ada, 0x0afa, 0x0bfa, 0x0c5b, 0x0bfa, 0x0ad9, 0x02fa, 0x02f9, 0x02f9, 0x0af9, 0x02f9, 0x0af9, 0x02d9, 0x02f9, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0af9, 0x0afa, 0x0afa, 0x0afa, 0x0c1a, 0x0c7b, 0x0b5a, 0x0afa, 0x0af9, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0b1a, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x031a, 0x0afa, 0x0b1a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0afa, 0x0c3a, 0x0c5a, 0x0b1a, 0x0afa, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0c5b, 0x0c1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b3a, 0x0c7b, 0x0b7a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0cbb, 0x0b1a, 0x0b3a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b7a, 0x0cbb, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0bda, 0x0c7b, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x0b1a, 0x131a, 0x131a, 0x131a, 0x131a, 0x131a, 0x1b1a, 0x1b3a, 0x1b3a, 0x1b3a, 0x1b3a, 0x233a, 0x233a, 0x233b, 0x2b3b, 0x2b5b, 0x3ad9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1b1a, 0x131a, 0x131a, 0x12fa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x0afa, 0x02fa, 0x0afa, 0x035a, 0x045a, 0x0c3a, 0x0afa, 0x02da, 0x0afa, 0x0af9, 0x02f9, 0x0afa, 0x0afa, 0x0afa, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x0ad9, 0x02d9, 0x02da, 0x0ad9, 0x0ad9, 0x02ba, 0x02d9, 0x039a, 0x043a, 0x03da, 0x02d9, 0x0ab9, 0x02d9, 0x0ab9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02b9, 0x0ab9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x02b9, 0x02d9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02d9, 0x03fa, 0x041a, 0x03b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x0299, 0x02b9, 0x02b9, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02b8, 0x02b8, + 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0198, 0x02b8, 0x0399, 0x0359, 0x0258, 0x0198, 0x0137, 0x0137, 0x0117, 0x0158, 0x0137, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0158, 0x0259, 0x0399, 0x0399, 0x0258, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0158, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03b9, 0x03da, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01b9, 0x037a, 0x0bda, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033a, 0x041a, 0x01f9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0a79, 0x043a, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09b9, 0x0c3b, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0c7a, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0bfa, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0bda, 0x02d9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199a, 0x1999, 0x2199, 0x219a, 0x21ba, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01d8, 0x0399, 0x0399, 0x01d9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0157, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0218, 0x0379, 0x03b9, 0x0258, 0x0158, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0137, 0x0238, 0x0359, 0x0399, 0x0298, 0x0178, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, + 0x0116, 0x0116, 0x0116, 0x00f7, 0x00f6, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0238, 0x0318, 0x0379, 0x0297, 0x0197, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0177, 0x02d8, 0x0399, 0x0318, 0x01d7, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01d8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03d9, 0x02b9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01d9, 0x03f9, 0x01f9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02d9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041a, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02b9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01d8, 0x03f9, 0x01f8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03f9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0138, 0x0117, 0x0137, 0x0238, 0x0379, 0x0379, 0x0238, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0136, 0x0117, 0x0117, 0x0117, 0x0136, 0x0137, 0x01b7, 0x02b8, 0x0399, 0x02b8, 0x0197, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x0116, 0x00f6, 0x0116, 0x01b7, 0x02b7, 0x0378, 0x02b7, 0x01d6, 0x0116, 0x00f7, 0x00f6, 0x0116, 0x00f6, 0x0116, 0x0116, 0x00f6, 0x00f6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0136, 0x0197, 0x02f8, 0x0378, 0x0297, 0x0177, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0116, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01d7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01d7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02f8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03b9, 0x01b8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03f9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03f9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03b9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01b7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x00f7, 0x0217, 0x0339, 0x02f8, 0x0197, 0x0136, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0156, 0x0237, 0x0358, 0x02d8, 0x01f7, 0x0116, 0x00f6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x00f6, 0x00f6, 0x0116, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x0116, + 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x02b7, 0x0297, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x0318, 0x0357, 0x0338, 0x02d7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b8, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b8, 0x02b8, 0x02b7, 0x0317, 0x0358, 0x0338, 0x02f7, 0x02d7, 0x02b7, 0x02b7, 0x02b7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02f7, 0x0358, 0x0378, 0x02f7, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d7, 0x02f8, 0x02f8, 0x0398, 0x0378, 0x02f8, 0x02d8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0398, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f7, 0x02f8, 0x02f8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03b8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03b8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x0318, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x0318, 0x02f8, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0318, 0x0318, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0378, 0x0338, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0af8, 0x0af8, 0x0af8, 0x0af8, 0x0b18, 0x0b18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1b18, 0x2af8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0af8, 0x0af8, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d8, 0x02d7, 0x02d8, 0x02d8, 0x0378, 0x0378, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d8, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02d7, 0x02b7, 0x02d7, 0x02d7, 0x02d7, 0x02b7, 0x02b7, 0x02f7, 0x0358, 0x0358, 0x02f7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02d7, 0x0338, 0x0357, 0x02f7, 0x0297, 0x0297, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x0297, 0x0297, 0x0297, 0x02b7, 0x0297, 0x0297, 0x02b7, 0x0297, + 0x0175, 0x0155, 0x0155, 0x0156, 0x0175, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x01b6, 0x0257, 0x02f7, 0x02d7, 0x0216, 0x0176, 0x0155, 0x0175, 0x0156, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0176, 0x0155, 0x0176, 0x0176, 0x0176, 0x0175, 0x0176, 0x0175, 0x0156, 0x0176, 0x0176, 0x0176, 0x0155, 0x01b6, 0x0296, 0x0337, 0x0296, 0x01d6, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0196, 0x0176, 0x01b6, 0x02f8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01f7, 0x0337, 0x02d7, 0x01b6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01b6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x02f7, 0x0257, 0x0197, 0x01b6, 0x01b7, 0x01b6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b7, 0x01b6, 0x01b7, 0x0378, 0x01b7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01b6, 0x01f7, 0x0358, 0x0196, 0x0196, 0x01b6, 0x0196, 0x01b6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02f7, 0x02f7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01b6, 0x01b6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09b7, 0x0997, 0x09b7, 0x09b7, 0x09b7, 0x11b7, 0x11b7, 0x11d7, 0x11b7, 0x11b7, 0x11b7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09b6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02b7, 0x0337, 0x0216, 0x0196, 0x0196, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0196, 0x0195, 0x0216, 0x02f7, 0x0317, 0x0216, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0175, 0x0176, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0175, 0x0155, 0x0196, 0x0256, 0x0317, 0x02b7, 0x01b6, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0155, 0x0155, 0x0175, 0x0155, 0x0155, 0x0155, + 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b4, 0x00d3, 0x00d3, 0x00b4, 0x00d4, 0x0174, 0x0235, 0x02d6, 0x0235, 0x0174, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x0135, 0x0235, 0x02d6, 0x0236, 0x0134, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d4, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x0115, 0x0236, 0x0317, 0x0256, 0x00f4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x01f6, 0x0317, 0x01f6, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00f5, 0x01b6, 0x0337, 0x01b6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x0155, 0x0337, 0x0156, 0x00d5, 0x00d5, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00d6, 0x00d6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00d5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x0115, 0x0338, 0x0115, 0x00f6, 0x00f5, 0x00f6, 0x00f5, 0x00d6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f6, 0x00d5, 0x00f5, 0x0357, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f6, 0x00f5, 0x00d5, 0x00d5, 0x00d6, 0x00d6, 0x00d5, 0x00f5, 0x02f7, 0x0176, 0x00f5, 0x00d5, 0x00f5, 0x00f6, 0x00f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00f5, 0x00d5, 0x0116, 0x02f7, 0x01d6, 0x00d6, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00f5, 0x00d5, 0x00d5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x08f6, 0x08f6, 0x08f6, 0x08f6, 0x0916, 0x0916, 0x10f6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08f5, 0x08f6, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x01d6, 0x02f7, 0x0236, 0x0114, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d5, 0x00d4, 0x00d5, 0x00d4, 0x00d5, 0x00d5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00f4, 0x01d5, 0x02d6, 0x0236, 0x0114, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x0114, 0x01f5, 0x02b5, 0x0235, 0x0154, 0x00d3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, + 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x01d3, 0x0253, 0x0234, 0x0173, 0x00d2, 0x0092, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b2, 0x0153, 0x0234, 0x0274, 0x01b3, 0x00f3, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x01b4, 0x02b5, 0x01f4, 0x0113, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00d3, 0x00b3, 0x00d3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00b3, 0x00d4, 0x00b3, 0x00d3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00d3, 0x00b3, 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x01d4, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00f4, 0x02b5, 0x01b5, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01b5, 0x0255, 0x00d5, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x02f6, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x01f5, 0x0235, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00b4, 0x0154, 0x02b5, 0x0134, 0x00d4, 0x00b4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00b4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x08d4, 0x08d4, 0x08d4, 0x08f4, 0x08f4, 0x08f4, 0x08f5, 0x10f4, 0x10d5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00d4, 0x00d4, 0x00d4, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00b3, 0x00d3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00d3, 0x00d3, 0x0214, 0x0295, 0x0153, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00d2, 0x01b3, 0x0274, 0x01d3, 0x00f2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0092, 0x00b2, 0x00b1, 0x0172, 0x0253, 0x0233, 0x0152, 0x00b1, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, + 0x0090, 0x0090, 0x0090, 0x00b0, 0x0151, 0x0212, 0x0232, 0x0191, 0x00f0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0090, 0x0091, 0x00b1, 0x0171, 0x0232, 0x0213, 0x0151, 0x0090, 0x00b0, 0x0090, 0x0091, 0x00b1, 0x00b0, 0x0090, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x00d1, 0x0172, 0x0253, 0x01b2, 0x00d1, 0x00b1, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00d2, 0x01b2, 0x0273, 0x0172, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x01d3, 0x0253, 0x0112, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0213, 0x01d3, 0x0092, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0253, 0x0153, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x0294, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00f2, 0x0293, 0x00d2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b2, 0x0172, 0x0253, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x08b2, 0x08b2, 0x08b2, 0x08d2, 0x08b2, 0x08d2, 0x08d3, 0x10d3, 0x40f2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00d2, 0x00b2, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0131, 0x0252, 0x01f2, 0x00b1, 0x00b1, 0x00b1, 0x0091, 0x0091, 0x00b1, 0x0091, 0x0091, 0x00b0, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x00b1, 0x0090, 0x00b0, 0x0091, 0x00b0, 0x01b2, 0x0252, 0x01b1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x01d1, 0x0232, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x008f, 0x0130, 0x01b1, 0x0232, 0x01b1, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00d0, 0x0191, 0x0232, 0x01d1, 0x00f0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0171, 0x0232, 0x01d1, 0x00f1, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01d1, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01d2, 0x01f2, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0171, 0x0212, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x00f1, 0x0252, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0272, 0x00b0, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x0171, 0x0091, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01d1, 0x01d1, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x08b1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01b1, 0x0252, 0x0131, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01b1, 0x0232, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0252, 0x01b1, 0x0110, 0x0090, 0x0090, 0x0090, + 0x0212, 0x01f1, 0x0150, 0x00af, 0x008f, 0x008f, 0x006f, 0x0090, 0x0090, 0x0070, 0x006f, 0x006f, 0x008f, 0x008f, 0x0070, 0x0070, 0x006f, 0x008f, 0x006f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x006f, 0x008f, 0x008f, 0x008f, 0x0130, 0x01d1, 0x0212, 0x0191, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x0151, 0x0211, 0x01d1, 0x00f0, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f2, 0x01d1, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01b1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x01f1, 0x0171, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00b0, 0x00b0, 0x00b1, 0x08b1, 0x08b0, 0x08b1, 0x08b1, 0x50f1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f1, 0x0211, 0x01d2, 0x00d0, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x00b0, 0x01b1, 0x0232, 0x0151, 0x00b0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x008f, 0x00b0, 0x0151, 0x0211, 0x0212, 0x0130, 0x00af, + 0x00cf, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00af, 0x0130, 0x01f2, 0x0212, 0x0131, 0x00af, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x0090, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0130, 0x0212, 0x01f2, 0x00f0, 0x0070, 0x008f, 0x006f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x00d0, 0x0212, 0x01d2, 0x00d0, 0x0090, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x00f0, 0x0232, 0x01b1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x0232, 0x00d0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00f0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00f0, 0x0232, 0x00f1, 0x00b0, 0x008f, 0x008f, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00b0, 0x00b0, 0x0890, 0x08b0, 0x0891, 0x10b0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0090, 0x0191, 0x0212, 0x0150, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x006f, 0x008f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x00d0, 0x01d2, 0x0212, 0x0150, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x0110, 0x01d1, 0x0212, + 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x00af, 0x0171, 0x0212, 0x01d1, 0x0110, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x0110, 0x01f2, 0x0212, 0x0130, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0171, 0x0232, 0x0151, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x00f0, 0x0212, 0x0151, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x0070, 0x0090, 0x01f1, 0x01b1, 0x0070, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x008f, 0x008f, 0x0130, 0x01f1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0191, 0x01b1, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x0090, 0x0090, 0x008f, 0x0090, 0x006f, 0x008f, 0x0131, 0x0232, 0x00d0, 0x0090, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60f1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006f, 0x0090, 0x006f, 0x008f, 0x008f, 0x0070, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x01f2, 0x01d1, 0x00cf, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x00f0, 0x01b2, 0x0232, 0x0150, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00f0, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x00ef, 0x01b1, 0x0212, 0x0191, 0x00d0, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x00ef, 0x01d1, 0x01f1, 0x0130, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0070, 0x008f, 0x006f, 0x008f, 0x0110, 0x0232, 0x01b1, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0110, 0x0252, 0x0130, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0170, 0x01f2, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x01d2, 0x0130, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x0252, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x00cf, 0x0232, 0x00af, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x0191, 0x0212, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008f, 0x18af, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xa111, 0x9931, 0xa111, 0x29d2, 0x01b1, 0x008f, 0x006f, 0x008f, 0x006f, 0x008f, 0x008f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0150, 0x0232, 0x0150, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00f0, 0x01d1, 0x01f1, 0x0130, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006e, 0x008f, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x0130, 0x01d1, 0x0212, 0x0150, 0x00af, 0x006e, 0x006e, 0x008e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x006f, 0x00cf, 0x01b1, 0x0212, 0x0130, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x01b1, 0x0232, 0x010f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0232, 0x00cf, 0x006f, 0x006f, 0x008e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x010f, 0x0212, 0x00af, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x008f, 0x00af, 0x0212, 0x00af, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006f, 0x006f, 0x0252, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x01d1, 0x0130, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x01f1, 0x01b1, 0x008f, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28d0, 0x01f2, 0x01d1, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x006f, 0x00cf, 0x01f1, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006f, 0x006e, 0x006e, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006f, 0x00f0, 0x01d1, 0x01f1, 0x0110, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0150, 0x0212, 0x01d1, 0x0110, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0212, 0x0150, 0x008f, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0110, 0x0212, 0x01b1, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x008f, 0x006e, 0x006e, 0x006f, 0x006f, 0x008e, 0x006e, 0x0191, 0x01f1, 0x00cf, 0x006f, 0x006f, 0x006e, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x006e, 0x006e, 0x006f, 0x00cf, 0x0212, 0x0110, 0x008f, 0x006f, 0x006e, 0x008f, 0x006f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0150, 0x0191, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0232, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0110, 0x01f1, 0x008f, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00af, 0x0212, 0x0110, 0x006f, 0x006f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x008f, 0x008f, 0x008f, 0x008f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x48d0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008e, 0x008f, 0x01b1, 0x01f2, 0x00af, 0x006f, 0x006e, 0x008f, 0x006e, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x0232, 0x0150, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x0110, 0x01f1, 0x01f1, 0x0110, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0190, 0x0212, 0x0190, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0170, 0x0212, 0x0150, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x008e, 0x01d1, 0x01f1, 0x008f, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x01f1, 0x0170, 0x006f, 0x006e, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0211, 0x00cf, 0x008f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008f, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006e, 0x108f, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006e, 0x006f, 0x006e, 0x0190, 0x0212, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01b1, 0x01f2, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x01f1, 0x01b1, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x00ef, 0x01b1, 0x01f1, 0x0150, 0x008f, 0x006e, 0x006e, 0x004e, 0x004e, 0x004e, 0x004e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0170, 0x0212, 0x0171, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0130, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x01d1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01f1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ef, 0x0211, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0170, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0150, 0x01f1, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x68f0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x00ef, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x0130, 0x01f2, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x01d1, 0x01b1, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, + 0x006e, 0x006d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x0130, 0x01d1, 0x01d1, 0x010f, 0x006e, 0x006d, 0x006d, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006d, 0x006e, 0x006e, 0x0170, 0x0212, 0x0170, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01f2, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x00af, 0x0212, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x010f, 0x0212, 0x008e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x0211, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0190, 0x01b1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x38b0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x010f, 0x0212, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x01b1, 0x01d1, 0x00cf, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006d, 0x004d, 0x008e, 0x0150, 0x01f1, 0x01b1, 0x00cf, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006d, + 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x008e, 0x0170, 0x01f1, 0x01b1, 0x00ef, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x008e, 0x012f, 0x01f1, 0x0170, 0x008e, 0x006d, 0x006d, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x004d, 0x0130, 0x01f2, 0x0150, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x00ef, 0x0212, 0x010f, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x00af, 0x0212, 0x00cf, 0x004e, 0x006e, 0x004e, 0x004e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x008e, 0x0232, 0x008e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0232, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x01d1, 0x010f, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x008e, 0x01f1, 0x012f, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x004e, 0x006e, 0x086e, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004e, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x00ae, 0x0211, 0x0190, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004e, 0x006e, 0x006e, 0x004d, 0x00ef, 0x01f2, 0x0190, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x012f, 0x01f1, 0x0190, 0x008e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x004d, 0x006d, 0x006d, + 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x00ce, 0x0190, 0x0211, 0x0170, 0x008e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x0150, 0x01f1, 0x01b1, 0x00ce, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006d, 0x004d, 0x004d, 0x004e, 0x004d, 0x004d, 0x006d, 0x006d, 0x008e, 0x01b1, 0x01d1, 0x00ce, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006e, 0x004d, 0x006e, 0x006e, 0x004e, 0x006d, 0x010f, 0x0212, 0x00ef, 0x006d, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x004d, 0x006e, 0x004d, 0x006e, 0x01d1, 0x0150, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0130, 0x0191, 0x006e, 0x006e, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x0232, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x006e, 0x004d, 0x004d, 0x004e, 0x010f, 0x01d1, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x004e, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x00ce, 0x0212, 0x00ce, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004d, 0x004d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004e, 0x70f0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x008e, 0x01d1, 0x0190, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006e, 0x0171, 0x01f2, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008e, 0x012f, 0x01f1, 0x0170, 0x008e, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x00ef, 0x01d1, 0x01d1, 0x012f, 0x008d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x00ef, 0x01f1, 0x01b0, 0x00ce, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x0150, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004e, 0x004d, 0x004d, 0x004d, 0x0150, 0x01f1, 0x00ae, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x0170, 0x01b1, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x004e, 0x006e, 0x01d1, 0x010f, 0x006d, 0x006d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006e, 0x004e, 0x0212, 0x004d, 0x004d, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x004d, 0x006d, 0x006d, 0x006d, 0x006e, 0x01f1, 0x008e, 0x006d, 0x006e, 0x004d, 0x004d, 0x006d, 0x006d, 0x004e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x010f, 0x01f1, 0x006d, 0x006d, 0x004d, 0x006e, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004e, 0x006d, 0x006d, 0x004d, 0x40cf, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70f0, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0191, 0x01b1, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x006d, 0x00ee, 0x01f1, 0x0190, 0x008e, 0x004d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x004d, 0x004d, 0x006d, 0x0150, 0x0212, 0x0170, 0x008e, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, + 0x0211, 0x0211, 0x0212, 0x01f2, 0x0212, 0x01f2, 0x01f1, 0x0211, 0x0211, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0211, 0x0211, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0232, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x11f1, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x5991, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01f1, 0x0212, 0x0211, 0x0212, 0x0212, 0x01f2, 0x0212, 0x0211, 0x01f1, 0x0211, 0x0211, 0x01f1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, + 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x00ae, 0x0170, 0x01f1, 0x0170, 0x00ce, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x00ef, 0x01d1, 0x01d1, 0x00ee, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x012f, 0x0212, 0x012f, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x01b1, 0x01d1, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x00ae, 0x0212, 0x00ae, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x0150, 0x014f, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x0212, 0x004d, 0x004d, 0x004d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x00ae, 0x01f1, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01b1, 0x0150, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x88f0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9911, 0x9931, 0x40af, 0x004d, 0x006d, 0x004d, 0x004d, 0x006d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010f, 0x0212, 0x00ae, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004c, 0x006d, 0x00ce, 0x01d1, 0x0190, 0x008e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0170, 0x01f1, 0x012f, 0x006d, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004c, 0x004c, 0x004c, 0x00ee, 0x0190, 0x01d1, 0x012f, 0x008d, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x00ae, 0x0190, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x00ae, 0x01b1, 0x01b1, 0x008d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x008d, 0x01b1, 0x0170, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x01d1, 0x010f, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01f1, 0x008e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x0212, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x01d1, 0x00ee, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x006d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008d, 0x01f1, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x50cf, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xa111, 0x186e, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x00ef, 0x01f1, 0x00ef, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004d, 0x006d, 0x0150, 0x01f1, 0x010f, 0x004d, 0x004c, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x008e, 0x0190, 0x01d1, 0x012f, 0x006d, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x006d, 0x010f, 0x01b1, 0x01d1, 0x00ee, 0x006d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x0190, 0x01d1, 0x00ee, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x01f1, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x008e, 0x01f1, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x006d, 0x0170, 0x0190, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010f, 0x01d1, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004c, 0x004d, 0x004d, 0x0212, 0x004d, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x010e, 0x01b0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01f1, 0x00ad, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x308e, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9111, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01f1, 0x012f, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x008d, 0x01b0, 0x01b1, 0x008d, 0x004d, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00cd, 0x0191, 0x01d1, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x01d1, 0x0170, 0x00ae, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0190, 0x01d1, 0x010f, 0x006d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01d1, 0x0190, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ee, 0x01f1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x01b0, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0170, 0x010f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004d, 0x004c, 0x004c, 0x004c, 0x0212, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006d, 0x01f1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006c, 0x004c, 0x012f, 0x01b0, 0x006d, 0x004c, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x084d, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x68f0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01b0, 0x016f, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x012f, 0x0211, 0x010f, 0x004d, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x0190, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x006c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0150, 0x01f1, 0x012f, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x006d, 0x014f, 0x01d1, 0x010f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x00ee, 0x01d1, 0x00ce, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ae, 0x01f1, 0x008e, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x0211, 0x004d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0212, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x012f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0170, 0x0170, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x80f0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x388e, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006d, 0x01b0, 0x01b1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008e, 0x01b0, 0x01b0, 0x00ad, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01b0, 0x01b1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x004c, 0x004c, 0x002c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002c, 0x002c, 0x002c, 0x002c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x002c, 0x004c, 0x008d, 0x0150, 0x01d1, 0x012f, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01b0, 0x0190, 0x006c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x01f1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010f, 0x016f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x006c, 0x01d1, 0x010e, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x50cf, 0xa111, 0x9931, 0x9931, 0x9931, 0x9931, 0x084c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x014f, 0x01b1, 0x008d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010e, 0x01d1, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x00ce, 0x01b1, 0x01b1, 0x00ee, 0x004c, 0x002c, 0x004c, + 0x004b, 0x002b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004c, 0x002c, 0x004c, 0x004c, 0x012f, 0x01f1, 0x014f, 0x006c, 0x004b, 0x004c, 0x002c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x014f, 0x01d1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0150, 0x01b0, 0x006d, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0190, 0x014f, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01b1, 0x00ce, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01b1, 0x00ee, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x008d, 0x01f1, 0x00ae, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x388e, 0x9931, 0x9931, 0x9931, 0x9931, 0x68d0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x012e, 0x01d1, 0x008d, 0x004c, 0x004c, 0x004b, 0x004c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x004c, 0x008c, 0x0170, 0x01b1, 0x00ad, 0x004c, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002c, 0x00ee, 0x01b1, 0x0190, 0x00ad, 0x002b, + 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004c, 0x004c, 0x004b, 0x002b, 0x004c, 0x004b, 0x004b, 0x004b, 0x006c, 0x010e, 0x01d1, 0x014f, 0x006c, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x002c, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x00cd, 0x01b1, 0x0170, 0x008c, 0x004b, 0x002c, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x002c, 0x004b, 0x004b, 0x004c, 0x0190, 0x0190, 0x004c, 0x004b, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x012f, 0x0190, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ad, 0x01d1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f2, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x010e, 0x0170, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x00ce, 0x01d1, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x002c, 0x002c, 0x004c, 0x002c, 0x004c, 0x004c, 0x004c, 0x004c, 0x104c, 0xa111, 0x9931, 0x9931, 0x9931, 0x288d, 0x004b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004c, 0x002b, 0x004b, 0x00ee, 0x01f2, 0x00cd, 0x004b, 0x004c, 0x002b, 0x004c, 0x004c, 0x002b, 0x004b, 0x002b, 0x002b, 0x002c, 0x004b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004c, 0x002b, 0x00ee, 0x01d1, 0x012f, 0x004c, 0x002b, 0x004c, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x002b, 0x004c, 0x00ee, 0x01b1, 0x0170, + 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004c, 0x010e, 0x01b1, 0x0170, 0x008c, 0x002b, 0x004b, 0x002b, 0x004b, 0x002c, 0x002c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x006c, 0x0170, 0x01d1, 0x00cd, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x008d, 0x0190, 0x014f, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004b, 0x002b, 0x004c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x00cd, 0x01d1, 0x008c, 0x004c, 0x004c, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x014f, 0x012e, 0x002c, 0x004b, 0x004c, 0x004b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x01f1, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002b, 0x004c, 0x01f1, 0x006c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x002c, 0x004c, 0x004c, 0x002b, 0x004c, 0x014f, 0x01b0, 0x004c, 0x004c, 0x004c, 0x004c, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x002b, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x9931, 0x9931, 0x9931, 0x8910, 0x002c, 0x004b, 0x004c, 0x002b, 0x004b, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x002c, 0x002b, 0x004c, 0x002b, 0x004c, 0x002b, 0x002b, 0x004c, 0x004c, 0x004b, 0x00ac, 0x01d1, 0x010f, 0x004b, 0x002c, 0x004c, 0x002c, 0x004c, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x004b, 0x002b, 0x004c, 0x002b, 0x006c, 0x014f, 0x01d1, 0x00cd, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004c, 0x010e, + 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00ed, 0x01b1, 0x0170, 0x008d, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x00ad, 0x01d1, 0x016f, 0x004c, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x008d, 0x01d1, 0x012f, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004c, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x006c, 0x01d1, 0x00cd, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004c, 0x002b, 0x004c, 0x004b, 0x004c, 0x004b, 0x004c, 0x01d1, 0x006c, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x01f1, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x014f, 0x010e, 0x004b, 0x004b, 0x002c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004c, 0x004b, 0x004b, 0x0190, 0x012f, 0x004b, 0x004c, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004c, 0x004b, 0x004b, 0x002b, 0x70f0, 0x9931, 0x9931, 0x48ae, 0x004b, 0x004b, 0x004c, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x008c, 0x01b1, 0x014f, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00cd, 0x01d1, 0x0150, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, + 0x002a, 0x002a, 0x004a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x004a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x00cd, 0x01b0, 0x0170, 0x00ac, 0x002a, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x016f, 0x01d1, 0x00ad, 0x002b, 0x002a, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x00ce, 0x01d1, 0x00cd, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x0190, 0x012f, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x00ee, 0x0190, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x01f2, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x00ad, 0x01b1, 0x002b, 0x002c, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x006c, 0x01d1, 0x00ce, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x60cf, 0x9931, 0x9931, 0x104c, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x0190, 0x0190, 0x004c, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x01b1, 0x00ad, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002a, 0x004b, 0x004b, 0x002b, 0x002b, 0x004a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00cd, 0x0190, 0x01b0, 0x00cd, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x002a, 0x004a, 0x002a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002a, 0x004b, 0x00cd, 0x01d1, 0x012f, 0x004b, 0x004b, 0x002a, 0x004b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x002b, 0x004b, 0x00ce, 0x01d1, 0x00ad, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x0190, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x0190, 0x00cd, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x01d1, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x01b0, 0x00ad, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x004b, 0x00ad, 0x01d1, 0x008c, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x48ae, 0x9931, 0x68f0, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x014f, 0x0190, 0x006c, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x004b, 0x004b, 0x002a, 0x002b, 0x004b, 0x002b, 0x002b, 0x002a, 0x002b, 0x004a, 0x00ac, 0x0190, 0x0170, 0x006c, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x008c, 0x0170, 0x0190, 0x00cd, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x006b, 0x016f, 0x0190, 0x008c, 0x002a, 0x004a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x012f, 0x01b1, 0x006c, 0x004b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x002b, 0x002a, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x00cd, 0x01b1, 0x004b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x006c, 0x01d1, 0x004b, 0x002b, 0x004b, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x01d1, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x002b, 0x010e, 0x014f, 0x004b, 0x004b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x010e, 0x0190, 0x004b, 0x002a, 0x002b, 0x002a, 0x002b, 0x002b, 0x002a, 0x002b, 0x004b, 0x002b, 0x002b, 0x004b, 0x308d, 0x9911, 0x206c, 0x004b, 0x002b, 0x002b, 0x002a, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x004b, 0x004b, 0x002a, 0x004b, 0x004a, 0x004b, 0x004a, 0x002a, 0x002b, 0x002b, 0x004b, 0x002a, 0x002a, 0x002a, 0x002b, 0x010e, 0x01b1, 0x008c, 0x002a, 0x004a, 0x002b, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004b, 0x010e, 0x01b0, 0x00ed, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x0029, 0x008b, 0x016f, 0x01b0, 0x00cd, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ed, 0x01b1, 0x010e, 0x004a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004b, 0x014f, 0x016f, 0x004b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002a, 0x008b, 0x01b1, 0x008c, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x002b, 0x002a, 0x002a, 0x012e, 0x012f, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d2, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x004b, 0x01d1, 0x006b, 0x002a, 0x002b, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002b, 0x002a, 0x014f, 0x014f, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x186b, 0x88f1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00cd, 0x01b1, 0x00cd, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x00ac, 0x0190, 0x016f, 0x006b, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008b, 0x014f, 0x0190, 0x00ed, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x006a, 0x014f, 0x0190, 0x00ab, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x004a, 0x0170, 0x016f, 0x004a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x0170, 0x00ed, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0190, 0x008c, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x012f, 0x010e, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x004b, 0x0190, 0x00ed, 0x002a, 0x002a, 0x002a, 0x002a, 0x004a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x286b, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ac, 0x01b1, 0x00ed, 0x0029, 0x002a, 0x0029, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x00ee, 0x01b1, 0x010d, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0049, 0x012e, 0x0190, 0x00ed, 0x004a, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00cc, 0x01b0, 0x010e, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006b, 0x0190, 0x012e, 0x0049, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x012e, 0x016f, 0x002a, 0x0029, 0x002a, 0x002a, 0x0029, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x00ac, 0x0190, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x01d1, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x0029, 0x00ac, 0x0190, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x0029, 0x002a, 0x008b, 0x01b1, 0x008b, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006b, 0x01b0, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008b, 0x0170, 0x014f, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x010d, 0x01b1, 0x00ed, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x006a, 0x014f, 0x016f, 0x008b, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006a, 0x01b0, 0x00ed, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x00cd, 0x01b0, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x014f, 0x00cd, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01d1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002a, 0x0029, 0x0029, 0x0029, 0x002a, 0x0190, 0x00ab, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004a, 0x0029, 0x0029, 0x00cc, 0x01b1, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x016f, 0x012e, 0x004a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0009, 0x00ed, 0x01b1, 0x00ed, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x010e, 0x0191, 0x010e, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x01b1, 0x00ec, 0x0008, 0x0028, 0x0028, 0x0029, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x00ab, 0x01b1, 0x00ac, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x006a, 0x01b1, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004a, 0x01b1, 0x006a, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01b1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00ed, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x012e, 0x016f, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0029, 0x0049, 0x012e, 0x016f, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x006a, 0x014f, 0x0170, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ed, 0x0190, 0x010e, 0x004a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0029, 0x006a, 0x016f, 0x014f, 0x006a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x0190, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x00cc, 0x012e, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01b1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x004a, 0x01b1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x016f, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x0029, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x010d, 0x0190, 0x006a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x0190, 0x00ed, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0049, 0x00ed, 0x0190, 0x012f, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ec, 0x01b0, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x012e, 0x012e, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x016f, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012e, 0x00ec, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00ab, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00cc, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0049, 0x014e, 0x0170, 0x008b, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00cc, 0x0190, 0x014f, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008a, 0x014f, 0x012f, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012e, 0x014f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00cc, 0x016f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x008b, 0x018f, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00ab, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ac, 0x0190, 0x00ac, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ac, 0x0190, 0x012e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00cb, 0x0170, 0x014f, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0009, 0x0028, 0x0049, 0x00ed, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x014f, 0x014f, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0170, 0x008a, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x014f, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x010d, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x00ac, 0x0170, 0x0170, 0x008b, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x008a, 0x016f, 0x014e, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x006a, 0x0170, 0x010e, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00cd, 0x010d, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012f, 0x012e, 0x0008, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014f, 0x010e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ab, 0x0190, 0x010e, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x008a, 0x016f, 0x016f, 0x00ac, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x010d, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014f, 0x010d, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00cb, 0x016f, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x01b1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0170, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x014f, 0x014f, 0x0049, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x010d, 0x01b0, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x008b, 0x014f, 0x0170, 0x00ab, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x008b, 0x0170, 0x014e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ab, 0x0191, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ec, 0x016f, 0x0049, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012e, 0x00cc, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x012e, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0191, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x010e, 0x0170, 0x006a, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008a, 0x0170, 0x014f, 0x004a, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x012f, 0x0190, 0x00ec, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x0190, 0x006a, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00aa, 0x0190, 0x008a, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x01b1, 0x0049, 0x0008, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ab, 0x0170, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ac, 0x0190, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00ec, 0x0190, 0x008b, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0048, 0x00ed, 0x0190, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x00ec, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0008, 0x00ab, 0x0190, 0x012e, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010e, 0x0170, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0069, 0x0190, 0x008b, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x010e, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0190, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010d, 0x014f, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0008, 0x00cb, 0x0191, 0x00cc, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x006b, 0x014f, 0x014e, 0x006a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012e, 0x0190, 0x00ab, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012f, 0x014f, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014f, 0x00ed, 0x0029, 0x0028, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0170, 0x008a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01b1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x00ed, 0x010e, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014f, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006a, 0x0190, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ed, 0x0191, 0x00ed, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp b/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp new file mode 100644 index 000000000000..502b592d8e92 --- /dev/null +++ b/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t cancel_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdd, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xba, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x77, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xff, 0xc7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xff, 0xfd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xff, 0xfc, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xff, 0xd7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9f, 0xdd, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xa9, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x68, 0x77, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp b/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp new file mode 100644 index 000000000000..8ec4350fe682 --- /dev/null +++ b/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t chamber_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t chamber_heated_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0x9b, 0x97, 0x88, 0x88, 0x87, 0x8b, 0xa8, 0x78, 0x88, 0x87, 0x8b, 0xb8, 0x78, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xf9, 0x78, 0x88, 0x78, 0xdf, 0xfb, 0x78, 0x88, 0x77, 0xcf, 0xfc, 0x87, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x7a, 0xff, 0xfd, 0x77, 0x88, 0x79, 0xff, 0xff, 0x87, 0x88, 0x78, 0xdf, 0xff, 0x97, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xff, 0x86, 0x88, 0x78, 0xdf, 0xff, 0xb6, 0x88, 0x77, 0xcf, 0xff, 0xc6, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xb6, 0x78, 0x87, 0x9f, 0xff, 0xd6, 0x78, 0x87, 0x8e, 0xff, 0xf7, 0x68, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x7d, 0xff, 0xe5, 0x67, 0x87, 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x79, 0xff, 0xfa, 0x57, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xe6, 0x57, 0x87, 0x8c, 0xff, 0xf7, 0x57, 0x88, 0x7a, 0xff, 0xfa, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xd5, 0x57, 0x87, 0x8e, 0xff, 0xe6, 0x57, 0x88, 0x7c, 0xff, 0xf8, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xa5, 0x57, 0x87, 0xaf, 0xff, 0xd5, 0x57, 0x87, 0x9f, 0xff, 0xe6, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x79, 0xff, 0xff, 0x75, 0x57, 0x78, 0xef, 0xff, 0xa5, 0x57, 0x87, 0xcf, 0xff, 0xb5, 0x56, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x7c, 0xff, 0xfb, 0x55, 0x67, 0x7b, 0xff, 0xfe, 0x65, 0x57, 0x79, 0xff, 0xff, 0x85, 0x57, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x9f, 0xff, 0xf7, 0x55, 0x67, 0x8e, 0xff, 0xf8, 0x55, 0x67, 0x7d, 0xff, 0xfb, 0x55, 0x67, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x55, 0x77, 0x9f, 0xff, 0xd6, 0x55, 0x77, 0x8f, 0xff, 0xe7, 0x55, 0x68, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x77, 0xdf, 0xff, 0x75, 0x56, 0x87, 0xbf, 0xff, 0xa5, 0x56, 0x77, 0xaf, 0xff, 0xb5, 0x55, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x78, 0xef, 0xfd, 0x65, 0x67, 0x77, 0xcf, 0xff, 0x85, 0x57, 0x87, 0xbf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x78, 0xef, 0xfd, 0x55, 0x68, 0x77, 0xcf, 0xff, 0x75, 0x68, 0x87, 0xbf, 0xff, 0x95, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x78, 0xdf, 0xff, 0x65, 0x78, 0x77, 0xbf, 0xff, 0x95, 0x68, 0x87, 0xaf, 0xff, 0xb5, 0x68, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x87, 0x9f, 0xff, 0xf8, 0x68, 0x87, 0x8e, 0xff, 0xf9, 0x68, 0x87, 0x7c, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x7b, 0xff, 0xfa, 0x58, 0x88, 0x7b, 0xff, 0xfc, 0x57, 0x88, 0x78, 0xff, 0xfe, 0x67, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x77, 0xdf, 0xd7, 0x57, 0x88, 0x87, 0xbf, 0xf8, 0x56, 0x88, 0x87, 0xaf, 0xfa, 0x56, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x56, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp b/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp new file mode 100644 index 000000000000..1ecb09834c3d --- /dev/null +++ b/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t confirm_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xbf, 0xff, 0xff, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xff, 0xff, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xbf, 0xff, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4b, 0xfa, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x75, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp b/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp new file mode 100644 index 000000000000..3514433c8edf --- /dev/null +++ b/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t decrease_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/directory_32x32x4.cpp b/Marlin/src/lcd/tft/images/directory_32x32x4.cpp new file mode 100644 index 000000000000..0297f03fb320 --- /dev/null +++ b/Marlin/src/lcd/tft/images/directory_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t directory_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x78, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x68, 0x88, + 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x68, 0x88, + 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x68, 0x88, + 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/down_32x32x4.cpp b/Marlin/src/lcd/tft/images/down_32x32x4.cpp new file mode 100644 index 000000000000..b71c0e5e7ca4 --- /dev/null +++ b/Marlin/src/lcd/tft/images/down_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t down_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x98, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8f, 0xb4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xfa, 0x48, 0x88, 0x88, + 0x88, 0x78, 0xff, 0xfa, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0x84, 0x88, 0x88, + 0x88, 0x7f, 0xff, 0xff, 0xa3, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfa, 0x47, 0x88, + 0x88, 0x7a, 0xff, 0xff, 0xfa, 0x38, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xff, 0xff, 0xc5, 0x35, 0x88, + 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa3, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfc, 0x43, 0x46, 0x88, + 0x88, 0x87, 0x79, 0xff, 0xff, 0xfa, 0x47, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc4, 0x34, 0x78, 0x88, + 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa4, 0x78, 0x79, 0xff, 0xff, 0xfc, 0x43, 0x47, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xf9, 0x47, 0x9f, 0xff, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0x96, 0xff, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x44, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xc3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xac, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x86, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_64x64x4.cpp new file mode 100644 index 000000000000..02801ddbc706 --- /dev/null +++ b/Marlin/src/lcd/tft/images/fan_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t fan0_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x9a, 0xcc, 0xcb, 0xba, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xed, 0xb9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x64, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x74, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x64, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xef, 0xff, 0xff, 0x84, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xfe, 0xa7, 0x67, 0xbf, 0xf9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xc6, 0x44, 0x44, 0x48, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8a, 0x64, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x87, 0x54, 0x6a, 0xcb, 0x86, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9a, 0xbb, 0xbb, 0xba, 0x98, 0x87, 0x77, 0x87, 0x46, 0xef, 0xff, 0xfa, 0x76, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xad, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xa9, 0x87, 0x7c, 0xff, 0xff, 0xfd, 0x77, 0xac, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x9f, 0xff, 0xff, 0xff, 0x75, 0x9f, 0xea, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x8f, 0xff, 0xff, 0xff, 0x74, 0x8e, 0xff, 0xda, 0x98, 0x87, 0x78, 0x89, 0xab, 0xcd, 0xda, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x7c, 0xff, 0xff, 0xfc, 0x54, 0x8f, 0xff, 0xff, 0xee, 0xdc, 0xdd, 0xee, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x78, 0xcf, 0xff, 0xd6, 0x44, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x77, 0x58, 0xa9, 0x54, 0x45, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x64, 0x44, 0x44, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x74, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x86, 0x54, 0x59, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x54, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x76, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x66, 0x78, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x44, 0x44, 0x57, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x45, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x64, 0x44, 0x45, 0x68, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x44, 0x45, 0x67, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x47, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0x45, 0x57, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x64, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x46, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x44, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x74, 0x45, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x44, 0x46, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x44, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xff, 0xfb, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x45, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x9f, 0xff, 0xff, 0xf7, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xff, 0xff, 0xd5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x57, 0xdf, 0xff, 0xff, 0xd8, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x8d, 0xff, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xcc, 0xc9, 0x64, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x76, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x55, 0x54, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x44, 0x44, 0x45, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t fan1_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x44, 0x44, 0x46, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x55, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x46, 0x75, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x69, 0xcc, 0xc9, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8f, 0xfd, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x48, 0xdf, 0xff, 0xff, 0xd7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xdf, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x45, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x47, 0xff, 0xff, 0xff, 0x95, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x4b, 0xff, 0xff, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x5d, 0xff, 0xff, 0xff, 0xff, 0x85, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x44, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x44, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x64, 0x45, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x64, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x86, 0x44, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x54, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x87, 0x55, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x87, 0x65, 0x44, 0x46, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x44, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x65, 0x44, 0x44, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x46, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x54, 0x44, 0x48, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x76, 0x67, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x78, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x54, 0x56, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x54, 0x44, 0x44, 0x67, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x64, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x44, 0x59, 0xa8, 0x57, 0x75, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, 0x46, 0xdf, 0xff, 0xc8, 0x74, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xfe, 0xed, 0xdc, 0xde, 0xef, 0xff, 0xff, 0x84, 0x5c, 0xff, 0xff, 0xfc, 0x74, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xdd, 0xcb, 0xa9, 0x88, 0x77, 0x88, 0x9a, 0xdf, 0xfe, 0x84, 0x7f, 0xff, 0xff, 0xff, 0x86, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8a, 0xef, 0x95, 0x7f, 0xff, 0xff, 0xff, 0x97, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8c, 0xa7, 0x7d, 0xff, 0xff, 0xfc, 0x77, 0x89, 0xab, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x86, 0x7a, 0xff, 0xff, 0xe6, 0x47, 0x87, 0x77, 0x88, 0x9a, 0xbb, 0xbb, 0xba, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x56, 0x8b, 0xca, 0x64, 0x57, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6a, 0x87, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x98, 0x44, 0x44, 0x46, 0xcc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x49, 0xff, 0xb7, 0x67, 0xae, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x8f, 0xff, 0xff, 0xef, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x45, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xbd, 0xef, 0xff, 0xff, 0xff, 0xec, 0xb9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x9a, 0xbb, 0xcc, 0xca, 0x98, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp new file mode 100644 index 000000000000..a315f8bf8f07 --- /dev/null +++ b/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t fan_fast0_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x89, 0x98, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x8a, 0xbd, 0xef, 0xfe, 0xec, 0xba, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xac, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x79, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9c, 0xed, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xde, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xbd, 0xed, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xdd, 0xdd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xac, 0xdd, 0xdd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x68, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x68, 0x88, 0x78, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xca, 0xac, 0xdd, 0xdd, 0xdd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x68, 0x87, 0x8a, 0xba, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xba, 0xaa, 0xbc, 0xdd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x78, 0x78, 0xac, 0xbb, 0x97, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xaa, 0xaa, 0xaa, 0xbc, 0xdd, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x56, 0x78, 0x8a, 0xcb, 0xaa, 0xa8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8b, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x57, 0x87, 0x9c, 0xba, 0xaa, 0xb9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9b, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdd, 0xdd, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x55, 0x67, 0x79, 0xbb, 0xba, 0xaa, 0xaa, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9c, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x55, 0x77, 0x9b, 0xcb, 0xaa, 0xaa, 0xaa, 0x96, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x89, 0xaa, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x55, 0x56, 0x79, 0xbc, 0xba, 0xaa, 0xaa, 0xaa, 0xa6, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xcd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x55, 0x68, 0xab, 0xcb, 0xaa, 0xaa, 0xaa, 0xab, 0xb8, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x56, 0x78, 0x9a, 0xaa, 0xaa, 0xbd, 0xce, 0xff, 0xfd, 0xde, 0xff, 0xfc, 0x65, 0x56, 0x9b, 0xcb, 0xba, 0xaa, 0xaa, 0xab, 0xcd, 0xdb, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x65, 0x55, 0x55, 0x57, 0x9a, 0xaa, 0xac, 0xde, 0xfb, 0x86, 0x67, 0x8c, 0xe8, 0x77, 0x8a, 0xcc, 0xba, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0x86, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x65, 0x55, 0x58, 0xaa, 0xab, 0xdd, 0x95, 0x55, 0x55, 0x56, 0x68, 0xaa, 0xbb, 0xbb, 0xaa, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0xdd, 0x95, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x76, 0x55, 0x7a, 0xab, 0xc8, 0x55, 0x57, 0x87, 0x55, 0x56, 0xac, 0xaa, 0xaa, 0xaa, 0xab, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb5, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x76, 0x56, 0xab, 0x95, 0x55, 0xae, 0xff, 0xb7, 0x65, 0x7c, 0xdc, 0xcb, 0xcc, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcd, 0xee, 0xee, 0xed, 0xcb, 0x96, 0x89, 0x65, 0x5a, 0xff, 0xff, 0xfc, 0x77, 0x9c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x65, 0x6e, 0xff, 0xff, 0xfe, 0x77, 0x9e, 0xec, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xcc, 0xcd, 0xc6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0x8f, 0xff, 0xff, 0xff, 0x75, 0x9f, 0xff, 0xdd, 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xc6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x65, 0x8e, 0xff, 0xff, 0xfe, 0x65, 0x8f, 0xff, 0xff, 0xee, 0xdd, 0xdd, 0xee, 0xef, 0xff, 0xff, 0xd6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x7a, 0xff, 0xff, 0xfa, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x77, 0x9d, 0xfd, 0xa5, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x66, 0x66, 0x55, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x75, 0x55, 0x56, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa8, 0x66, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x65, 0x67, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xcb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x67, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xcb, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x55, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xcd, 0xdb, 0xa9, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xdd, 0xba, 0xa8, 0x55, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdc, 0xaa, 0xa7, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdb, 0xaa, 0xa7, 0x56, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xca, 0xaa, 0xa7, 0x56, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x55, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xca, 0xaa, 0xa7, 0x56, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x55, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xba, 0xaa, 0xa8, 0x56, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xba, 0xaa, 0xb9, 0x56, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x55, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xa9, 0x56, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0xef, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0x76, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7e, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0x85, 0x78, 0x87, 0x6b, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0xdf, 0xff, 0xec, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa6, 0x68, 0x88, 0x76, 0xae, 0xff, 0xfe, 0xa6, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x6b, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa7, 0x68, 0x88, 0x86, 0x56, 0x89, 0x86, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8b, 0xdd, 0xdd, 0xdd, 0xdd, 0xba, 0xaa, 0xaa, 0xa9, 0x57, 0x88, 0x88, 0x65, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x8b, 0xdd, 0xdd, 0xdd, 0xaa, 0xaa, 0xaa, 0xaa, 0x66, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x56, 0x8b, 0xdd, 0xdc, 0xaa, 0xaa, 0xaa, 0xba, 0x65, 0x78, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x79, 0x99, 0x99, 0xaa, 0xaa, 0x97, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x56, 0x66, 0x66, 0x65, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t fan_fast1_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x66, 0x66, 0x66, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x57, 0x9a, 0xaa, 0xa9, 0x99, 0x99, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x75, 0x6a, 0xba, 0xaa, 0xaa, 0xac, 0xdd, 0xdb, 0x86, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x67, 0x88, 0x88, 0x86, 0x6a, 0xaa, 0xaa, 0xaa, 0xad, 0xdd, 0xdd, 0xdb, 0x85, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x87, 0x59, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdd, 0xdb, 0x85, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x89, 0x86, 0x56, 0x88, 0x88, 0x67, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdc, 0xdf, 0xfb, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0xae, 0xff, 0xfe, 0xa6, 0x78, 0x88, 0x66, 0xaa, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xdc, 0xef, 0xff, 0xd7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x7d, 0xff, 0xff, 0xff, 0xfb, 0x67, 0x88, 0x75, 0x8a, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xcd, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x58, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x86, 0x7a, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x86, 0x59, 0xaa, 0xaa, 0xbd, 0xdd, 0xdd, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x86, 0x59, 0xba, 0xaa, 0xbd, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x55, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x86, 0x58, 0xaa, 0xaa, 0xbd, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x76, 0x57, 0xaa, 0xaa, 0xcd, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x65, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x76, 0x57, 0xaa, 0xaa, 0xcd, 0xdd, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x65, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x86, 0x57, 0xaa, 0xab, 0xdd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x55, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x57, 0xaa, 0xac, 0xdd, 0xdc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x58, 0xaa, 0xbd, 0xdc, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x59, 0xab, 0xdd, 0xcd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x65, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x7b, 0xcd, 0xdc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x65, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x65, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x86, 0x68, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, 0x55, 0x55, 0x77, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x55, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x55, 0x56, 0x66, 0x67, 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x55, 0xad, 0xfd, 0x97, 0x75, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x5a, 0xff, 0xff, 0xfa, 0x75, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xdf, 0xff, 0xff, 0xee, 0xed, 0xdd, 0xde, 0xef, 0xff, 0xff, 0x85, 0x6e, 0xff, 0xff, 0xfe, 0x85, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdc, 0xcc, 0xcc, 0xcc, 0xcd, 0xdf, 0xff, 0x95, 0x7f, 0xff, 0xff, 0xff, 0x85, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xcd, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcc, 0xee, 0x97, 0x7e, 0xff, 0xff, 0xfe, 0x65, 0x6b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x97, 0x7c, 0xff, 0xff, 0xfa, 0x55, 0x69, 0x86, 0x9b, 0xcd, 0xee, 0xee, 0xed, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x56, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcc, 0xcb, 0xcc, 0xdc, 0x75, 0x67, 0xbf, 0xfe, 0xa5, 0x55, 0x9b, 0xa6, 0x56, 0x78, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x65, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcb, 0xaa, 0xaa, 0xaa, 0xac, 0xa6, 0x55, 0x57, 0x87, 0x55, 0x58, 0xcb, 0xaa, 0x75, 0x56, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x75, 0x9d, 0xdd, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xab, 0xbb, 0xba, 0xa8, 0x66, 0x55, 0x55, 0x55, 0x9d, 0xdb, 0xaa, 0xa8, 0x55, 0x55, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x8d, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xaa, 0xbc, 0xca, 0x87, 0x78, 0xec, 0x87, 0x66, 0x8b, 0xfe, 0xdc, 0xaa, 0xaa, 0x97, 0x55, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x6b, 0xdd, 0xcb, 0xaa, 0xaa, 0xaa, 0xbb, 0xcb, 0x96, 0x55, 0x6c, 0xff, 0xfe, 0xdd, 0xff, 0xfe, 0xcd, 0xba, 0xaa, 0xaa, 0x98, 0x76, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x68, 0xbb, 0xaa, 0xaa, 0xaa, 0xab, 0xcb, 0xa8, 0x65, 0x55, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x87, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x66, 0xaa, 0xaa, 0xaa, 0xaa, 0xbc, 0xb9, 0x76, 0x55, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdb, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xaa, 0xa9, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x76, 0x9a, 0xaa, 0xaa, 0xab, 0xcb, 0x97, 0x75, 0x55, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xba, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbc, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7a, 0xaa, 0xaa, 0xbb, 0xb9, 0x77, 0x65, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xdd, 0xdb, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x69, 0xba, 0xaa, 0xbc, 0x97, 0x87, 0x55, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xcb, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xaa, 0xab, 0xca, 0x88, 0x76, 0x55, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xdd, 0xdc, 0xba, 0xaa, 0xaa, 0xab, 0xc9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xbc, 0xa8, 0x78, 0x75, 0x56, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xdc, 0xba, 0xaa, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xba, 0x87, 0x88, 0x65, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xaa, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x78, 0x88, 0x65, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xdd, 0xcb, 0xc9, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x65, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xdd, 0xdd, 0xdd, 0xdc, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdd, 0xdd, 0xdd, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xed, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcd, 0xde, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xec, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x8a, 0xbc, 0xee, 0xff, 0xed, 0xba, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x99, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp new file mode 100644 index 000000000000..baf065188193 --- /dev/null +++ b/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t fan_slow0_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9a, 0xbb, 0xbb, 0xaa, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xcb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xbc, 0xbb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcb, 0xbb, 0xbb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9b, 0xcb, 0xbb, 0xbb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xac, 0xcb, 0xbb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xbc, 0xbb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbc, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9b, 0xcb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xbc, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xcb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xcb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xa8, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9b, 0xbe, 0xff, 0xca, 0xab, 0xce, 0xfd, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xab, 0xcc, 0xca, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcf, 0xd9, 0x77, 0x77, 0x79, 0xc8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9b, 0xcc, 0xbb, 0xcb, 0x87, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xcc, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9b, 0xcc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x79, 0xb8, 0x77, 0x8a, 0xcb, 0x97, 0x77, 0x8a, 0xa9, 0x88, 0x88, 0x89, 0xab, 0xcc, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x99, 0xaa, 0x99, 0x98, 0x87, 0x77, 0x79, 0x97, 0x78, 0xdf, 0xff, 0xea, 0x77, 0x8a, 0xcb, 0xbb, 0xbb, 0xbb, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7a, 0xce, 0xff, 0xff, 0xff, 0xee, 0xdc, 0xa9, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xfe, 0x97, 0x8c, 0xcb, 0xbc, 0xcc, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xb7, 0x7c, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0x97, 0x88, + 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xc7, 0x7b, 0xff, 0xec, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcd, 0xcc, 0x97, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xa7, 0x7b, 0xff, 0xff, 0xed, 0xdc, 0xcc, 0xcd, 0xde, 0xff, 0xff, 0xfe, 0x97, 0x88, + 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x7b, 0xff, 0xff, 0xfd, 0x87, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, + 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x78, 0xbe, 0xff, 0xc8, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, + 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x77, 0x79, 0x99, 0x87, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, + 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x77, 0x77, 0x77, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x88, + 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x97, 0x78, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, + 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0x98, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x88, + 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xa8, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xbb, 0xca, 0x87, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, + 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbc, 0xa8, 0x78, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0x87, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xca, 0x78, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbc, 0xb8, 0x78, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbc, 0x97, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xbc, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, 0x87, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xae, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9d, 0xff, 0xff, 0xfd, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xdf, 0xfd, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xac, 0xcb, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcc, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbc, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x8a, 0xbc, 0xcb, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8a, 0xbb, 0xb9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t fan_slow1_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xbb, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xcb, 0xcc, 0xba, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbc, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9b, 0xcc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xbd, 0xff, 0xd9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9d, 0xff, 0xff, 0xfd, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xcf, 0xff, 0xfe, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xfa, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8b, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x78, 0xac, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0x88, 0x88, 0x78, 0xbc, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x7a, 0xcb, 0xbb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x87, 0x8b, 0xbb, 0xbb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x78, 0xac, 0xbb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x77, 0x8a, 0xcb, 0xbc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x88, 0x88, + 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x78, 0xac, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x78, 0x88, + 0x88, 0x88, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x78, 0x9a, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, + 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x78, 0x77, 0x9b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, + 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x77, 0x77, 0x77, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, + 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x77, 0x89, 0x99, 0x77, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, + 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x78, 0xcf, 0xfe, 0xb8, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, + 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0x8d, 0xff, 0xff, 0xfb, 0x77, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, + 0x88, 0x87, 0x9e, 0xff, 0xff, 0xfe, 0xdd, 0xcc, 0xcc, 0xdd, 0xef, 0xff, 0xfb, 0x77, 0xaf, 0xff, 0xff, 0xfe, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xcd, 0xcc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xef, 0xfb, 0x77, 0xcf, 0xff, 0xff, 0xff, 0x97, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x87, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xfc, 0x77, 0xbf, 0xff, 0xff, 0xff, 0x97, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xcc, 0xcc, 0xbb, 0xcc, 0x87, 0x9e, 0xff, 0xff, 0xfc, 0x87, 0x88, 0x89, 0xac, 0xde, 0xef, 0xff, 0xff, 0xfe, 0xca, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xcb, 0xbb, 0xbb, 0xbb, 0xca, 0x87, 0x7a, 0xef, 0xff, 0xd8, 0x77, 0x99, 0x77, 0x77, 0x88, 0x99, 0x9a, 0xa9, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x9c, 0xbb, 0xbb, 0xbb, 0xbc, 0xcb, 0xa9, 0x88, 0x88, 0x89, 0xaa, 0x87, 0x77, 0x9b, 0xca, 0x87, 0x78, 0xb9, 0x78, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8b, 0xcb, 0xbb, 0xbc, 0xcb, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x77, 0x77, 0x77, 0x77, 0x8c, 0xca, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x8b, 0xcb, 0xbc, 0xcb, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xc9, 0x77, 0x77, 0x79, 0xdf, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x7a, 0xcc, 0xcb, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xfe, 0xcb, 0xaa, 0xcf, 0xfe, 0xbb, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xab, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xc9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xcb, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbc, 0xb9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xcb, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbc, 0xba, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbc, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0xcc, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xcb, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbc, 0xca, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xca, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, 0xbc, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xbb, 0xcb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xcc, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xb9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9b, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xa8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9a, 0xab, 0xbb, 0xba, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp b/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp new file mode 100644 index 000000000000..3515b382753b --- /dev/null +++ b/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t feedrate_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x78, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x8a, 0xcd, 0xa8, 0xcc, 0xb9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x9c, 0xef, 0xff, 0xa8, 0xff, 0xff, 0xda, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8b, 0xef, 0xff, 0xff, 0x97, 0xff, 0xff, 0xff, 0xd9, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xec, 0x76, 0xbd, 0xef, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x8d, 0xff, 0xff, 0xc9, 0x65, 0x55, 0x65, 0x6a, 0xef, 0xfb, 0x67, 0x87, 0x88, 0x88, + 0x88, 0x77, 0xcf, 0xff, 0xe9, 0x55, 0x55, 0x55, 0x65, 0x55, 0x6b, 0xb5, 0x7d, 0xb7, 0x78, 0x88, + 0x87, 0x7a, 0xff, 0xfe, 0x85, 0x55, 0x56, 0x67, 0x77, 0x66, 0x55, 0x57, 0xdf, 0xf8, 0x78, 0x88, + 0x87, 0x8e, 0xff, 0xf8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x87, 0x76, 0x58, 0xff, 0xfc, 0x67, 0x88, + 0x77, 0xbf, 0xff, 0xa5, 0x55, 0x67, 0x88, 0x88, 0x87, 0x78, 0xb9, 0x66, 0xbf, 0xff, 0x86, 0x88, + 0x78, 0xdf, 0xfd, 0x65, 0x56, 0x78, 0x88, 0x87, 0x77, 0xae, 0xd8, 0x77, 0x7e, 0xff, 0xb5, 0x78, + 0x79, 0xff, 0xfa, 0x55, 0x67, 0x88, 0x88, 0x77, 0x9c, 0xff, 0x86, 0x56, 0x7b, 0xff, 0xe6, 0x68, + 0x7a, 0xff, 0xf7, 0x55, 0x78, 0x88, 0x87, 0x8b, 0xff, 0xfb, 0x55, 0x67, 0x79, 0xff, 0xf8, 0x68, + 0x7b, 0xff, 0xe6, 0x56, 0x78, 0x88, 0x78, 0xdf, 0xff, 0xe7, 0x55, 0x78, 0x79, 0xee, 0xe8, 0x57, + 0x7c, 0xff, 0xd6, 0x57, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xa5, 0x56, 0x78, 0x78, 0x77, 0x76, 0x57, + 0x7c, 0xff, 0xd6, 0x57, 0x88, 0x87, 0x7c, 0xff, 0xfd, 0x65, 0x57, 0x88, 0x78, 0x98, 0x86, 0x57, + 0x7b, 0xff, 0xd6, 0x57, 0x88, 0x88, 0x79, 0xef, 0xe8, 0x55, 0x67, 0x88, 0x79, 0xff, 0xf9, 0x67, + 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x88, 0x87, 0x78, 0x75, 0x55, 0x78, 0x88, 0x7a, 0xff, 0xf8, 0x67, + 0x79, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x65, 0x55, 0x56, 0x88, 0x87, 0x7c, 0xff, 0xd6, 0x56, + 0x78, 0xef, 0xfd, 0x57, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x87, 0x8f, 0xff, 0xb5, 0x57, + 0x77, 0xbf, 0xff, 0x96, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x77, 0xcf, 0xff, 0x85, 0x67, + 0x87, 0x8e, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xfc, 0x55, 0x67, + 0x88, 0x7a, 0xff, 0xfd, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9e, 0xff, 0xf7, 0x55, 0x68, + 0x88, 0x77, 0xbf, 0xff, 0xea, 0x77, 0x77, 0x88, 0x87, 0x77, 0x7a, 0xff, 0xff, 0x95, 0x56, 0x78, + 0x88, 0x87, 0x6c, 0xff, 0xff, 0xc9, 0x87, 0x77, 0x77, 0x89, 0xdf, 0xff, 0xfb, 0x55, 0x56, 0x88, + 0x88, 0x88, 0x76, 0xcf, 0xff, 0xff, 0xdc, 0xbb, 0xbc, 0xef, 0xff, 0xff, 0xa5, 0x55, 0x67, 0x88, + 0x88, 0x88, 0x86, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x55, 0x55, 0x78, 0x88, + 0x88, 0x88, 0x87, 0x65, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xda, 0x65, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x55, 0x79, 0xbd, 0xde, 0xdc, 0xb9, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0x66, 0x66, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp b/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp new file mode 100644 index 000000000000..d3c7fd187a46 --- /dev/null +++ b/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t flowrate_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x78, 0xce, 0xeb, 0x77, 0x77, 0x87, 0x7c, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x89, 0x77, 0xef, 0xfd, 0x67, 0xa8, 0x77, 0x7e, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x78, 0xdf, 0xba, 0xff, 0xfe, 0x8b, 0xfd, 0x87, 0x7d, 0xfa, 0x56, 0x87, 0x77, 0x88, 0x88, + 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x7d, 0xfa, 0x56, 0x77, 0x87, 0x77, 0x88, + 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x7d, 0xfa, 0x56, 0x9c, 0xdc, 0x97, 0x78, + 0x87, 0x78, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x6d, 0xfa, 0x59, 0xff, 0xff, 0xfb, 0x77, + 0x88, 0x89, 0xef, 0xff, 0xa7, 0x7b, 0xff, 0xfd, 0x76, 0x5d, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0x97, + 0x7a, 0xdf, 0xff, 0xfa, 0x55, 0x55, 0xcf, 0xff, 0xec, 0x9c, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xc6, + 0x7c, 0xff, 0xff, 0xf7, 0x55, 0x55, 0x8f, 0xff, 0xff, 0xac, 0xf9, 0xbf, 0xfd, 0x6c, 0xff, 0xe5, + 0x7c, 0xff, 0xff, 0xf7, 0x56, 0x77, 0xaf, 0xff, 0xff, 0x9b, 0xf9, 0xbf, 0xfe, 0x8d, 0xff, 0xe5, + 0x7a, 0xde, 0xff, 0xfb, 0x56, 0x77, 0xdf, 0xff, 0xed, 0x8c, 0xf9, 0x8f, 0xff, 0xff, 0xff, 0xb5, + 0x87, 0x67, 0xef, 0xff, 0xa8, 0x9c, 0xff, 0xfd, 0x76, 0x5d, 0xf9, 0x6d, 0xff, 0xff, 0xfe, 0x75, + 0x88, 0x66, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x5c, 0xfa, 0x57, 0xdf, 0xff, 0xd8, 0x55, + 0x87, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x6d, 0xfa, 0x55, 0x68, 0xa9, 0x65, 0x55, + 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x7d, 0xfa, 0x56, 0x65, 0x55, 0x55, 0x56, + 0x88, 0x78, 0xdf, 0xa8, 0xff, 0xfe, 0x8a, 0xfc, 0x65, 0x6d, 0xfa, 0x56, 0x77, 0x65, 0x56, 0x67, + 0x88, 0x87, 0x78, 0x55, 0xef, 0xfd, 0x55, 0x86, 0x55, 0x5d, 0xfa, 0x56, 0x88, 0x77, 0x77, 0x88, + 0x88, 0x88, 0x65, 0x55, 0xbe, 0xea, 0x55, 0x55, 0x55, 0x6b, 0xd8, 0x56, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0x66, 0x76, 0x65, 0x56, 0x76, 0x68, 0xa9, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x77, 0x76, 0x55, 0x56, 0x87, 0x7b, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x78, 0xef, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x87, 0xaf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0xfd, 0x65, 0x56, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xf8, 0x55, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x96, 0x55, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp b/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp new file mode 100644 index 000000000000..6bc96968dac4 --- /dev/null +++ b/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t bed_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +extern const uint8_t bed_heated_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9b, 0x97, 0x88, 0x88, 0x87, 0x8b, 0xa8, 0x78, 0x88, 0x87, 0x8b, 0xb8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xf9, 0x78, 0x88, 0x78, 0xdf, 0xfb, 0x78, 0x88, 0x77, 0xcf, 0xfc, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xfd, 0x77, 0x88, 0x79, 0xff, 0xff, 0x87, 0x88, 0x78, 0xdf, 0xff, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0x86, 0x88, 0x78, 0xdf, 0xff, 0xb6, 0x88, 0x77, 0xcf, 0xff, 0xc6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xb6, 0x78, 0x87, 0x9f, 0xff, 0xd6, 0x78, 0x87, 0x8e, 0xff, 0xf7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7d, 0xff, 0xe6, 0x68, 0x87, 0x7d, 0xff, 0xe7, 0x68, 0x88, 0x7a, 0xff, 0xf9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7d, 0xff, 0xe5, 0x67, 0x87, 0x7b, 0xff, 0xf7, 0x57, 0x88, 0x79, 0xff, 0xfa, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xe6, 0x57, 0x87, 0x8c, 0xff, 0xf7, 0x57, 0x88, 0x7a, 0xff, 0xfa, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xd5, 0x57, 0x87, 0x8e, 0xff, 0xe6, 0x57, 0x88, 0x7c, 0xff, 0xf8, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xa5, 0x57, 0x87, 0xaf, 0xff, 0xd5, 0x57, 0x87, 0x9f, 0xff, 0xe6, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0x75, 0x57, 0x78, 0xef, 0xff, 0xa5, 0x57, 0x87, 0xcf, 0xff, 0xb5, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xfb, 0x55, 0x67, 0x7b, 0xff, 0xfe, 0x65, 0x57, 0x79, 0xff, 0xff, 0x85, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xf7, 0x55, 0x67, 0x8e, 0xff, 0xf8, 0x55, 0x67, 0x7d, 0xff, 0xfb, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x55, 0x77, 0x9f, 0xff, 0xd6, 0x55, 0x77, 0x8f, 0xff, 0xe7, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0x75, 0x56, 0x87, 0xbf, 0xff, 0xa5, 0x56, 0x77, 0xaf, 0xff, 0xb5, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xfd, 0x65, 0x67, 0x77, 0xcf, 0xff, 0x85, 0x57, 0x87, 0xbf, 0xff, 0x95, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xef, 0xfd, 0x55, 0x68, 0x77, 0xcf, 0xff, 0x75, 0x68, 0x87, 0xbf, 0xff, 0x95, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0x65, 0x78, 0x77, 0xbf, 0xff, 0x95, 0x68, 0x87, 0xaf, 0xff, 0xb5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xff, 0xb5, 0x78, 0x87, 0xaf, 0xff, 0xd6, 0x68, 0x87, 0x9f, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xf8, 0x68, 0x87, 0x8e, 0xff, 0xf9, 0x68, 0x87, 0x7c, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xfa, 0x58, 0x88, 0x7b, 0xff, 0xfc, 0x57, 0x88, 0x78, 0xff, 0xfe, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xdf, 0xd7, 0x57, 0x88, 0x87, 0xbf, 0xf8, 0x56, 0x88, 0x87, 0xaf, 0xfa, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xea, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp b/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp new file mode 100644 index 000000000000..7dbf5f0ab115 --- /dev/null +++ b/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t hotend_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xa7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x8a, 0xaa, 0xaa, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x9a, 0xaa, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xa5, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x77, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x55, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x65, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x65, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x55, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x58, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x85, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x95, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xcf, 0xff, 0xff, 0xff, 0xd7, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x5a, 0xff, 0xff, 0xfb, 0x65, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8d, 0xfe, 0xa5, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x87, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/increase_64x64x4.cpp b/Marlin/src/lcd/tft/images/increase_64x64x4.cpp new file mode 100644 index 000000000000..c6f34d1affc2 --- /dev/null +++ b/Marlin/src/lcd/tft/images/increase_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t increase_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xee, 0xee, 0xee, 0xee, 0xa6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/left_32x32x4.cpp b/Marlin/src/lcd/tft/images/left_32x32x4.cpp new file mode 100644 index 000000000000..a855f0c19706 --- /dev/null +++ b/Marlin/src/lcd/tft/images/left_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t left_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfb, 0x46, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfb, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xb3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xfb, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xa3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfa, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xf6, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x76, 0xbf, 0xff, 0xff, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x3b, 0xff, 0xff, 0xf8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x73, 0xcf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x3c, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xcf, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3b, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xbf, 0xff, 0xff, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0xff, 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xbf, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0xff, 0xf9, 0x46, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xcf, 0x93, 0x34, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4b, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0x34, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp b/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp new file mode 100644 index 000000000000..f0bb73e93523 --- /dev/null +++ b/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t leveling_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x89, 0x99, 0x99, 0x99, 0x99, 0x87, 0x78, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x88, 0x87, 0x7b, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x88, 0x87, 0x8f, 0x97, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x88, 0x77, 0xef, 0xf5, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x77, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x88, 0x7a, 0xff, 0xfc, 0x78, 0x88, 0x88, + 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x7a, 0x88, 0x88, 0x58, 0x88, 0x88, + 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0x87, 0x45, 0x55, 0x57, 0x88, 0x88, + 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x85, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x56, 0x7c, 0xff, 0xfe, 0x67, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x55, 0xef, 0xff, 0xff, 0xf9, 0x45, 0x57, 0x86, 0xff, 0xf5, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x4c, 0xff, 0xff, 0x74, 0x57, 0x88, 0x87, 0x8f, 0xa4, 0x68, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x9f, 0xd5, 0x45, 0x78, 0x88, 0x88, 0x7c, 0x55, 0x88, 0x88, 0x88, + 0x87, 0x77, 0x77, 0x77, 0x88, 0x65, 0x55, 0x68, 0x87, 0x77, 0x77, 0x86, 0x57, 0x87, 0x77, 0x78, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x56, 0x77, 0x77, 0x77, 0x77, 0x77, 0x67, 0x77, 0x77, 0x77, + 0x7b, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xb7, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, + 0x78, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x66, + 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/menu_64x64x4.cpp b/Marlin/src/lcd/tft/images/menu_64x64x4.cpp new file mode 100644 index 000000000000..89cd56b8dc3e --- /dev/null +++ b/Marlin/src/lcd/tft/images/menu_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t menu_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x98, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9e, 0xff, 0xfa, 0x78, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0xaf, 0xff, 0xfb, 0x66, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfa, 0x66, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xbb, 0xa7, 0x67, 0x88, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/pause_64x64x4.cpp b/Marlin/src/lcd/tft/images/pause_64x64x4.cpp new file mode 100644 index 000000000000..b88651c1060c --- /dev/null +++ b/Marlin/src/lcd/tft/images/pause_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t pause_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x78, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x78, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x67, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x67, 0x88, 0x88, 0x87, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp b/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp new file mode 100644 index 000000000000..48ca294ca100 --- /dev/null +++ b/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t refresh_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0x57, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0x9a, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xfe, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xff, 0xce, 0xff, 0xfd, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x6a, 0xff, 0x55, 0x5c, 0xff, 0xd7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xa7, 0x78, 0x86, 0x9f, 0x57, 0x75, 0x8f, 0xfb, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xfc, 0x78, 0x88, 0x69, 0x67, 0x88, 0x69, 0xff, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7c, 0xff, 0x58, 0x88, 0x87, 0x58, 0x88, 0x86, 0xff, 0xa7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7e, 0xfa, 0x58, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xe5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7f, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xf5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7f, 0xf8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xaf, 0xf5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7e, 0xfa, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xcf, 0xe5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7c, 0xff, 0x68, 0x88, 0x87, 0x78, 0x88, 0x77, 0xff, 0xa5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x78, 0xff, 0xa7, 0x88, 0x78, 0xb7, 0x88, 0x77, 0xbf, 0x66, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0xbf, 0xf9, 0x77, 0x77, 0xfb, 0x78, 0x88, 0x68, 0x57, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x6d, 0xff, 0xd8, 0x77, 0xff, 0xb7, 0x78, 0x87, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x85, 0xcf, 0xff, 0xfd, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x57, 0xef, 0xff, 0xff, 0xff, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x89, 0xff, 0xf8, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0xff, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xf7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/right_32x32x4.cpp b/Marlin/src/lcd/tft/images/right_32x32x4.cpp new file mode 100644 index 000000000000..6ca5867e98ad --- /dev/null +++ b/Marlin/src/lcd/tft/images/right_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t right_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xa7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x3a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xaf, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x4a, 0xff, 0xff, 0xf9, 0x77, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x9f, 0xff, 0xff, 0x97, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x49, 0xff, 0xff, 0xfa, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xff, 0xff, 0xfc, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc4, 0x36, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfc, 0x33, 0x46, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xc3, 0x34, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xfd, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xd3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xfc, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x8f, 0xff, 0xff, 0xc3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfc, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xc4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x8a, 0xff, 0xfc, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x8f, 0xc4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x4a, 0x53, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/sd_64x64x4.cpp b/Marlin/src/lcd/tft/images/sd_64x64x4.cpp new file mode 100644 index 000000000000..6991ff68c96e --- /dev/null +++ b/Marlin/src/lcd/tft/images/sd_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t sd_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xfe, 0xdf, 0xff, 0xfd, 0xef, 0xff, 0xde, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xbf, 0xfa, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x59, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x3a, 0xff, 0xa3, 0x9f, 0xfb, 0x48, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xcf, 0xf9, 0x4b, 0xff, 0xa4, 0xaf, 0xfb, 0x49, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xbf, 0xf9, 0x3a, 0xff, 0xa3, 0xaf, 0xfb, 0x39, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0xcf, 0xfa, 0x5b, 0xff, 0xb5, 0xbf, 0xfc, 0x5a, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/settings_64x64x4.cpp b/Marlin/src/lcd/tft/images/settings_64x64x4.cpp new file mode 100644 index 000000000000..7a9c84fdffa2 --- /dev/null +++ b/Marlin/src/lcd/tft/images/settings_64x64x4.cpp @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t settings_64x64x4[2048] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xad, 0xdd, 0xdd, 0xd9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x77, 0xef, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x87, 0x78, 0x79, 0xff, 0xff, 0xff, 0xfd, 0x67, 0x87, 0x78, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8d, 0xeb, 0x87, 0x7b, 0xff, 0xff, 0xff, 0xff, 0x75, 0x78, 0xce, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xea, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xbf, 0xff, 0xfb, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x98, 0x8a, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xfb, 0x65, 0x55, 0x55, 0x57, 0xdf, 0xff, 0xff, 0xff, 0xb5, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x6c, 0xff, 0xff, 0xff, 0x95, 0x56, 0x66, 0x66, 0x65, 0x5b, 0xff, 0xff, 0xff, 0x95, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0xaf, 0xff, 0xff, 0xfa, 0x56, 0x66, 0x67, 0x77, 0x77, 0x65, 0xdf, 0xff, 0xff, 0xd7, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xce, 0xff, 0xff, 0xff, 0xd5, 0x56, 0x67, 0x88, 0x88, 0x88, 0x86, 0x7f, 0xff, 0xff, 0xff, 0xdb, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x75, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xa5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7e, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x79, 0xcf, 0xff, 0xe7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xfc, 0x96, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x55, 0x55, 0x58, 0xdf, 0xfd, 0x77, 0x78, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xa5, 0x56, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9c, 0xdd, 0xdb, 0x96, 0x55, 0x5b, 0xff, 0xd8, 0x77, 0x77, 0x77, 0x77, 0xaf, 0xff, 0xff, 0xff, 0x95, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xad, 0xff, 0xff, 0xff, 0xfe, 0xb7, 0x55, 0xbf, 0xfe, 0xb9, 0x77, 0x78, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x86, 0x6d, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xb7, 0x56, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x86, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xc6, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x8c, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xfe, 0x75, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7a, 0xff, 0xff, 0xfc, 0x59, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x66, 0x68, 0xbd, 0xff, 0xff, 0xa5, 0x7b, 0xff, 0xe7, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x7b, 0xff, 0xff, 0xfd, 0x66, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x66, 0x55, 0x56, 0x8a, 0xee, 0x65, 0x55, 0x7a, 0x75, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xff, 0x75, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x97, 0x55, 0x55, 0x66, 0x66, 0x66, 0x55, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x78, 0xff, 0xff, 0xfe, 0x65, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xca, 0x76, 0x55, 0x56, 0x78, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0x97, 0x9d, 0xff, 0xd5, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x97, 0x66, 0x77, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x7b, 0xfd, 0xa7, 0x9a, 0x68, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x79, 0xff, 0xff, 0xc9, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xba, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x76, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x89, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x55, 0x57, 0x9b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x6a, 0xdf, 0xff, 0xfe, 0xb8, 0x55, 0x66, 0x65, 0x55, 0x69, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x67, 0x77, 0x76, 0x55, 0x66, 0x67, 0x76, 0x66, 0x55, 0x56, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x65, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x66, 0x66, 0x78, 0x88, 0x87, 0x76, 0x65, 0x55, 0x68, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x76, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x55, 0x55, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x65, 0x55, 0x67, 0x9c, 0xef, 0xff, 0xb5, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x55, 0x55, 0x79, 0xb9, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x55, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/slider_8x16x4.cpp b/Marlin/src/lcd/tft/images/slider_8x16x4.cpp new file mode 100644 index 000000000000..9fb8c42c2878 --- /dev/null +++ b/Marlin/src/lcd/tft/images/slider_8x16x4.cpp @@ -0,0 +1,46 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t slider_8x16x4[64] = { + 0x88, 0xff, 0xff, 0x88, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xf8, + 0x88, 0xff, 0xff, 0x88, +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/up_32x32x4.cpp b/Marlin/src/lcd/tft/images/up_32x32x4.cpp new file mode 100644 index 000000000000..59bae8aef0a4 --- /dev/null +++ b/Marlin/src/lcd/tft/images/up_32x32x4.cpp @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_GRAPHICAL_TFT + +extern const uint8_t up_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xad, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xb3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9f, 0xff, 0xfb, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xff, 0xff, 0xff, 0xc3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa6, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x6f, 0xff, 0xff, 0xb4, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x77, 0xaf, 0xff, 0xff, 0xa3, 0x34, 0x78, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x7a, 0xff, 0xff, 0xfa, 0x33, 0x47, 0x87, 0x8f, 0xff, 0xff, 0xb4, 0x78, 0x88, 0x88, + 0x88, 0x77, 0xaf, 0xff, 0xff, 0xb3, 0x44, 0x78, 0x87, 0x78, 0xff, 0xff, 0xfb, 0x47, 0x88, 0x88, + 0x88, 0x7a, 0xff, 0xff, 0xfb, 0x34, 0x47, 0x88, 0x88, 0x87, 0x7f, 0xff, 0xff, 0xc4, 0x78, 0x88, + 0x88, 0x7f, 0xff, 0xff, 0xb3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x77, 0xff, 0xff, 0xfb, 0x37, 0x88, + 0x88, 0x78, 0xff, 0xfa, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8f, 0xff, 0x93, 0x34, 0x88, + 0x88, 0x77, 0x7f, 0xb3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xf9, 0x34, 0x47, 0x88, + 0x88, 0x87, 0x78, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x84, 0x34, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x64, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x47, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 +}; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/r65105.h b/Marlin/src/lcd/tft/r65105.h new file mode 100644 index 000000000000..8d073f5d0d1c --- /dev/null +++ b/Marlin/src/lcd/tft/r65105.h @@ -0,0 +1,155 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define R61505_DRVCTL_SM 0x0400 +#define R61505_DRVCTL_SS 0x0100 // Select the shift direction of outputs from the source driver. 0 - from S1 to S720 / 1 - from S720 to S1 + +#define R61505_ETMOD_TRIGGER 0x8000 // 18-bit RAM when set; 16-bit RAM when not set +#define R61505_ETMOD_DFM 0x4000 +#define R61505_ETMOD_BGR 0x1000 // RGB-BGR ORDER +#define R61505_ETMOD_RGB 0x0000 + +#define R61505_ETMOD_HWM 0x0020 +#define R61505_ETMOD_ORG 0x0080 +#define R61505_ETMOD_ID1 0x0020 // 0 - Vertical Decrement / 1 - Vertical Increment +#define R61505_ETMOD_ID0 0x0010 // 0 - Horizontal Decrement / 1 - Horizontal Increment +#define R61505_ETMOD_AM 0x0008 // 0 - Horizontal / 1 - Vertical + +#define R61505_DRVCTRL_GS 0x8000 // Gate Scan direction + +// MKS Robin TFT v1.1 - 320x240 ; Cable on the left side +#define R61505_DRVCTL_DATA R61505_DRVCTL_SS +#define R61505_ETMOD_DATA R61505_ETMOD_BGR | R61505_ETMOD_ID1 | R61505_ETMOD_ID0 | R61505_ETMOD_AM +#define R61505_DRVCTRL_GSDIR R61505_DRVCTRL_GS + + +#define R61505_RDDID 0x00 // ID code - 0x1505 +#define R61505_DRVCTL 0x01 // Driver Output Control +#define R61505_LCDCTL 0x02 // LCD Driving Wave Control +#define R61505_ETMOD 0x03 // Entry Mode - Control the GRAM update direction +#define R61505_RESIZECTL 0x04 // Resizing Control Register +#define R61505_DISCTRL1 0x07 // Display Control 1 +#define R61505_DISCTRL2 0x08 // Display Control 2 +#define R61505_DISCTRL3 0x09 // Display Control 3 +#define R61505_DISCTRL4 0x0A // Display Control 4 +#define R61505_RGBCTRL1 0x0C // RGB Display Interface Control 1 +#define R61505_FMARKERPOS 0x0D // Frame Marker Position +#define R61505_RGBCTRL2 0x0F // RGB Display Interface Control 2 +#define R61505_PWCTRL1 0x10 // Power Control 1 +#define R61505_PWCTRL2 0x11 // Power Control 2 +#define R61505_PWCTRL3 0x12 // Power Control 3 +#define R61505_PWCTRL4 0x13 // Power Control 4 + +// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X +#define R61505_HASET 0x20 // GRAM Horizontal Address Set (0-255) +#define R61505_VASET 0x21 // GRAM Vertical Address Set (0-511) +#define R61505_RAMWR 0x22 // Write data to GRAM +#define R61505_RAMRD 0x22 // Read Data from GRAM + +#define R61505_PWCTRL7 0x29 // Power Control 7 +#define R61505_GAMCTRL1 0x30 // Gamma Control +#define R61505_GAMCTRL2 0x31 // Gamma Control +#define R61505_GAMCTRL3 0x32 // Gamma Control +#define R61505_GAMCTRL4 0x35 // Gamma Control +#define R61505_GAMCTRL5 0x36 // Gamma Control +#define R61505_GAMCTRL6 0x37 // Gamma Control +#define R61505_GAMCTRL7 0x38 // Gamma Control +#define R61505_GAMCTRL8 0x39 // Gamma Control +#define R61505_GAMCTRL9 0x3C // Gamma Control +#define R61505_GAMCTRLA 0x3D // Gamma Control + +// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X +#define R61505_HASTART 0x50 // Horizontal Address Start Position (0-255) +#define R61505_HAEND 0x51 // Horizontal Address End Position (0-255) +#define R61505_VASTART 0x52 // Vertical Address Start Position (0-511) +#define R61505_VAEND 0x53 // Vertical Address End Position (0-511) + +#define R61505_DRVCTRL 0x60 // Driver Output Control +#define R61505_BASE_IMAGE_CTRL 0x61 // Base Image Display Control +#define R61505_VSCROLL_CTRL 0x6A // Vertical Scroll Control + +#define R61505_PLTPOS1 0x80 // Partial Image 1 Display Position +#define R61505_PLTSTART1 0x81 // Partial Image 1 RAM Start Address +#define R61505_PLTEND1 0x82 // Partial Image 1 RAM End Address +#define R61505_PLTPOS2 0x83 // Partial Image 2 Display Position +#define R61505_PLTSTART2 0x84 // Partial Image 2 RAM Start Address +#define R61505_PLTEND2 0x85 // Partial Image 2 RAM End Address + +#define R61505_IFCTL1 0x90 // Panel Interface Control 1 +#define R61505_IFCTL2 0x92 // Panel Interface Control 2 +#define R61505_IFCTL3 0x93 // Panel Interface Control 3 +#define R61505_IFCTL4 0x95 // Panel Interface Control 4 +#define R61505_IFCTL5 0x97 // Panel Interface Control 5 +#define R61505_IFCTL6 0x98 // Panel Interface Control 6 + +#define R61505_OSC_CTRL 0xA4 // Oscillation Control + + +static const uint16_t r61505_init[] = { + DATASIZE_16BIT, + ESC_REG(R61505_DRVCTL), R61505_DRVCTL_DATA, + ESC_REG(R61505_LCDCTL), 0x0700, // LCD Driving Wave Control + ESC_REG(R61505_ETMOD), R61505_ETMOD_DATA, + + ESC_REG(R61505_RESIZECTL), 0x0000, + ESC_REG(R61505_DISCTRL1), 0x0173, + ESC_REG(R61505_DISCTRL2), 0x0202, + ESC_REG(R61505_DISCTRL3), 0x0000, + ESC_REG(R61505_DISCTRL4), 0x0000, + ESC_REG(R61505_RGBCTRL1), 0x0000, + ESC_REG(R61505_FMARKERPOS), 0x0000, + ESC_REG(R61505_RGBCTRL2), 0x0000, + + ESC_REG(R61505_PWCTRL1), 0x17B0, + ESC_REG(R61505_PWCTRL2), 0x0037, + ESC_REG(R61505_PWCTRL3), 0x0138, + ESC_REG(R61505_PWCTRL4), 0x1700, + ESC_REG(R61505_PWCTRL7), 0x000D, + + ESC_REG(R61505_GAMCTRL1), 0x0001, + ESC_REG(R61505_GAMCTRL2), 0x0606, + ESC_REG(R61505_GAMCTRL3), 0x0304, + ESC_REG(R61505_GAMCTRL4), 0x0103, + ESC_REG(R61505_GAMCTRL5), 0x011D, + ESC_REG(R61505_GAMCTRL6), 0x0404, + ESC_REG(R61505_GAMCTRL7), 0x0404, + ESC_REG(R61505_GAMCTRL8), 0x0404, + ESC_REG(R61505_GAMCTRL9), 0x0700, + ESC_REG(R61505_GAMCTRLA), 0x0A1F, + + ESC_REG(R61505_DRVCTRL), R61505_DRVCTRL_GSDIR | 0x2700, + ESC_REG(R61505_BASE_IMAGE_CTRL), 0x0001, + ESC_REG(R61505_VSCROLL_CTRL), 0x0000, + + ESC_REG(R61505_IFCTL1), 0x0010, + ESC_REG(R61505_IFCTL2), 0x0000, + ESC_REG(R61505_IFCTL3), 0x0003, + ESC_REG(R61505_IFCTL4), 0x0101, + ESC_REG(R61505_IFCTL5), 0x0000, + ESC_REG(R61505_IFCTL6), 0x0000, + ESC_END +}; diff --git a/Marlin/src/lcd/tft/st7735.h b/Marlin/src/lcd/tft/st7735.h new file mode 100644 index 000000000000..30e77fbd91ab --- /dev/null +++ b/Marlin/src/lcd/tft/st7735.h @@ -0,0 +1,128 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ST7735_MADCTL_MY 0x80 // Row Address Order +#define ST7735_MADCTL_MX 0x40 // Column Address Order +#define ST7735_MADCTL_MV 0x20 // Row/Column Exchange +#define ST7735_MADCTL_ML 0x10 // Vertical Refresh Order +#define ST7735_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ST7735_MADCTL_RGB 0x00 +#define ST7735_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ST7735_ORIENTATION_UP 0x00 // 128x160 ; Cable on the upper side +#define ST7735_ORIENTATION_RIGHT ST7735_MADCTL_MV | ST7735_MADCTL_MY // 160x128 ; Cable on the right side +#define ST7735_ORIENTATION_LEFT ST7735_MADCTL_MV | ST7735_MADCTL_MX // 160x128 ; Cable on the left side +#define ST7735_ORIENTATION_DOWN ST7735_MADCTL_MX | ST7735_MADCTL_MY // 128x160 ; Cable on the lower side + +//#define ST7735_COLOR_BGR +#define ST7735_ORIENTATION ST7735_ORIENTATION_DOWN +#define ST7735_MADCTL_DATA (ST7735_ORIENTATION | TERN(ST7735_COLOR_BGR, ST7735_MADCTL_BGR, ST7735_MADCTL_RGB)) + +#define ST7735_NOP 0x00 // No Operation +#define ST7735_SWRESET 0x01 // Software reset +#define ST7735_RDDID 0x04 // Read Display ID +#define ST7735_RDDST 0x09 // Read Display Status +#define ST7735_RDDPM 0x0A // Read Display Power Mode +#define ST7735_RDDMADCTL 0x0B // Read Display MADCTL +#define ST7735_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ST7735_RDDIM 0x0D // Read Display Image Mode +#define ST7735_RDDSM 0x0E // Read Display Signal Mode +#define ST7735_SLPIN 0x10 // Sleep In +#define ST7735_SLPOUT 0x11 // Sleep Out +#define ST7735_PTLON 0x12 // Partial Display Mode On +#define ST7735_NORON 0x13 // Normal Display Mode On +#define ST7735_INVOFF 0x20 // Display Inversion Off +#define ST7735_INVON 0x21 // Display Inversion On +#define ST7735_GAMSET 0x26 // Gamma Set +#define ST7735_DISPOFF 0x28 // Display Off // The delay time between DISPON and DISPOFF needs 120ms at least. +#define ST7735_DISPON 0x29 // Display On +#define ST7735_CASET 0x2A // Column Address Set +#define ST7735_RASET 0x2B // Row Address Set +#define ST7735_RAMWR 0x2C // Memory Write +#define ST7735_RAMRD 0x2E // Memory Read +#define ST7735_PTLAR 0x30 // Partial Area +#define ST7735_TEOFF 0x34 // Tearing Effect Line OFF +#define ST7735_TEON 0x35 // Tearing Effect Line ON +#define ST7735_MADCTL 0x36 // Memory Data Access Control +#define ST7735_IDMOFF 0x38 // Idle Mode Off +#define ST7735_IDMON 0x39 // Idle Mode On +#define ST7735_COLMOD 0x3A // Interface Pixel Format +#define ST7735_RDID1 0xDA // Read ID1 Value +#define ST7735_RDID2 0xDB // Read ID2 Value +#define ST7735_RDID3 0xDC // Read ID3 Value + +#define ST7735_FRMCTR1 0xB1 // Frame Rate Control (In normal mode/ Full colors) +#define ST7735_FRMCTR2 0xB2 // Frame Rate Control (In Idle mode/ 8-colors) +#define ST7735_FRMCTR3 0xB3 // Frame Rate Control (In Partial mode/ full colors) +#define ST7735_INVCTR 0xB4 // Display Inversion Control +#define ST7735_DISSET5 0xB6 // Display Function set 5 +#define ST7735_PWCTR1 0xC0 // Power Control 1 +#define ST7735_PWCTR2 0xC1 // Power Control 2 +#define ST7735_PWCTR3 0xC2 // Power Control 3 (in Normal mode/ Full colors) +#define ST7735_PWCTR4 0xC3 // Power Control 4 (in Idle mode/ 8-colors) +#define ST7735_PWCTR5 0xC4 // Power Control 5 (in Partial mode/ full-colors) +#define ST7735_VMCTR1 0xC5 // VCOM Control 1 +#define ST7735_VMOFCTR 0xC7 // VCOM Offset Control +#define ST7735_WRID2 0xD1 // Write ID2 Value +#define ST7735_WRID3 0xD2 // Write ID3 Value +#define ST7735_PWCTR6 0xFC // Power Control 5 (in Partial mode + Idle mode) +#define ST7735_NVFCTR1 0xD9 // EEPROM Control Status +#define ST7735_NVFCTR2 0xDE // EEPROM Read Command +#define ST7735_NVFCTR3 0xDF // EEPROM Write Command +#define ST7735_GMCTRP1 0xE0 // Gamma (‘+’polarity) Correction Characteristics Setting +#define ST7735_GMCTRN1 0xE1 // GMCTRN1 (E1h): Gamma ‘-’polarity Correction Characteristics Setting +#define ST7735_EXTCTRL 0xF0 // Extension Command Control +#define ST7735_VCOM4L 0xFF // Vcom 4 Level Control + +static const uint16_t st7735_init[] = { + DATASIZE_8BIT, + ESC_REG(ST7735_SWRESET), ESC_DELAY(100), + ESC_REG(ST7735_SLPOUT), ESC_DELAY(20), +/* + ESC_REG(ST7735_FRMCTR1), 0x0001, 0x002C, 0x002D, + ESC_REG(ST7735_FRMCTR2), 0x0001, 0x002C, 0x002D, + ESC_REG(ST7735_FRMCTR3), 0x0001, 0x002C, 0x002D, 0x0001, 0x002C, 0x002D, + ESC_REG(ST7735_INVCTR), 0x0007, + ESC_REG(ST7735_PWCTR1), 0x00A2, 0x0002, 0x0084, + ESC_REG(ST7735_PWCTR2), 0x00C5, + ESC_REG(ST7735_PWCTR3), 0x000A, 0x0000, + ESC_REG(ST7735_PWCTR4), 0x008A, 0x002A, + ESC_REG(ST7735_PWCTR5), 0x008A, 0x00EE, + ESC_REG(ST7735_VMCTR1), 0x000E, + ESC_REG(ST7735_INVOFF), +*/ + ESC_REG(ST7735_MADCTL), ST7735_MADCTL_DATA, + ESC_REG(ST7735_COLMOD), 0x0005, + + /* Gamma Correction. Colors with 'after-reset' settings are bleak */ + ESC_REG(ST7735_GMCTRP1), 0x0002, 0x001C, 0x0007, 0x0012, 0x0037, 0x0032, 0x0029, 0x002D, 0x0029, 0x0025, 0x002B, 0x0039, 0x0000, 0x0001, 0x0003, 0x0010, + ESC_REG(ST7735_GMCTRN1), 0x0003, 0x001D, 0x0007, 0x0006, 0x002E, 0x002C, 0x0029, 0x002D, 0x002E, 0x002E, 0x0037, 0x003F, 0x0000, 0x0000, 0x0002, 0x0010, + + ESC_REG(ST7735_NORON), + ESC_REG(ST7735_DISPON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/st7789v.h b/Marlin/src/lcd/tft/st7789v.h new file mode 100644 index 000000000000..6ed7c0ce6604 --- /dev/null +++ b/Marlin/src/lcd/tft/st7789v.h @@ -0,0 +1,148 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ST7789V_MADCTL_MY 0x80 // Row Address Order +#define ST7789V_MADCTL_MX 0x40 // Column Address Order +#define ST7789V_MADCTL_MV 0x20 // Row/Column Exchange +#define ST7789V_MADCTL_ML 0x10 // Vertical Refresh Order +#define ST7789V_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ST7789V_MADCTL_RGB 0x00 +#define ST7789V_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ST7789V_ORIENTATION_UP ST7789V_MADCTL_MX | ST7789V_MADCTL_MY // 240x320 ; Cable on the upper side +#define ST7789V_ORIENTATION_RIGHT ST7789V_MADCTL_MX | ST7789V_MADCTL_MV // 320x240 ; Cable on the right side +#define ST7789V_ORIENTATION_LEFT ST7789V_MADCTL_MY | ST7789V_MADCTL_MV // 320x240 ; Cable on the left side +#define ST7789V_ORIENTATION_DOWN 0 // 240x320 ; Cable on the lower side + +//#define ST7789V_COLOR_BGR +#define ST7789V_ORIENTATION ST7789V_ORIENTATION_LEFT +#define ST7789V_MADCTL_DATA (ST7789V_ORIENTATION | TERN(ST7789V_COLOR_BGR, ST7789V_MADCTL_BGR, ST7789V_MADCTL_RGB)) + +#define ST7789V_NOP 0x00 // No Operation +#define ST7789V_SWRESET 0x01 // Software reset +#define ST7789V_RDDID 0x04 // Read Display ID +#define ST7789V_RDDST 0x09 // Read Display Status +#define ST7789V_RDDPM 0x0A // Read Display Power Mode +#define ST7789V_RDDMADCTL 0x0B // Read Display MADCTL +#define ST7789V_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ST7789V_RDDIM 0x0D // Read Display Image Mode +#define ST7789V_RDDSM 0x0E // Read Display Signal Mode +#define ST7789V_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ST7789V_SLPIN 0x10 // Sleep In +#define ST7789V_SLPOUT 0x11 // Sleep Out +#define ST7789V_PTLON 0x12 // Partial Display Mode On +#define ST7789V_NORON 0x13 // Normal Display Mode On +#define ST7789V_INVOFF 0x20 // Display Inversion Off +#define ST7789V_INVON 0x21 // Display Inversion On +#define ST7789V_GAMSET 0x26 // Gamma Set +#define ST7789V_DISPOFF 0x28 // Display Off +#define ST7789V_DISPON 0x29 // Display On +#define ST7789V_CASET 0x2A // Column Address Set +#define ST7789V_RASET 0x2B // Row Address Set +#define ST7789V_RAMWR 0x2C // Memory Write +#define ST7789V_RAMRD 0x2E // Memory Read +#define ST7789V_PTLAR 0x30 // Partial Area +#define ST7789V_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ST7789V_TEOFF 0x34 // Tearing Effect Line OFF +#define ST7789V_TEON 0x35 // Tearing Effect Line ON +#define ST7789V_MADCTL 0x36 // Memory Data Access Control +#define ST7789V_VSCSAD 0x37 // Vertical Scroll Start Address of RAM +#define ST7789V_IDMOFF 0x38 // Idle Mode Off +#define ST7789V_IDMON 0x39 // Idle Mode On +#define ST7789V_COLMOD 0x3A // Interface Pixel Format +#define ST7789V_WRMEMC 0x3C // Write Memory Continue +#define ST7789V_RDMEMC 0x3E // Read Memory Continue +#define ST7789V_STE 0x44 // Set Tear Scanline +#define ST7789V_GSCAN 0x45 // Get Scanline +#define ST7789V_WRDISBV 0x51 // Write Display Brightness +#define ST7789V_RDDISBV 0x52 // Read Display Brightness +#define ST7789V_WRCTRLD 0x53 // Write CTRL Display +#define ST7789V_RDCTRLD 0x54 // Read CTRL Value Display +#define ST7789V_WRCACE 0x55 // Write Content Adaptive Brightness Control and Color Enhancement +#define ST7789V_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define ST7789V_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define ST7789V_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define ST7789V_RDABCSDR 0x68 // Read Automatic Brightness Control Self-Diagnostic Result +#define ST7789V_RDID1 0xDA // Read ID1 Value +#define ST7789V_RDID2 0xDB // Read ID2 Value +#define ST7789V_RDID3 0xDC // Read ID3 Value + +#define ST7789V_RAMCTRL 0xB0 // RAM Control +#define ST7789V_RGBCTRL 0xB1 // RGB Interface Control +#define ST7789V_PORCTRL 0xB2 // Porch Setting +#define ST7789V_FRCTRL1 0xB3 // Frame Rate Control 1 (In partial mode/ idle colors) +#define ST7789V_GCTRL 0xB7 // Gate Control +#define ST7789V_DGMEN 0xBA // Digital Gamma Enable +#define ST7789V_VCOMS 0xBB // VCOM Setting +#define ST7789V_LCMCTRL 0xC0 // LCM Control +#define ST7789V_IDSET 0xC1 // ID Code Setting +#define ST7789V_VDVVRHEN 0xC2 // VDV and VRH Command Enable +#define ST7789V_VRHS 0xC3 // VRH Set +#define ST7789V_VDVS 0xC4 // VDV Set +#define ST7789V_VCMOFSET 0xC5 // VCOM Offset Set +#define ST7789V_FRCTRL2 0xC6 // Frame Rate Control in Normal Mode +#define ST7789V_CABCCTRL 0xC7 // CABC Control +#define ST7789V_REGSEL1 0xC8 // Register Value Selection 1 +#define ST7789V_REGSEL2 0xCA // Register Value Selection 2 +#define ST7789V_PWMFRSEL 0xCC // PWM Frequency Selection +#define ST7789V_PWCTRL1 0xD0 // Power Control 1 +#define ST7789V_VAPVANEN 0xD2 // Enable VAP/VAN signal output +#define ST7789V_CMD2EN 0xDF // Command 2 Enable +#define ST7789V_PVGAMCTRL 0xE0 // Positive Voltage Gamma Control +#define ST7789V_NVGAMCTRL 0xE1 // Negative Voltage Gamma Control +#define ST7789V_DGMLUTR 0xE2 // Digital Gamma Look-up Table for Red +#define ST7789V_DGMLUTB 0xE3 // Digital Gamma Look-up Table for Blue +#define ST7789V_GATECTRL 0xE4 // Gate Control +#define ST7789V_SPI2EN 0xE7 // SPI2 Enable +#define ST7789V_PWCTRL2 0xE8 // Power Control 2 +#define ST7789V_EQCTRL 0xE9 // Equalize time control +#define ST7789V_PROMCTRL 0xEC // Program Mode Control +#define ST7789V_PROMEN 0xFA // Program Mode Enable +#define ST7789V_NVMSET 0xFC // NVM Setting +#define ST7789V_PROMACT 0xFE // Program action + +static const uint16_t st7789v_init[] = { + DATASIZE_8BIT, + ESC_REG(ST7789V_SWRESET), ESC_DELAY(100), + ESC_REG(ST7789V_SLPOUT), ESC_DELAY(20), + + ESC_REG(ST7789V_PORCTRL), 0x000C, 0x000C, 0x0000, 0x0033, 0x0033, + ESC_REG(ST7789V_GCTRL), 0x0035, + ESC_REG(ST7789V_VCOMS), 0x001F, + ESC_REG(ST7789V_LCMCTRL), 0x002C, + ESC_REG(ST7789V_VDVVRHEN), 0x0001, 0x00C3, + ESC_REG(ST7789V_VDVS), 0x0020, + ESC_REG(ST7789V_FRCTRL2), 0x000F, + ESC_REG(ST7789V_PWCTRL1), 0x00A4, 0x00A1, + + ESC_REG(ST7789V_MADCTL), ST7789V_MADCTL_DATA, + ESC_REG(ST7789V_COLMOD), 0x0055, + + ESC_REG(ST7789V_NORON), + ESC_REG(ST7789V_DISPON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/st7796s.h b/Marlin/src/lcd/tft/st7796s.h new file mode 100644 index 000000000000..7ddbcfae840d --- /dev/null +++ b/Marlin/src/lcd/tft/st7796s.h @@ -0,0 +1,175 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft.h" + +#include "../../inc/MarlinConfig.h" + +#define ST7796S_MADCTL_MY 0x80 // Row Address Order +#define ST7796S_MADCTL_MX 0x40 // Column Address Order +#define ST7796S_MADCTL_MV 0x20 // Row/Column Exchange +#define ST7796S_MADCTL_ML 0x10 // Vertical Refresh Order +#define ST7796S_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define ST7796S_MADCTL_RGB 0x00 +#define ST7796S_MADCTL_MH 0x04 // Horizontal Refresh Order + +#define ST7796S_COLOR_BGR +#define ST7796S_ORIENTATION ST7796S_MADCTL_MV +#define ST7796S_MADCTL_DATA (ST7796S_ORIENTATION | TERN(ST7796S_COLOR_BGR, ST7796S_MADCTL_BGR, ST7796S_MADCTL_RGB)) + +#define ST7796S_NOP 0x00 // No Operation +#define ST7796S_SWRESET 0x01 // Software reset +#define ST7796S_RDDID 0x04 // Read Display ID +#define ST7796S_RDNUMED 0x05 // Read Number of the Errors on DSI +#define ST7796S_RDDST 0x09 // Read Display Status +#define ST7796S_RDDPM 0x0A // Read Display Power Mode +#define ST7796S_RDDMADCTL 0x0B // Read Display MADCTL +#define ST7796S_RDDCOLMOD 0x0C // Read Display Pixel Format +#define ST7796S_RDDIM 0x0D // Read Display Image Mode +#define ST7796S_RDDSM 0x0E // Read Display Signal Status +#define ST7796S_RDDSDR 0x0F // Read Display Self-Diagnostic Result +#define ST7796S_SLPIN 0x10 // Sleep In +#define ST7796S_SLPOUT 0x11 // Sleep Out +#define ST7796S_PTLON 0x12 // Partial Display Mode On +#define ST7796S_NORON 0x13 // Normal Display Mode On +#define ST7796S_INVOFF 0x20 // Display Inversion Off +#define ST7796S_INVON 0x21 // Display Inversion On +#define ST7796S_DISPOFF 0x28 // Display Off +#define ST7796S_DISPON 0x29 // Display On +#define ST7796S_CASET 0x2A // Column Address Set +#define ST7796S_RASET 0x2B // Row Address Set +#define ST7796S_RAMWR 0x2C // Memory Write +#define ST7796S_RAMRD 0x2E // Memory Read +#define ST7796S_PTLAR 0x30 // Partial Area +#define ST7796S_VSCRDEF 0x33 // Vertical Scrolling Definition +#define ST7796S_TEOFF 0x34 // Tearing Effect Line OFF +#define ST7796S_TEON 0x35 // Tearing Effect Line On +#define ST7796S_MADCTL 0x36 // Memory Data Access Control +#define ST7796S_VSCSAD 0x37 // Vertical Scroll Start Address of RAM +#define ST7796S_IDMOFF 0x38 // Idle Mode Off +#define ST7796S_IDMON 0x39 // Idle Mode On +#define ST7796S_COLMOD 0x3A // Interface Pixel Format +#define ST7796S_WRMEMC 0x3C // Write Memory Continue +#define ST7796S_RDMEMC 0x3E // Read Memory Continue +#define ST7796S_STE 0x44 // Set Tear ScanLine +#define ST7796S_GSCAN 0x45 // Get ScanLine +#define ST7796S_WRDISBV 0x51 // Write Display Brightness +#define ST7796S_RDDISBV 0x52 // Read Display Brightness Value +#define ST7796S_WRCTRLD 0x53 // Write CTRL Display +#define ST7796S_RDCTRLD 0x54 // Read CTRL value Display +#define ST7796S_WRCABC 0x55 // Write Adaptive Brightness Control +#define ST7796S_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define ST7796S_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define ST7796S_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define ST7796S_RDFCS 0xAA // Read First Checksum +#define ST7796S_RDCFCS 0xAF // Read Continue Checksum +#define ST7796S_RDID1 0xDA // Read ID1 +#define ST7796S_RDID2 0xDB // Read ID2 +#define ST7796S_RDID3 0xDC // Read ID3 + +#define ST7796S_IFMODE 0xB0 // Interface Mode Control +#define ST7796S_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) +#define ST7796S_FRMCTR2 0xB2 // Frame Rate Control 2 (In Idle Mode/8 colors) +#define ST7796S_FRMCTR3 0xB3 // Frame Rate Control 3(In Partial Mode/Full Colors) +#define ST7796S_DIC 0xB4 // Display Inversion Control +#define ST7796S_BPC 0xB5 // Blanking Porch Control +#define ST7796S_DFC 0xB6 // Display Function Control +#define ST7796S_EM 0xB7 // Entry Mode Set +#define ST7796S_PWR1 0xC0 // Power Control 1 +#define ST7796S_PWR2 0xC1 // Power Control 2 +#define ST7796S_PWR3 0xC2 // Power Control 3 +#define ST7796S_VCMPCTL 0xC5 // VCOM Control +#define ST7796S_VCMOST 0xC6 // VCOM Offset Register +#define ST7796S_NVMADW 0xD0 // NVM Address/Data Write +#define ST7796S_NVMBPROG 0xD1 // NVM Byte Program +#define ST7796S_NVMSTRD 0xD2 // NVM Status Read +#define ST7796S_RDID4 0xD3 // Read ID4 +#define ST7796S_PGC 0xE0 // Positive Gamma Control +#define ST7796S_NGC 0xE1 // Negative Gamma Control +#define ST7796S_DGC1 0xE2 // Digital Gamma Control 1 +#define ST7796S_DGC2 0xE3 // Digital Gamma Control 2 +#define ST7796S_DOCA 0xE8 // Display Output Ctrl Adjust +#define ST7796S_CSCON 0xF0 // Command Set Control +#define ST7796S_SPIRC 0xFB // SPI Read Control + +static const uint16_t st7796s_init[] = { + DATASIZE_8BIT, + ESC_REG(ST7796S_SWRESET), ESC_DELAY(100), + ESC_REG(ST7796S_SLPOUT), ESC_DELAY(20), + + ESC_REG(ST7796S_CSCON), 0x00C3, // enable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0096, // enable command 2 part II + + ESC_REG(ST7796S_MADCTL), ST7796S_MADCTL_DATA, + ESC_REG(ST7796S_COLMOD), 0x0055, + + ESC_REG(ST7796S_DIC), 0x0001, // 1-dot inversion + ESC_REG(ST7796S_EM), 0x00C6, + + ESC_REG(ST7796S_PWR2), 0x0015, + ESC_REG(ST7796S_PWR3), 0x00AF, + ESC_REG(ST7796S_VCMPCTL), 0x0022, + ESC_REG(ST7796S_VCMOST), 0x0000, + ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, + + /* Gamma Correction. */ + ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, + ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, + + ESC_REG(ST7796S_NORON), + ESC_REG(ST7796S_WRCTRLD), 0x0024, + ESC_REG(ST7796S_CSCON), 0x003C, // disable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0069, // disable command 2 part II + ESC_REG(ST7796S_DISPON), + ESC_END +}; + +static const uint16_t lerdge_st7796s_init[] = { + DATASIZE_8BIT, + ESC_REG(ST7796S_CSCON), 0x00C3, // enable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0096, // enable command 2 part II + + ESC_REG(ST7796S_MADCTL), ST7796S_MADCTL_DATA, + ESC_REG(ST7796S_COLMOD), 0x0055, + + ESC_REG(ST7796S_DIC), 0x0001, // 1-dot inversion + ESC_REG(ST7796S_EM), 0x00C6, + + ESC_REG(ST7796S_PWR2), 0x0015, + ESC_REG(ST7796S_PWR3), 0x00AF, + ESC_REG(0xC3), 0x0009, // Register not documented in datasheet + ESC_REG(ST7796S_VCMPCTL), 0x0022, + ESC_REG(ST7796S_VCMOST), 0x0000, + ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, + + /* Gamma Correction. */ + ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, + ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, + + ESC_REG(ST7796S_INVON), // Display inversion ON + ESC_REG(ST7796S_WRCTRLD), 0x0024, + ESC_REG(ST7796S_CSCON), 0x003C, // disable command 2 part I + ESC_REG(ST7796S_CSCON), 0x0069, // disable command 2 part II + ESC_REG(ST7796S_DISPON), + ESC_END +}; diff --git a/Marlin/src/lcd/tft/tft.cpp b/Marlin/src/lcd/tft/tft.cpp new file mode 100644 index 000000000000..81fe6788e7c7 --- /dev/null +++ b/Marlin/src/lcd/tft/tft.cpp @@ -0,0 +1,199 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_GRAPHICAL_TFT + +#include "tft.h" +#include "st7735.h" +#include "st7789v.h" +#include "st7796s.h" +#include "r65105.h" +#include "ili9328.h" +#include "ili9341.h" +#include "ili9488.h" + +//#define DEBUG_GRAPHICAL_TFT +#define DEBUG_OUT ENABLED(DEBUG_GRAPHICAL_TFT) +#include "../../core/debug_out.h" + +uint16_t TFT::buffer[]; +uint32_t TFT::lcd_id = 0xFFFFFFFF; + +void TFT::init() { + if (lcd_id != 0xFFFFFFFF) return; + + io.Init(); + + #if TFT_DRIVER != AUTO + lcd_id = TFT_DRIVER; + #endif + + #if TFT_DRIVER == ST7735 + write_esc_sequence(st7735_init); + #elif TFT_DRIVER == ST7789 + write_esc_sequence(st7789v_init); + #elif TFT_DRIVER == ST7796 + write_esc_sequence(st7796s_init); + #elif TFT_DRIVER == R61505 + write_esc_sequence(r61505_init); + #elif TFT_DRIVER == ILI9328 + write_esc_sequence(ili9328_init); + #elif TFT_DRIVER == ILI9341 + write_esc_sequence(ili9341_init); + #elif TFT_DRIVER == ILI9488 + write_esc_sequence(ili9488_init); + #elif TFT_DRIVER == LERDGE_ST7796 + lcd_id = ST7796; + write_esc_sequence(lerdge_st7796s_init); + + #elif TFT_DRIVER == AUTO // autodetect + + lcd_id = io.GetID() & 0xFFFF; + + switch (lcd_id) { + case ST7796: // ST7796S 480x320 + DEBUG_ECHO_MSG(" ST7796S"); + write_esc_sequence(st7796s_init); + break; + case ST7789: // ST7789V 320x240 + DEBUG_ECHO_MSG(" ST7789V"); + write_esc_sequence(st7789v_init); + break; + case ST7735: // ST7735 160x128 + DEBUG_ECHO_MSG(" ST7735"); + write_esc_sequence(st7735_init); + break; + case R61505: // R61505U 320x240 + DEBUG_ECHO_MSG(" R61505U"); + write_esc_sequence(r61505_init); + break; + case ILI9328: // ILI9328 320x240 + DEBUG_ECHO_MSG(" ILI9328"); + write_esc_sequence(ili9328_init); + break; + case ILI9341: // ILI9341 320x240 + DEBUG_ECHO_MSG(" ILI9341"); + write_esc_sequence(ili9341_init); + break; + case ILI9488: // ILI9488 480x320 + DEBUG_ECHO_MSG(" ILI9488"); + write_esc_sequence(ili9488_init); + break; + default: + lcd_id = 0; + } + #else + #error Unsupported TFT driver + #endif +} + +void TFT::set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { + #ifdef OFFSET_X + Xmin += OFFSET_X; Xmax += OFFSET_X; + #endif + #ifdef OFFSET_Y + Ymin += OFFSET_Y; Ymax += OFFSET_Y; + #endif + + switch (lcd_id) { + case ST7735: // ST7735 160x128 + case ST7789: // ST7789V 320x240 + case ST7796: // ST7796 480x320 + case ILI9341: // ILI9341 320x240 + case ILI9488: // ILI9488 480x320 + io.DataTransferBegin(DATASIZE_8BIT); + + // CASET: Column Address Set + io.WriteReg(ILI9341_CASET); + io.WriteData((Xmin >> 8) & 0xFF); + io.WriteData(Xmin & 0xFF); + io.WriteData((Xmax >> 8) & 0xFF); + io.WriteData(Xmax & 0xFF); + + // RASET: Row Address Set + io.WriteReg(ILI9341_PASET); + io.WriteData((Ymin >> 8) & 0xFF); + io.WriteData(Ymin & 0xFF); + io.WriteData((Ymax >> 8) & 0xFF); + io.WriteData(Ymax & 0xFF); + + // RAMWR: Memory Write + io.WriteReg(ILI9341_RAMWR); + break; + case R61505: // R61505U 320x240 + case ILI9328: // ILI9328 320x240 + io.DataTransferBegin(DATASIZE_16BIT); + + // Mind the mess: with landscape screen orientation 'Horizontal' is Y and 'Vertical' is X + io.WriteReg(ILI9328_HASTART); + io.WriteData(Ymin); + io.WriteReg(ILI9328_HAEND); + io.WriteData(Ymax); + io.WriteReg(ILI9328_VASTART); + io.WriteData(Xmin); + io.WriteReg(ILI9328_VAEND); + io.WriteData(Xmax); + + io.WriteReg(ILI9328_HASET); + io.WriteData(Ymin); + io.WriteReg(ILI9328_VASET); + io.WriteData(Xmin); + + io.WriteReg(ILI9328_RAMWR); + break; + default: + break; + } + + io.DataTransferEnd(); +} + +void TFT::write_esc_sequence(const uint16_t *Sequence) { + uint16_t dataWidth, data; + + dataWidth = *Sequence++; + io.DataTransferBegin(dataWidth); + + for (;;) { + data = *Sequence++; + if (data != 0xFFFF) { + io.WriteData(data); + continue; + } + data = *Sequence++; + if (data == 0x7FFF) return; + if (data == 0xFFFF) + io.WriteData(0xFFFF); + else if (data & 0x8000) + delay(data & 0x7FFF); + else if ((data & 0xFF00) == 0) + io.WriteReg(data); + } + + io.DataTransferEnd(); +} + +TFT tft; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h new file mode 100644 index 000000000000..6d429109c892 --- /dev/null +++ b/Marlin/src/lcd/tft/tft.h @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "tft_queue.h" +#include "canvas.h" +#include "tft_color.h" +#include "tft_string.h" +#include "tft_image.h" +#include "tft_io.h" + +#include "../../inc/MarlinConfig.h" + +#if HAS_UI_320x240 + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 +#elif HAS_UI_480x320 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 +#else + #error "Unsupported display resolution!" +#endif + +#define ST7735 0x89F0 +#define ST7789 0x8552 +#define ST7796 0x7796 +#define R61505 0x1505 +#define ILI9328 0x9328 +#define ILI9341 0x9341 +#define ILI9488 0x9488 +#define LERDGE_ST7796 0xFFFE +#define AUTO 0xFFFF + +#ifndef TFT_DRIVER + #define TFT_DRIVER AUTO +#endif + +#ifndef TFT_BUFFER_SIZE + #ifdef STM32F103xB + #define TFT_BUFFER_SIZE 1024 + #elif defined(STM32F103xE) + #define TFT_BUFFER_SIZE 19200 // 320 * 60 + #elif defined(STM32F1) + #define TFT_BUFFER_SIZE 8192 + #else + #define TFT_BUFFER_SIZE 19200 // 320 * 60 + #endif +#endif + +#if TFT_BUFFER_SIZE > 65535 + // DMA Count parameter is uint16_t + #error "TFT_BUFFER_SIZE can not exceed 65535" +#endif + +#define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x +#define ESC_DELAY(x) 0xFFFF, 0x8000 | (x & 0x7FFF) +#define ESC_END 0xFFFF, 0x7FFF +#define ESC_FFFF 0xFFFF, 0xFFFF + +class TFT { + private: + static uint32_t lcd_id; + static TFT_String string; + static TFT_IO io; + + public: + static TFT_Queue queue; + + static uint16_t buffer[TFT_BUFFER_SIZE]; + + static void init(); + static inline void set_font(const uint8_t *Font) { string.set_font(Font); } + static inline void add_glyphs(const uint8_t *Font) { string.add_glyphs(Font); } + + static void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax); + static void write_esc_sequence(const uint16_t *Sequence); + + static inline bool is_busy() { return io.isBusy(); } + static inline void abort() { io.Abort(); } + static inline void write_multiple(uint16_t Data, uint16_t Count) { io.WriteMultiple(Data, Count); } + static inline void write_sequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); } + + static inline void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.fill(x, y, width, height, color); } + static inline void canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { queue.canvas(x, y, width, height); } + static inline void set_background(uint16_t color) { queue.set_background(color); } + static inline void add_text(uint16_t x, uint16_t y, uint16_t color, TFT_String tft_string, uint16_t maxWidth = 0) { queue.add_text(x, y, color, tft_string.string(), maxWidth); } + static inline void add_text(uint16_t x, uint16_t y, uint16_t color, const char *string, uint16_t maxWidth = 0) { queue.add_text(x, y, color, (uint8_t *)string, maxWidth); } + static inline void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { queue.add_image(x, y, image, colors); } + static inline void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main = COLOR_WHITE, uint16_t color_background = COLOR_BACKGROUND, uint16_t color_shadow = COLOR_BLACK) { queue.add_image(x, y, image, color_main, color_background, color_shadow); } + static inline void add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.add_bar(x, y, width, height, color); } + static inline void add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.add_rectangle(x, y, width, height, color); } +}; + +extern TFT tft; diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h new file mode 100644 index 000000000000..d2c5d8e7db7e --- /dev/null +++ b/Marlin/src/lcd/tft/tft_color.h @@ -0,0 +1,112 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define RED(color) ((color >> 8) & 0xF8) +#define GREEN(color) ((color >> 3) & 0xFC) +#define BLUE(color) ((color << 3) & 0xF8) +#define RGB(red, green, blue) (((red << 8) & 0xF800) | ((green << 3) & 0x07E0) | ((blue >> 3) & 0x001F)) +#define COLOR(color) RGB(((color >> 16) & 0xFF), ((color >> 8) & 0xFF), (color & 0xFF)) +#define HALF(color) RGB(RED(color) >> 1, GREEN(color) >> 1, BLUE(color) >> 1) + +// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html + +#define COLOR_BLACK 0x0000 // #000000 +#define COLOR_WHITE 0xFFFF // #FFFFFF +#define COLOR_SILVER 0xC618 // #C0C0C0 +#define COLOR_GREY 0x7BEF // #808080 +#define COLOR_DARKGREY 0x4208 // #404040 +#define COLOR_DARKGREY2 0x39E7 // #303030 +#define COLOR_DARK 0x0003 // Some dark color + +#define COLOR_RED 0xF800 // #FF0000 +#define COLOR_SCARLET 0xF904 // #FF2020 +#define COLOR_LIME 0x7E00 // #00FF00 +#define COLOR_BLUE 0x001F // #0000FF +#define COLOR_YELLOW 0xFFE0 // #FFFF00 +#define COLOR_MAGENTA 0xF81F // #FF00FF +#define COLOR_FUCHSIA 0xF81F // #FF00FF +#define COLOR_CYAN 0x07FF // #00FFFF +#define COLOR_AQUA 0x07FF // #00FFFF +#define COLOR_DODGER_BLUE 0x041F // #0080FF +#define COLOR_VIVID_VIOLET 0x7933 // #772399 + +#define COLOR_DARK_PURPLE 0x9930 // #992380 + +#define COLOR_MAROON 0x7800 // #800000 +#define COLOR_GREEN 0x03E0 // #008000 +#define COLOR_NAVY 0x000F // #000080 +#define COLOR_OLIVE 0x8400 // #808000 +#define COLOR_PURPLE 0x8010 // #800080 +#define COLOR_TEAL 0x0410 // #008080 + +#define COLOR_ORANGE 0xFC00 // #FF7F00 +#define COLOR_VIVID_GREEN 0x7FE0 // #7FFF00 +#define COLOR_DARK_ORANGE 0xFC40 // #FF8C00 +#define COLOR_CORAL_RED 0xF9E7 // #FF3F3F + +#define COLOR_DARK_PURPLE 0x9930 // #992380 + + +#define COLOR_BACKGROUND 0x20AC // #1E156E +#define COLOR_SELECTION_BG 0x9930 // #992380 +#define COLOR_WEBSITE_URL 0x03B7 + +#define COLOR_INACTIVE COLOR_GREY +#define COLOR_COLD COLOR_AQUA +#define COLOR_HOTEND COLOR_SCARLET +#define COLOR_HEATED_BED COLOR_DARK_ORANGE +#define COLOR_CHAMBER COLOR_DARK_ORANGE +#define COLOR_FAN COLOR_AQUA + +#define COLOR_AXIS_HOMED COLOR_WHITE +#define COLOR_AXIS_NOT_HOMED COLOR_YELLOW + +#define COLOR_RATE_100 COLOR_VIVID_GREEN +#define COLOR_RATE_ALTERED COLOR_YELLOW + +#define COLOR_PRINT_TIME COLOR_AQUA + +#define COLOR_PROGRESS_FRAME COLOR_WHITE +#define COLOR_PROGRESS_BAR COLOR_BLUE +#define COLOR_PROGRESS_BG COLOR_BLACK + +#define COLOR_STATUS_MESSAGE COLOR_YELLOW + +#define COLOR_CONTROL_ENABLED COLOR_WHITE +#define COLOR_CONTROL_DISABLED COLOR_GREY +#define COLOR_CONTROL_CANCEL COLOR_SCARLET +#define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN +#define COLOR_BUSY COLOR_SILVER + +#define COLOR_MENU_TEXT COLOR_YELLOW +#define COLOR_MENU_VALUE COLOR_WHITE + +#define COLOR_SLIDER COLOR_WHITE +#define COLOR_SLIDER_INACTIVE COLOR_GREY + +#define COLOR_UBL COLOR_WHITE + +#define COLOR_TOUCH_CALIBRATION COLOR_WHITE + +#define COLOR_KILL_SCREEN_BG COLOR_MAROON +#define COLOR_KILL_SCREEN_TEXT COLOR_WHITE diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp new file mode 100644 index 000000000000..9e4dc1629753 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -0,0 +1,69 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "tft_image.h" +#include "cstddef" + +const tImage NoLogo = { (void *)NULL, 0, 0, NOCOLORS }; + +const tImage MarlinLogo112x38x1 = { (void *)marlin_logo_112x38x1, 112, 38, GREYSCALE1 }; +const tImage MarlinLogo228x255x2 = { (void *)marlin_logo_228x255x2, 228, 255, GREYSCALE2 }; +const tImage MarlinLogo228x255x4 = { (void *)marlin_logo_228x255x4, 228, 255, GREYSCALE4 }; +const tImage MarlinLogo195x59x16 = { (void *)marlin_logo_195x59x16, 195, 59, HIGHCOLOR }; +const tImage MarlinLogo320x240x16 = { (void *)marlin_logo_320x240x16, 320, 240, HIGHCOLOR }; +const tImage MarlinLogo480x320x16 = { (void *)marlin_logo_480x320x16, 480, 320, HIGHCOLOR }; +const tImage Background320x30x16 = { (void *)background_320x30x16, 320, 30, HIGHCOLOR }; + +const tImage HotEnd_64x64x4 = { (void *)hotend_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Bed_64x64x4 = { (void *)bed_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Bed_Heated_64x64x4 = { (void *)bed_heated_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Chamber_64x64x4 = { (void *)chamber_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Chamber_Heated_64x64x4 = { (void *)chamber_heated_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan0_64x64x4 = { (void *)fan0_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan1_64x64x4 = { (void *)fan1_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan_Slow0_64x64x4 = { (void *)fan_slow0_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan_Slow1_64x64x4 = { (void *)fan_slow1_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan_Fast0_64x64x4 = { (void *)fan_fast0_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Fan_Fast1_64x64x4 = { (void *)fan_fast1_64x64x4, 64, 64, GREYSCALE4 }; +const tImage SD_64x64x4 = { (void *)sd_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Menu_64x64x4 = { (void *)menu_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Settings_64x64x4 = { (void *)settings_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Confirm_64x64x4 = { (void *)confirm_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Cancel_64x64x4 = { (void *)cancel_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Increase_64x64x4 = { (void *)increase_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Decrease_64x64x4 = { (void *)decrease_64x64x4, 64, 64, GREYSCALE4 }; +const tImage Pause_64x64x4 = { (void *)pause_64x64x4, 64, 64, GREYSCALE4 }; + +const tImage Feedrate_32x32x4 = { (void *)feedrate_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Flowrate_32x32x4 = { (void *)flowrate_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Directory_32x32x4 = { (void *)directory_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Back_32x32x4 = { (void *)back_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Up_32x32x4 = { (void *)up_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Down_32x32x4 = { (void *)down_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Left_32x32x4 = { (void *)left_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Right_32x32x4 = { (void *)right_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Refresh_32x32x4 = { (void *)refresh_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Leveling_32x32x4 = { (void *)leveling_32x32x4, 32, 32, GREYSCALE4 }; + +const tImage Slider8x16x4 = { (void *)slider_8x16x4, 8, 16, GREYSCALE4 }; + +extern const tImage Images[imgCount]; diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h new file mode 100644 index 000000000000..cf48065968b1 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_image.h @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "stdint.h" + + +extern const uint8_t marlin_logo_112x38x1[]; +extern const uint8_t marlin_logo_228x255x2[]; +extern const uint8_t marlin_logo_228x255x4[]; +extern const uint16_t marlin_logo_195x59x16[]; +extern const uint16_t marlin_logo_320x240x16[]; +extern const uint16_t marlin_logo_480x320x16[]; +extern const uint16_t background_320x30x16[]; + +extern const uint8_t hotend_64x64x4[]; +extern const uint8_t bed_64x64x4[], bed_heated_64x64x4[]; +extern const uint8_t chamber_64x64x4[], chamber_heated_64x64x4[]; +extern const uint8_t fan0_64x64x4[], fan1_64x64x4[]; +extern const uint8_t fan_slow0_64x64x4[], fan_slow1_64x64x4[]; +extern const uint8_t fan_fast0_64x64x4[], fan_fast1_64x64x4[]; +extern const uint8_t sd_64x64x4[]; +extern const uint8_t menu_64x64x4[]; +extern const uint8_t settings_64x64x4[]; +extern const uint8_t confirm_64x64x4[]; +extern const uint8_t cancel_64x64x4[]; +extern const uint8_t increase_64x64x4[]; +extern const uint8_t decrease_64x64x4[]; +extern const uint8_t pause_64x64x4[]; + +extern const uint8_t feedrate_32x32x4[]; +extern const uint8_t flowrate_32x32x4[]; +extern const uint8_t directory_32x32x4[]; +extern const uint8_t back_32x32x4[]; +extern const uint8_t up_32x32x4[]; +extern const uint8_t down_32x32x4[]; +extern const uint8_t left_32x32x4[]; +extern const uint8_t right_32x32x4[]; +extern const uint8_t refresh_32x32x4[]; +extern const uint8_t leveling_32x32x4[]; + +extern const uint8_t slider_8x16x4[]; + +enum MarlinImage : uint8_t { + imgBootScreen = 0x00, + imgHotEnd, + imgBed, + imgBedHeated, + imgChamber, + imgChamberHeated, + imgFanIdle, + imgFanSlow0, + imgFanSlow1, + imgFanFast0, + imgFanFast1, + imgFeedRate, + imgFlowRate, + imgSD, + imgMenu, + imgSettings, + imgDirectory, + imgConfirm, + imgCancel, + imgIncrease, + imgDecrease, + imgBack, + imgUp, + imgDown, + imgLeft, + imgRight, + imgRefresh, + imgLeveling, + imgSlider, + imgCount, + noImage = imgCount, + imgPageUp = imgLeft, + imgPageDown = imgRight +}; + +enum colorMode_t : uint8_t { + NOCOLORS = 0x00, + MONOCHROME = 0x01, // 1 bit per pixel + GREYSCALE1 = 0x01, // 1 bit per pixel + GREYSCALE2, // 2 bits per pixel + GREYSCALE4, // 4 bits per pixel + HIGHCOLOR // 16 bits per pixel +}; + +typedef colorMode_t ColorMode; + +typedef struct __attribute__((__packed__)) { + void *data; + uint16_t width; + uint16_t height; + colorMode_t colorMode; +} tImage; + +extern const tImage NoLogo; + +extern const tImage MarlinLogo112x38x1; +extern const tImage MarlinLogo228x255x2; +extern const tImage MarlinLogo228x255x4; +extern const tImage MarlinLogo195x59x16; +extern const tImage MarlinLogo320x240x16; +extern const tImage MarlinLogo480x320x16; +extern const tImage Background320x30x16; + +extern const tImage HotEnd_64x64x4; +extern const tImage Bed_64x64x4; +extern const tImage Bed_Heated_64x64x4; +extern const tImage Chamber_64x64x4; +extern const tImage Chamber_Heated_64x64x4; +extern const tImage Fan0_64x64x4; +extern const tImage Fan1_64x64x4; +extern const tImage Fan_Slow0_64x64x4; +extern const tImage Fan_Slow1_64x64x4; +extern const tImage Fan_Fast0_64x64x4; +extern const tImage Fan_Fast1_64x64x4; +extern const tImage SD_64x64x4; +extern const tImage Menu_64x64x4; +extern const tImage Settings_64x64x4; +extern const tImage Confirm_64x64x4; +extern const tImage Cancel_64x64x4; +extern const tImage Increase_64x64x4; +extern const tImage Decrease_64x64x4; +extern const tImage Pause_64x64x4; + +extern const tImage Feedrate_32x32x4; +extern const tImage Flowrate_32x32x4; +extern const tImage Directory_32x32x4; +extern const tImage Back_32x32x4; +extern const tImage Up_32x32x4; +extern const tImage Down_32x32x4; +extern const tImage Left_32x32x4; +extern const tImage Right_32x32x4; +extern const tImage Refresh_32x32x4; +extern const tImage Leveling_32x32x4; + +extern const tImage Slider8x16x4; + +extern const tImage Images[imgCount]; diff --git a/Marlin/src/lcd/tft/tft_io.h b/Marlin/src/lcd/tft/tft_io.h new file mode 100644 index 000000000000..bffe92b0ff30 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_io.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT + #include HAL_PATH(../../HAL, tft/tft_spi.h) +#elif HAS_FSMC_TFT + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) +#endif diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp new file mode 100644 index 000000000000..e77afaf716bf --- /dev/null +++ b/Marlin/src/lcd/tft/tft_queue.cpp @@ -0,0 +1,346 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_GRAPHICAL_TFT + +#include "tft_queue.h" +#include "tft.h" +#include "tft_image.h" + +uint8_t TFT_Queue::queue[]; +uint8_t *TFT_Queue::end_of_queue = queue; +uint8_t *TFT_Queue::current_task = NULL; +uint8_t *TFT_Queue::last_task = NULL; + +void TFT_Queue::reset() { + tft.abort(); + + end_of_queue = queue; + current_task = NULL; + last_task = NULL; +} + +void TFT_Queue::async() { + if (current_task == NULL) return; + queueTask_t *task = (queueTask_t *)current_task; + + // Check IO busy status + if (tft.is_busy()) return; + + if (task->state == TASK_STATE_COMPLETED) { + task = (queueTask_t *)task->nextTask; + current_task = (uint8_t *)task; + } + + finish_sketch(); + + switch (task->type) { + case TASK_END_OF_QUEUE: reset(); break; + case TASK_FILL: fill(task); break; + case TASK_CANVAS: canvas(task); break; + } +} + +void TFT_Queue::finish_sketch() { + if (last_task == NULL) return; + queueTask_t *task = (queueTask_t *)last_task; + + if (task->state == TASK_STATE_SKETCH) { + *end_of_queue = TASK_END_OF_QUEUE; + task->nextTask = end_of_queue; + task->state = TASK_STATE_READY; + + if (current_task == NULL) current_task = (uint8_t *)task; + } +} + +void TFT_Queue::fill(queueTask_t *task) { + uint16_t count; + parametersFill_t *task_parameters = (parametersFill_t *)(((uint8_t *)task) + sizeof(queueTask_t)); + + if (task->state == TASK_STATE_READY) { + tft.set_window(task_parameters->x, task_parameters->y, task_parameters->x + task_parameters->width - 1, task_parameters->y + task_parameters->height - 1); + task->state = TASK_STATE_IN_PROGRESS; + } + + if (task_parameters->count > 65535) { + count = 65535; + task_parameters->count -= 65535; + } + else { + count = task_parameters->count; + task_parameters->count = 0; + task->state = TASK_STATE_COMPLETED; + } + + tft.write_multiple(task_parameters->color, count); +} + +void TFT_Queue::canvas(queueTask_t *task) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)task) + sizeof(queueTask_t)); + + uint16_t i; + uint8_t *item = ((uint8_t *)task_parameters) + sizeof(parametersCanvas_t); + + if (task->state == TASK_STATE_READY) { + task->state = TASK_STATE_IN_PROGRESS; + Canvas.New(task_parameters->x, task_parameters->y, task_parameters->width, task_parameters->height); + } + Canvas.Continue(); + + for (i = 0; i < task_parameters->count; i++) { + switch (*item) { + case CANVAS_SET_BACKGROUND: + Canvas.SetBackground(((parametersCanvasBackground_t *)item)->color); + item += sizeof(parametersCanvasBackground_t); + break; + case CANVAS_ADD_TEXT: + Canvas.AddText(((parametersCanvasText_t *)item)->x, ((parametersCanvasText_t *)item)->y, ((parametersCanvasText_t *)item)->color, item + sizeof(parametersCanvasText_t), ((parametersCanvasText_t *)item)->maxWidth); + item += sizeof(parametersCanvasText_t) + ((parametersCanvasText_t *)item)->stringLength; + break; + + case CANVAS_ADD_IMAGE: + MarlinImage image; + uint16_t *colors; + colorMode_t color_mode; + + image = ((parametersCanvasImage_t *)item)->image; + colors = (uint16_t *)(item + sizeof(parametersCanvasImage_t)); + Canvas.AddImage(((parametersCanvasImage_t *)item)->x, ((parametersCanvasImage_t *)item)->y, image, colors); + + item = (uint8_t *)colors; + color_mode = Images[image].colorMode; + + switch (color_mode) { + case GREYSCALE1: + item += sizeof(uint16_t); + break; + case GREYSCALE2: + item += sizeof(uint16_t) * 3; + break; + case GREYSCALE4: + item += sizeof(uint16_t) * 15; + break; + default: + break; + } + break; + + case CANVAS_ADD_BAR: + Canvas.AddBar(((parametersCanvasBar_t *)item)->x, ((parametersCanvasBar_t *)item)->y, ((parametersCanvasBar_t *)item)->width, ((parametersCanvasBar_t *)item)->height, ((parametersCanvasBar_t *)item)->color); + item += sizeof(parametersCanvasBar_t); + break; + case CANVAS_ADD_RECTANGLE: + Canvas.AddRectangle(((parametersCanvasRectangle_t *)item)->x, ((parametersCanvasRectangle_t *)item)->y, ((parametersCanvasRectangle_t *)item)->width, ((parametersCanvasRectangle_t *)item)->height, ((parametersCanvasRectangle_t *)item)->color); + item += sizeof(parametersCanvasRectangle_t); + break; + } + } + + if (Canvas.ToScreen()) task->state = TASK_STATE_COMPLETED; +} + + +void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { + finish_sketch(); + + queueTask_t *task = (queueTask_t *)end_of_queue; + last_task = (uint8_t *)task; + + end_of_queue += sizeof(queueTask_t); + parametersFill_t *task_parameters = (parametersFill_t *)end_of_queue; + end_of_queue += sizeof(parametersFill_t); + + task_parameters->x = x; + task_parameters->y = y; + task_parameters->width = width; + task_parameters->height = height; + task_parameters->color = color; + task_parameters->count = width * height; + + *end_of_queue = TASK_END_OF_QUEUE; + task->nextTask = end_of_queue; + task->state = TASK_STATE_READY; + task->type = TASK_FILL; + + if (current_task == NULL) current_task = (uint8_t *)task; +} + +void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { + finish_sketch(); + + queueTask_t *task = (queueTask_t *)end_of_queue; + last_task = (uint8_t *) task; + + task->state = TASK_STATE_SKETCH; + task->type = TASK_CANVAS; + task->nextTask = NULL; + + end_of_queue += sizeof(queueTask_t); + parametersCanvas_t *task_parameters = (parametersCanvas_t *)end_of_queue; + end_of_queue += sizeof(parametersCanvas_t); + + task_parameters->x = x; + task_parameters->y = y; + task_parameters->width = width; + task_parameters->height = height; + task_parameters->count = 0; + + if (current_task == NULL) current_task = (uint8_t *)task; +} + +void TFT_Queue::set_background(uint16_t color) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasBackground_t *parameters = (parametersCanvasBackground_t *)end_of_queue; + + parameters->type = CANVAS_SET_BACKGROUND; + parameters->color = color; + + end_of_queue += sizeof(parametersCanvasBackground_t); + task_parameters->count++; +} + +void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasText_t *parameters = (parametersCanvasText_t *)end_of_queue; + + uint8_t *pointer = string; + + parameters->type = CANVAS_ADD_TEXT; + parameters->x = x; + parameters->y = y; + parameters->color = color; + parameters->stringLength = 0; + parameters->maxWidth = maxWidth; + + end_of_queue += sizeof(parametersCanvasText_t); + + /* TODO: Deal with maxWidth */ + while ((*(end_of_queue++) = *pointer++) != 0x00); + + parameters->stringLength = pointer - string; + task_parameters->count++; +} + +void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasImage_t *parameters = (parametersCanvasImage_t *)end_of_queue; + + parameters->type = CANVAS_ADD_IMAGE; + parameters->x = x; + parameters->y = y; + parameters->image = image; + + end_of_queue += sizeof(parametersCanvasImage_t); + task_parameters->count++; + + colorMode_t color_mode = Images[image].colorMode; + + if (color_mode == HIGHCOLOR) return; + + uint16_t *color = (uint16_t *)end_of_queue; + uint8_t number_of_color = 0; + + switch (color_mode) { + case GREYSCALE1: number_of_color = 1; break; + case GREYSCALE2: number_of_color = 3; break; + case GREYSCALE4: number_of_color = 15; break; + default: + break; + } + + while (number_of_color--) { + *color++ = *colors++; + } + + end_of_queue = (uint8_t *)color; +} + +uint16_t gradient(uint16_t colorA, uint16_t colorB, uint16_t factor) { + uint16_t red, green, blue; + + red = ( RED(colorA) * factor + RED(colorB) * (256 - factor)) >> 8; + green = (GREEN(colorA) * factor + GREEN(colorB) * (256 - factor)) >> 8; + blue = ( BLUE(colorA) * factor + BLUE(colorB) * (256 - factor)) >> 8; + + return RGB(red, green, blue); +} + +void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main, uint16_t color_background, uint16_t color_shadow) { + uint16_t colors[16]; + colorMode_t color_mode = Images[image].colorMode; + uint16_t i; + + switch (color_mode) { + case GREYSCALE1: + colors[1] = color_main; + break; + case GREYSCALE2: + for (i = 1; i < 4; i++) + colors[i] = gradient(color_main, color_background, (i << 8) / 3); + break; + case GREYSCALE4: + for (i = 1; i < 8; i++) + colors[i] = gradient(color_background, color_shadow, i << 5); + for (i = 8; i < 16; i++) + colors[i] = gradient(color_main, color_background, ((i - 8) << 8) / 7); + break; + default: + break; + } + + add_image(x, y, image, colors + 1); +} + +void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasBar_t *parameters = (parametersCanvasBar_t *)end_of_queue; + + parameters->type = CANVAS_ADD_BAR; + parameters->x = x; + parameters->y = y; + parameters->width = width; + parameters->height = height; + parameters->color = color; + + end_of_queue += sizeof(parametersCanvasBar_t); + task_parameters->count++; +} + +void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { + parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); + parametersCanvasRectangle_t *parameters = (parametersCanvasRectangle_t *)end_of_queue; + + parameters->type = CANVAS_ADD_RECTANGLE; + parameters->x = x; + parameters->y = y; + parameters->width = width; + parameters->height = height; + parameters->color = color; + + end_of_queue += sizeof(parametersCanvasRectangle_t); + task_parameters->count++; +} + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_queue.h b/Marlin/src/lcd/tft/tft_queue.h new file mode 100644 index 000000000000..9aa0d5b6c91d --- /dev/null +++ b/Marlin/src/lcd/tft/tft_queue.h @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfig.h" +#include "tft_string.h" +#include "tft_image.h" + +#define QUEUE_SIZE 8192 + +enum QueueTaskType : uint8_t { + TASK_END_OF_QUEUE = 0x00, + TASK_FILL, + TASK_CANVAS, +}; + +enum QueueTaskState : uint8_t { + TASK_STATE_READY = 0x00, + TASK_STATE_IN_PROGRESS, + TASK_STATE_COMPLETED, + TASK_STATE_SKETCH = 0xFF, +}; + +enum CanvasSubtype : uint8_t { + CANVAS_SET_BACKGROUND = 0x00, + CANVAS_ADD_TEXT, + CANVAS_ADD_IMAGE, + CANVAS_ADD_BAR, + CANVAS_ADD_RECTANGLE, +}; + +typedef struct __attribute__((__packed__)) { + QueueTaskType type; + QueueTaskState state; + uint8_t *nextTask; +} queueTask_t; + +typedef struct __attribute__((__packed__)) { + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + uint16_t color; + uint32_t count; +} parametersFill_t; + +typedef struct __attribute__((__packed__)) { + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + uint32_t count; +} parametersCanvas_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + uint16_t color; +} parametersCanvasBackground_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + uint16_t x; + uint16_t y; + uint16_t color; + uint32_t count; + uint16_t maxWidth; + uint16_t stringLength; +} parametersCanvasText_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + int16_t x; + int16_t y; + MarlinImage image; +} parametersCanvasImage_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + uint16_t color; +} parametersCanvasBar_t; + +typedef struct __attribute__((__packed__)) { + CanvasSubtype type; + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + uint16_t color; +} parametersCanvasRectangle_t; + +class TFT_Queue { + private: + static uint8_t queue[QUEUE_SIZE]; + static uint8_t *end_of_queue; + static uint8_t *current_task; + static uint8_t *last_task; + + static void finish_sketch(); + static void fill(queueTask_t *task); + static void canvas(queueTask_t *task); + + public: + static void reset(); + static void async(); + static void sync() { while (current_task != NULL) async(); } + + static void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); + static void canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height); + static void set_background(uint16_t color); + static void add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth); + + static void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors); + static void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main, uint16_t color_background, uint16_t color_shadow); + + static void add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); + static void add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); +}; diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp new file mode 100644 index 000000000000..f4e203445daf --- /dev/null +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -0,0 +1,159 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_GRAPHICAL_TFT + +#include "tft_string.h" +#include "../fontutils.h" + +//#define DEBUG_TFT_FONT +#define DEBUG_OUT ENABLED(DEBUG_TFT_FONT) +#include "../../core/debug_out.h" + +glyph_t *TFT_String::glyphs[256]; +font_t *TFT_String::font_header; + +uint8_t TFT_String::data[]; +uint16_t TFT_String::span; +uint16_t TFT_String::length; + +void TFT_String::set_font(const uint8_t *font) { + font_header = (font_t *)font; + uint32_t glyph; + + for (glyph = 0; glyph < 256; glyph++) glyphs[glyph] = NULL; + + DEBUG_ECHOLNPAIR("Format: ", font_header->Format); + DEBUG_ECHOLNPAIR("BBXWidth: ", font_header->BBXWidth); + DEBUG_ECHOLNPAIR("BBXHeight: ", font_header->BBXHeight); + DEBUG_ECHOLNPAIR("BBXOffsetX: ", font_header->BBXOffsetX); + DEBUG_ECHOLNPAIR("BBXOffsetY: ", font_header->BBXOffsetY); + DEBUG_ECHOLNPAIR("CapitalAHeight: ", font_header->CapitalAHeight); + DEBUG_ECHOLNPAIR("Encoding65Pos: ", font_header->Encoding65Pos); + DEBUG_ECHOLNPAIR("Encoding97Pos: ", font_header->Encoding97Pos); + DEBUG_ECHOLNPAIR("FontStartEncoding: ", font_header->FontStartEncoding); + DEBUG_ECHOLNPAIR("FontEndEncoding: ", font_header->FontEndEncoding); + DEBUG_ECHOLNPAIR("LowerGDescent: ", font_header->LowerGDescent); + DEBUG_ECHOLNPAIR("FontAscent: ", font_header->FontAscent); + DEBUG_ECHOLNPAIR("FontDescent: ", font_header->FontDescent); + DEBUG_ECHOLNPAIR("FontXAscent: ", font_header->FontXAscent); + DEBUG_ECHOLNPAIR("FontXDescent: ", font_header->FontXDescent); + + add_glyphs(font); +} + +void TFT_String::add_glyphs(const uint8_t *font) { + uint32_t glyph; + uint8_t *pointer = (uint8_t *)font + sizeof(font_t); + + for (glyph = ((font_t *)font)->FontStartEncoding; glyph <= ((font_t *)font)->FontEndEncoding; glyph++) { + if (*pointer != NO_GLYPH) { + glyphs[glyph] = (glyph_t *)pointer; + pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->DataSize; + } + else { + pointer++; + } + } +} + +void TFT_String::set() { + *data = 0x00; + span = 0; + length = 0; +} + +uint8_t read_byte(uint8_t *byte) { return *byte; } + +void TFT_String::add(uint8_t *string, uint8_t index, uint8_t *itemString) { + uint8_t character; + wchar_t wchar; + + while (*string) { + string = get_utf8_value_cb(string, read_byte, &wchar); + if (wchar > 255) + wchar |= 0x0080; + character = (uint8_t) (wchar & 0x00FF); + + if (character == '=' || character == '~' || character == '*') { + if (index >= 0) { + if (character == '*') + add_character('E'); + add_character(index + ((character == '=') ? '0' : LCD_FIRST_TOOL)); + } + else { + add(index == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED)); + } + continue; + } + else if (character == '$' && itemString) { + add(itemString); + continue; + } + + add_character(character); + } + eol(); +} + +void TFT_String::add_character(uint8_t character) { + if (length < MAX_STRING_LENGTH) { + data[length] = character; + length++; + span += glyph(character)->DWidth; + } +} + +void TFT_String::rtrim(uint8_t character) { + while (length) { + if (data[length - 1] == 0x20 || data[length - 1] == character) { + length--; + span -= glyph(data[length])->DWidth; + eol(); + } + else { + break; + } + } +} + +void TFT_String::ltrim(uint8_t character) { + uint16_t i, j; + for (i = 0; (i < length) && (data[i] == 0x20 || data[i] == character); i++) { + span -= glyph(data[i])->DWidth; + } + if (i == 0) return; + for (j = 0; i < length; data[j++] = data[i++]); + length = j; + eol(); +} + +void TFT_String::trim(uint8_t character) { + rtrim(character); + ltrim(character); +} + +TFT_String tft_string; + +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h new file mode 100644 index 000000000000..b4c94953f759 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_string.h @@ -0,0 +1,104 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +extern const uint8_t ISO10646_1_5x7[]; +extern const uint8_t font10x20[]; + +extern const uint8_t Helvetica12Bold[]; + +extern const uint8_t Helvetica14[], Helvetica14_symbols[]; +extern const uint8_t Helvetica18[], Helvetica18_symbols[]; + +#define NO_GLYPH 0xFF + +typedef struct __attribute__((__packed__)) { + uint8_t Format; + uint8_t BBXWidth; + uint8_t BBXHeight; + int8_t BBXOffsetX; + int8_t BBXOffsetY; + uint8_t CapitalAHeight; + uint16_t Encoding65Pos; + uint16_t Encoding97Pos; + uint8_t FontStartEncoding; + uint8_t FontEndEncoding; + int8_t LowerGDescent; + int8_t FontAscent; + int8_t FontDescent; + int8_t FontXAscent; + int8_t FontXDescent; +} font_t; + +typedef struct __attribute__((__packed__)) { + uint8_t BBXWidth; + uint8_t BBXHeight; + uint8_t DataSize; + int8_t DWidth; + int8_t BBXOffsetX; + int8_t BBXOffsetY; +} glyph_t; + +#define MAX_STRING_LENGTH 64 + +class TFT_String { + private: + static glyph_t *glyphs[256]; + static font_t *font_header; + + static uint8_t data[MAX_STRING_LENGTH + 1]; + static uint16_t span; // in pixels + static uint16_t length; // in characters + + static void add_character(uint8_t character); + static void eol() { data[length] = 0x00; } + + public: + static void set_font(const uint8_t *font); + static void add_glyphs(const uint8_t *font); + + static font_t *font() { return font_header; }; + static uint16_t font_height() { return font_header->FontAscent - font_header->FontDescent; } + static glyph_t *glyph(uint8_t character) { return glyphs[character] == NULL ? glyphs[0x3F] : glyphs[character]; } /* Use '?' for unknown glyphs */ + static inline glyph_t *glyph(uint8_t *character) { return glyph(*character); } + + static void set(); + static void add(uint8_t character) { add_character(character); eol(); } + static void add(uint8_t *string) { while (*string) { add_character(*string++); } eol(); } + static void add(uint8_t *string, uint8_t index, uint8_t *itemString = NULL); + static void set(uint8_t *string) { set(); add(string); }; + static void set(uint8_t *string, uint8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; + static inline void set(const char *string) { set((uint8_t *)string); } + static inline void set(const char *string, uint8_t index, const char *itemString = NULL) { set((uint8_t *)string, index, itemString); } + static inline void add(const char *string) { add((uint8_t *)string); } + + static void trim(uint8_t character = 0x20); + static void rtrim(uint8_t character = 0x20); + static void ltrim(uint8_t character = 0x20); + static uint16_t width() { return span; } + static uint8_t *string() { return data; } + static uint16_t center(uint16_t width) { return span > width ? 0 : (width - span) / 2; } +}; + +extern TFT_String tft_string; diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp new file mode 100644 index 000000000000..3407389f27b6 --- /dev/null +++ b/Marlin/src/lcd/tft/touch.cpp @@ -0,0 +1,293 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_SCREEN) + +#include "touch.h" +#include "pinconfig.h" + +#include "../ultralcd.h" +#include "../menu/menu.h" +#include "../../module/temperature.h" +#include "../../module/planner.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#include "tft.h" + +int16_t Touch::x, Touch::y; +touch_control_t Touch::controls[]; +touch_control_t *Touch::current_control; +uint16_t Touch::controls_count; +millis_t Touch::now = 0; +millis_t Touch::time_to_hold; +millis_t Touch::repeat_delay; +millis_t Touch::touch_time; +TouchControlType Touch::touch_control_type = NONE; +touch_calibration_t Touch::calibration; +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + calibrationState Touch::calibration_state = CALIBRATION_NONE; + touch_calibration_point_t Touch::calibration_points[4]; +#endif + +void Touch::init() { + calibration_reset(); + reset(); + io.Init(); +} + +void Touch::add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data) { + if (controls_count == MAX_CONTROLS) return; + + controls[controls_count].type = type; + controls[controls_count].x = x; + controls[controls_count].y = y; + controls[controls_count].width = width; + controls[controls_count].height = height; + controls[controls_count].data = data; + controls_count++; +} + +void Touch::idle() { + uint16_t i; + int16_t _x, _y; + + if (now == millis()) return; + now = millis(); + + if (get_point(&_x, &_y)) { + #if LCD_TIMEOUT_TO_STATUS + ui.return_to_status_ms = now + LCD_TIMEOUT_TO_STATUS; + #endif + + if (touch_time) { + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + if (touch_control_type == NONE && ELAPSED(now, touch_time + TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) + ui.goto_screen(touch_screen_calibration); + #endif + return; + } + + if (time_to_hold == 0) time_to_hold = now + MINIMUM_HOLD_TIME; + if (PENDING(now, time_to_hold)) return; + + if (x != 0 && y != 0) { + if (current_control) { + if (WITHIN(x, current_control->x - FREE_MOVE_RANGE, current_control->x + current_control->width + FREE_MOVE_RANGE) && WITHIN(y, current_control->y - FREE_MOVE_RANGE, current_control->y + current_control->height + FREE_MOVE_RANGE)) { + NOLESS(x, current_control->x); + NOMORE(x, current_control->x + current_control->width); + NOLESS(y, current_control->y); + NOMORE(y, current_control->y + current_control->height); + touch(current_control); + } + else { + current_control = NULL; + } + } + else { + for (i = 0; i < controls_count; i++) { + if ((WITHIN(x, controls[i].x, controls[i].x + controls[i].width) && WITHIN(y, controls[i].y, controls[i].y + controls[i].height)) || (TERN(TOUCH_SCREEN_CALIBRATION, controls[i].type == CALIBRATE, false))) { + touch_control_type = controls[i].type; + touch(&controls[i]); + break; + } + } + } + + if (current_control == NULL) + touch_time = now; + } + x = _x; + y = _y; + } + else { + x = y = 0; + current_control = NULL; + touch_time = 0; + touch_control_type = NONE; + time_to_hold = 0; + repeat_delay = TOUCH_REPEAT_DELAY; + } +} + +void Touch::touch(touch_control_t *control) { + switch (control->type) { + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + case CALIBRATE: + ui.refresh(); + + if (calibration_state < CALIBRATION_SUCCESS) { + calibration_points[calibration_state].x = int16_t(control->data >> 16); + calibration_points[calibration_state].y = int16_t(control->data & 0xFFFF); + calibration_points[calibration_state].raw_x = x; + calibration_points[calibration_state].raw_y = y; + } + + switch (calibration_state) { + case CALIBRATION_POINT_1: calibration_state = CALIBRATION_POINT_2; break; + case CALIBRATION_POINT_2: calibration_state = CALIBRATION_POINT_3; break; + case CALIBRATION_POINT_3: calibration_state = CALIBRATION_POINT_4; break; + case CALIBRATION_POINT_4: + if (validate_precision_x(0, 1) && validate_precision_x(2, 3) && validate_precision_y(0, 2) && validate_precision_y(1, 3)) { + calibration_state = CALIBRATION_SUCCESS; + calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_x + calibration_points[2].raw_x - calibration_points[1].raw_x - calibration_points[0].raw_x); + calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_y - calibration_points[2].raw_y + calibration_points[1].raw_y - calibration_points[0].raw_y); + calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_x + calibration_points[1].raw_x) * calibration.x) >> 17); + calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_y + calibration_points[2].raw_y) * calibration.y) >> 17); + calibration.orientation = TOUCH_LANDSCAPE; + } + else if (validate_precision_y(0, 1) && validate_precision_y(2, 3) && validate_precision_x(0, 2) && validate_precision_x(1, 3)) { + calibration_state = CALIBRATION_SUCCESS; + calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_y + calibration_points[2].raw_y - calibration_points[1].raw_y - calibration_points[0].raw_y); + calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_x - calibration_points[2].raw_x + calibration_points[1].raw_x - calibration_points[0].raw_x); + calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_y + calibration_points[1].raw_y) * calibration.x) >> 17); + calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_x + calibration_points[2].raw_x) * calibration.y) >> 17); + calibration.orientation = TOUCH_PORTRAIT; + } + else { + calibration_state = CALIBRATION_FAIL; + calibration_reset(); + } + + if (calibration_state == CALIBRATION_SUCCESS) { + SERIAL_ECHOLN("Touch screen calibration completed"); + SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_X ", calibration.x); + SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_Y ", calibration.y); + SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x); + SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y); + SERIAL_ECHO("TOUCH_ORIENTATION "); if (calibration.orientation == TOUCH_LANDSCAPE) SERIAL_ECHOLN("TOUCH_LANDSCAPE"); else SERIAL_ECHOLN("TOUCH_PORTRAIT"); + } + break; + default: break; + } + break; + #endif // TOUCH_SCREEN_CALIBRATION + + case MENU_SCREEN: ui.goto_screen((screenFunc_t)control->data); break; + case BACK: ui.goto_previous_screen(); break; + case CLICK: ui.lcd_clicked = true; break; + #if HAS_RESUME_CONTINUE + case RESUME_CONTINUE: extern bool wait_for_user; wait_for_user = false; break; + #endif + case CANCEL: ui.encoderPosition = 0; ui.selection = false; ui.lcd_clicked = true; break; + case CONFIRM: ui.encoderPosition = 1; ui.selection = true; ui.lcd_clicked = true; break; + case MENU_ITEM: ui.encoderPosition = control->data; ui.refresh(); break; + case PAGE_UP: + encoderTopLine = encoderTopLine > LCD_HEIGHT ? encoderTopLine - LCD_HEIGHT : 0; + ui.encoderPosition = ui.encoderPosition > LCD_HEIGHT ? ui.encoderPosition - LCD_HEIGHT : 0; + ui.refresh(); + break; + case PAGE_DOWN: + encoderTopLine = encoderTopLine + 2 * LCD_HEIGHT < screen_items ? encoderTopLine + LCD_HEIGHT : screen_items - LCD_HEIGHT; + ui.encoderPosition = ui.encoderPosition + LCD_HEIGHT < (uint32_t)screen_items ? ui.encoderPosition + LCD_HEIGHT : screen_items; + ui.refresh(); + break; + case SLIDER: hold(control); ui.encoderPosition = (x - control->x) * control->data / control->width; break; + case INCREASE: hold(control, repeat_delay - 5); TERN(AUTO_BED_LEVELING_UBL, ui.external_control ? ubl.encoder_diff++ : ui.encoderPosition++, ui.encoderPosition++); break; + case DECREASE: hold(control, repeat_delay - 5); TERN(AUTO_BED_LEVELING_UBL, ui.external_control ? ubl.encoder_diff-- : ui.encoderPosition--, ui.encoderPosition--); break; + case HEATER: + int8_t heater; + heater = control->data; + ui.clear_lcd(); + if (heater >= 0) { // HotEnd + #if HOTENDS == 1 + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.heater_maxtemp[0] - 15, []{ thermalManager.start_watching_hotend(0); }); + #else + MenuItemBase::itemIndex = heater; + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.heater_maxtemp[heater] - 15, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + #endif + } + #if HAS_HEATED_BED + else if (heater == H_BED) { + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); + } + #endif + #if HAS_HEATED_CHAMBER + else if (heater == H_CHAMBER) { + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); + } + #endif + break; + case FAN: + ui.clear_lcd(); + static uint8_t fan, fan_speed; + fan = 0; + fan_speed = thermalManager.fan_speed[fan]; + MenuItem_percent::action((const char *)GET_TEXT_F(MSG_FIRST_FAN_SPEED), &fan_speed, 0, 255, []{ thermalManager.set_fan_speed(fan, fan_speed); }); + break; + case FEEDRATE: + ui.clear_lcd(); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_SPEED), &feedrate_percentage, 10, 999); + break; + case FLOWRATE: + ui.clear_lcd(); + MenuItemBase::itemIndex = control->data; + #if EXTRUDERS == 1 + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_FLOW), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); + #else + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_FLOW_N), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); + #endif + break; + + #if ENABLED(AUTO_BED_LEVELING_UBL) + case UBL: hold(control, UBL_REPEAT_DELAY); ui.encoderPosition += control->data; break; + #endif + + default: break; + } +} + +void Touch::hold(touch_control_t *control, millis_t delay) { + current_control = control; + if (delay) { + repeat_delay = delay > MIN_REPEAT_DELAY ? delay : MIN_REPEAT_DELAY; + time_to_hold = now + repeat_delay; + } + ui.refresh(); +} + +bool Touch::get_point(int16_t *x, int16_t *y) { + bool is_touched = (calibration.orientation == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); + + if (is_touched && calibration.orientation != TOUCH_ORIENTATION_NONE) { + *x = int16_t((int32_t(*x) * calibration.x) >> 16) + calibration.offset_x; + *y = int16_t((int32_t(*y) * calibration.y) >> 16) + calibration.offset_y; + } + return is_touched; +} +Touch touch; + +bool MarlinUI::touch_pressed() { + return touch.is_clicked(); +} + +void add_control(uint16_t x, uint16_t y, TouchControlType control_type, int32_t data, MarlinImage image, bool is_enabled, uint16_t color_enabled, uint16_t color_disabled) { + uint16_t width = Images[image].width; + uint16_t height = Images[image].height; + tft.canvas(x, y, width, height); + tft.add_image(0, 0, image, is_enabled ? color_enabled : color_disabled); + if (is_enabled) + touch.add_control(control_type, x, y, width, height, data); +} + +#endif // TOUCH_SCREEN diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h new file mode 100644 index 000000000000..f3e53ae461c5 --- /dev/null +++ b/Marlin/src/lcd/tft/touch.h @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(TOUCH_SCREEN) + +#include "tft_color.h" +#include "tft_image.h" + +#include HAL_PATH(../../HAL, tft/xpt2046.h) +#define TOUCH_DRIVER XPT2046 + +#ifndef TOUCH_SCREEN_CALIBRATION_PRECISION + #define TOUCH_SCREEN_CALIBRATION_PRECISION 80 +#endif + +#ifndef TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS + #define TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS 2500 +#endif + +#define TOUCH_ORIENTATION_NONE 0 +#define TOUCH_LANDSCAPE 1 +#define TOUCH_PORTRAIT 2 + +#if !(defined(TOUCH_CALIBRATION_X) || defined(TOUCH_CALIBRATION_Y) || defined(TOUCH_OFFSET_X) || defined(TOUCH_OFFSET_Y) || defined(TOUCH_ORIENTATION)) + #if defined(XPT2046_X_CALIBRATION) && defined(XPT2046_Y_CALIBRATION) && defined(XPT2046_X_OFFSET) && defined(XPT2046_Y_OFFSET) + #define TOUCH_CALIBRATION_X XPT2046_X_CALIBRATION + #define TOUCH_CALIBRATION_Y XPT2046_Y_CALIBRATION + #define TOUCH_OFFSET_X XPT2046_X_OFFSET + #define TOUCH_OFFSET_Y XPT2046_Y_OFFSET + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE + #else + #define TOUCH_CALIBRATION_X 0 + #define TOUCH_CALIBRATION_Y 0 + #define TOUCH_OFFSET_X 0 + #define TOUCH_OFFSET_Y 0 + #define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE + #endif +#endif + +// Menu Navigation +extern int8_t encoderTopLine, encoderLine, screen_items; + +enum TouchControlType : uint16_t { + NONE = 0x0000, + CALIBRATE, + MENU_SCREEN, + MENU_ITEM, + BACK, + PAGE_UP, + PAGE_DOWN, + CLICK, + RESUME_CONTINUE, + SLIDER, + INCREASE, + DECREASE, + CANCEL, + CONFIRM, + HEATER, + FAN, + FEEDRATE, + FLOWRATE, + UBL, +}; + +typedef void (*screenFunc_t)(); + +void add_control(uint16_t x, uint16_t y, TouchControlType control_type, int32_t data, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED); +inline void add_control(uint16_t x, uint16_t y, TouchControlType control_type, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, control_type, 0, image, is_enabled, color_enabled, color_disabled); } +inline void add_control(uint16_t x, uint16_t y, screenFunc_t screen, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, MENU_SCREEN, (int32_t)screen, image, is_enabled, color_enabled, color_disabled); } + +typedef struct __attribute__((__packed__)) { + TouchControlType type; + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + int32_t data; +} touch_control_t; + +typedef struct __attribute__((__packed__)) { + int32_t x; + int32_t y; + int16_t offset_x; + int16_t offset_y; + uint8_t orientation; +} touch_calibration_t; + +typedef struct __attribute__((__packed__)) { + uint16_t x; + uint16_t y; + int16_t raw_x; + int16_t raw_y; +} touch_calibration_point_t; + +enum calibrationState : uint8_t { + CALIBRATION_POINT_1 = 0x00, + CALIBRATION_POINT_2, + CALIBRATION_POINT_3, + CALIBRATION_POINT_4, + CALIBRATION_SUCCESS, + CALIBRATION_FAIL, + CALIBRATION_NONE, +}; + +#define MAX_CONTROLS 16 +#define MINIMUM_HOLD_TIME 15 +#define TOUCH_REPEAT_DELAY 75 +#define MIN_REPEAT_DELAY 25 +#define UBL_REPEAT_DELAY 125 +#define FREE_MOVE_RANGE 32 + +class Touch { + private: + static TOUCH_DRIVER io; + static int16_t x, y; + + static touch_control_t controls[MAX_CONTROLS]; + static touch_control_t *current_control; + static uint16_t controls_count; + + static millis_t now; + static millis_t time_to_hold; + static millis_t repeat_delay; + static millis_t touch_time; + static TouchControlType touch_control_type; + + static inline bool get_point(int16_t *x, int16_t *y); + static void touch(touch_control_t *control); + static void hold(touch_control_t *control, millis_t delay = 0); + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static calibrationState calibration_state; + static touch_calibration_point_t calibration_points[4]; + + static bool validate_precision(int32_t a, int32_t b) { return (a > b ? (100 * b) / a : (100 * a) / b) > TOUCH_SCREEN_CALIBRATION_PRECISION; } + static bool validate_precision_x(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_x, calibration_points[b].raw_x); } + static bool validate_precision_y(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_y, calibration_points[b].raw_y); } + #endif // TOUCH_SCREEN_CALIBRATION + + public: + static void init(); + static void reset() { controls_count = 0; touch_time = -1; current_control = NULL; } + static void clear() { controls_count = 0; } + static void idle(); + static bool is_clicked() { return touch_control_type == CLICK; } + + static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data = 0); + + static touch_calibration_t calibration; + static void calibration_reset() { calibration = {TOUCH_CALIBRATION_X, TOUCH_CALIBRATION_Y, TOUCH_OFFSET_X, TOUCH_OFFSET_Y, TOUCH_ORIENTATION}; } + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static calibrationState calibration_start() { calibration = {0, 0, 0, 0, TOUCH_ORIENTATION_NONE}; return calibration_state = CALIBRATION_POINT_1; } + static void calibration_end() { calibration_state = CALIBRATION_NONE; } + static calibrationState get_calibration_state() { return calibration_state; } + #endif // TOUCH_SCREEN_CALIBRATION +}; + +extern Touch touch; + +#endif // TOUCH_SCREEN diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp new file mode 100644 index 000000000000..0b800abc3912 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -0,0 +1,653 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_UI_320x240 + +#include "ui_320x240.h" + +#include "../ultralcd.h" +#include "../menu/menu.h" +#include "../../libs/numtostr.h" + +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/printcounter.h" +#include "../../module/planner.h" +#include "../../module/motion.h" + +#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + #include "../../feature/filwidth.h" + #include "../../gcode/parser.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if !HAS_LCD_MENU + #error "Seriously? High resolution TFT screen without menu?" +#endif + +static bool draw_menu_navigation = false; + +void MarlinUI::tft_idle() { + #if ENABLED(TOUCH_SCREEN) + if (draw_menu_navigation) { + add_control(48, 206, PAGE_UP, imgPageUp, encoderTopLine > 0); + add_control(240, 206, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); + add_control(144, 206, BACK, imgBack); + draw_menu_navigation = false; + } + #endif + + tft.queue.async(); + TERN_(TOUCH_SCREEN, touch.idle()); +} + +void MarlinUI::init_lcd() { + tft.init(); + tft.set_font(MENU_FONT_NAME); + #ifdef SYMBOLS_FONT_NAME + tft.add_glyphs(SYMBOLS_FONT_NAME); + #endif + TERN_(TOUCH_SCREEN, touch.init()); + clear_lcd(); +} + +bool MarlinUI::detected() { return true; } + +void MarlinUI::clear_lcd() { + #if ENABLED(TOUCH_SCREEN) + touch.reset(); + draw_menu_navigation = false; + #endif + + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); +} + +#if ENABLED(SHOW_BOOTSCREEN) + #ifndef BOOTSCREEN_TIMEOUT + #define BOOTSCREEN_TIMEOUT 1500 + #endif + + void MarlinUI::show_bootscreen() { + tft.queue.reset(); + + tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); + tft.add_image(0, 0, imgBootScreen); // MarlinLogo320x240x16 + + #ifdef WEBSITE_URL + tft.add_text(4, 188, COLOR_WEBSITE_URL, WEBSITE_URL); + #endif + + tft.queue.sync(); + safe_delay(BOOTSCREEN_TIMEOUT); + clear_lcd(); + } +#endif // SHOW_BOOTSCREEN + +void MarlinUI::draw_kill_screen() { + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_KILL_SCREEN_BG); + + tft.canvas(0, 60, TFT_WIDTH, 20); + tft.set_background(COLOR_KILL_SCREEN_BG); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); + + tft.canvas(0, 120, TFT_WIDTH, 20); + tft.set_background(COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_HALTED)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); + + tft.canvas(0, 160, TFT_WIDTH, 20); + tft.set_background(COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_PLEASE_RESET)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); + + tft.queue.sync(); +} + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { + MarlinImage image = imgHotEnd; + uint16_t Color; + float currentTemperature, targetTemperature; + + if (Heater >= 0) { // HotEnd + currentTemperature = thermalManager.degHotend(Heater); + targetTemperature = thermalManager.degTargetHotend(Heater); + } +#if HAS_HEATED_BED + else if (Heater == H_BED) { + currentTemperature = thermalManager.degBed(); + targetTemperature = thermalManager.degTargetBed(); + } +#endif // HAS_HEATED_BED +#if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + currentTemperature = thermalManager.degChamber(); + #if HAS_HEATED_CHAMBER + targetTemperature = thermalManager.degTargetChamber(); + #else + targetTemperature = ABSOLUTE_ZERO; + #endif + } +#endif // HAS_TEMP_CHAMBER + else return; + + TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 64, 100, Heater)); + tft.canvas(x, y, 64, 100); + tft.set_background(COLOR_BACKGROUND); + + Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; + + if (Heater >= 0) { // HotEnd + if (currentTemperature >= 50) Color = COLOR_HOTEND; + } + #if HAS_HEATED_BED + else if (Heater == H_BED) { + if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + image = targetTemperature > 0 ? imgBedHeated : imgBed; + } + #endif // HAS_HEATED_BED + #if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + if (currentTemperature >= 50) Color = COLOR_CHAMBER; + image = targetTemperature > 0 ? imgChamberHeated : imgChamber; + } + #endif // HAS_TEMP_CHAMBER + + tft.add_image(0, 18, image, Color); + + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(64) + 2, 72, Color, tft_string); + + if (targetTemperature >= 0) { + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(64) + 2, 8, Color, tft_string); + + } +} + +void draw_fan_status(uint16_t x, uint16_t y, const bool blink) { + TERN_(TOUCH_SCREEN, touch.add_control(FAN, x, y, 64, 100)); + tft.canvas(x, y, 64, 100); + tft.set_background(COLOR_BACKGROUND); + + uint8_t fanSpeed = thermalManager.fan_speed[0]; + MarlinImage image; + + if (fanSpeed >= 127) + image = blink ? imgFanFast1 : imgFanFast0; + else if (fanSpeed > 0) + image = blink ? imgFanSlow1 : imgFanSlow0; + else + image = imgFanIdle; + + tft.add_image(0, 10, image, COLOR_FAN); + + tft_string.set((uint8_t *)ui8tostr4pctrj(thermalManager.fan_speed[0])); + tft_string.trim(); + tft.add_text(tft_string.center(64) + 6, 72, COLOR_FAN, tft_string); +} + +void MarlinUI::draw_status_screen() { + const bool blink = get_blink(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + // heaters and fan + uint16_t i, x, y = POS_Y; + + for (i = 0 ; i < ITEMS_COUNT; i++) { + x = (320 / ITEMS_COUNT - 64) / 2 + (320 * i / ITEMS_COUNT); + switch (i) { + #ifdef ITEM_E0 + case ITEM_E0: draw_heater_status(x, y, H_E0); break; + #endif + #ifdef ITEM_E1 + case ITEM_E1: draw_heater_status(x, y, H_E1); break; + #endif + #ifdef ITEM_E2 + case ITEM_E2: draw_heater_status(x, y, H_E2); break; + #endif + #ifdef ITEM_BED + case ITEM_BED: draw_heater_status(x, y, H_BED); break; + #endif + #ifdef ITEM_CHAMBER + case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; + #endif + #ifdef ITEM_FAN + case ITEM_FAN: draw_fan_status(x, y, blink); break; + #endif + } + } + + // coordinates + tft.canvas(4, 103, 312, 24); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, 312, 24, COLOR_AXIS_HOMED); + + uint16_t color; + uint16_t offset; + bool is_homed; + + tft.add_text( 10, 3, COLOR_AXIS_HOMED , "X"); + tft.add_text(127, 3, COLOR_AXIS_HOMED , "Y"); + tft.add_text(219, 3, COLOR_AXIS_HOMED , "Z"); + + is_homed = TEST(axis_homed, X_AXIS); + tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft.add_text( 68 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + is_homed = TEST(axis_homed, Y_AXIS); + tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text(185 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + is_homed = TEST(axis_homed, Z_AXIS); + if (blink & !is_homed) { + tft_string.set("?"); + offset = 25; // ".00" + } + else { + const float z = LOGICAL_Z_POSITION(current_position.z); + tft_string.set(ftostr52sp((int16_t)z)); + tft_string.rtrim(); + offset = tft_string.width(); + + tft_string.set(ftostr52sp(z)); + offset += 25 - tft_string.width(); + } + tft.add_text(301 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + // feed rate + tft.canvas(70, 136, 80, 32); + tft.set_background(COLOR_BACKGROUND); + color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFeedRate, color); + tft_string.set(i16tostr3rj(feedrate_percentage)); + tft_string.add('%'); + tft.add_text(32, 6, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 70, 136, 80, 32)); + + // flow rate + tft.canvas(170, 136, 80, 32); + tft.set_background(COLOR_BACKGROUND); + color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFlowRate, color); + tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); + tft_string.add('%'); + tft.add_text(32, 6, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 170, 136, 80, 32, active_extruder)); + + // print duration + char buffer[14]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toDigital(buffer); + + tft.canvas(96, 176, 128, 20); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(buffer); + tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); + + // progress bar + const uint8_t progress = ui.get_progress_percent(); + tft.canvas(4, 198, 312, 9); + tft.set_background(COLOR_PROGRESS_BG); + tft.add_rectangle(0, 0, 312, 9, COLOR_PROGRESS_FRAME); + if (progress) + tft.add_bar(1, 1, (310 * progress) / 100, 7, COLOR_PROGRESS_BAR); + + // status message + tft.canvas(0, 216, 320, 20); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); + + #if ENABLED(TOUCH_SCREEN) + add_control(256, 130, menu_main, imgSettings); + TERN_(SDSUPPORT, add_control(0, 130, menu_media, imgSD, card.isMounted() && !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + #endif +} + +// Draw a static item with no left-right margin required. Centered by default. +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + menu_item(row); + tft_string.set(pstr, itemIndex, itemString); + if (valstr) + tft_string.add(valstr); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); +} + +// Draw a generic menu item with pre_char (if selected) and post_char +void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { + menu_item(row, sel); + + uint8_t *string = (uint8_t *)pstr; + MarlinImage image = noImage; + switch (*string) { + case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH + case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER + } + + uint8_t offset = MENU_TEXT_X_OFFSET; + if (image != noImage) { + string++; + offset = 32; + tft.add_image(0, 0, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + } + + tft_string.set(string, itemIndex, itemString); + tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); +} + +// Draw a menu item with a (potentially) editable value +void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + menu_item(row, sel); + + tft_string.set(pstr, itemIndex, itemString); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + if (data) { + tft_string.set(data); + tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } +} + +// Low-level draw_edit_screen can be used to draw an edit screen from anyplace +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + ui.encoder_direction_normal(); + TERN_(TOUCH_SCREEN, touch.clear()); + + uint16_t line = 1; + + menu_line(line++); + tft_string.set(pstr, itemIndex, itemString); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + + TERN_(AUTO_BED_LEVELING_UBL, if (ui.external_control) line++); // ftostr52() will overwrite *value so *value has to be displayed first + + menu_line(line); + tft_string.set(value); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + if (ui.external_control) { + menu_line(line - 1); + + tft_string.set(X_LBL); + tft.add_text(52, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.x))); + tft_string.trim(); + tft.add_text(144 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft_string.set(Y_LBL); + tft.add_text(176, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.y))); + tft_string.trim(); + tft.add_text(268 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } + #endif + + extern screenFunc_t _manual_move_func_ptr; + if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { + + #define SLIDER_LENGHT 224 + #define SLIDER_Y_POSITION 140 + + tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); + tft.set_background(COLOR_BACKGROUND); + + int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; + tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); + tft.add_bar(1, 6, position, 4, COLOR_SLIDER); + tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); + tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); + + #if ENABLED(TOUCH_SCREEN) + tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); + touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); + #endif + } + + #if ENABLED(TOUCH_SCREEN) + add_control(32, 176, DECREASE, imgDecrease); + add_control(224, 176, INCREASE, imgIncrease); + add_control(128, 176, CLICK, imgConfirm); + #endif +} + +// The Select Screen presents a prompt and two "buttons" +void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { + uint16_t line = 1; + + if (string == NULL) line++; + + menu_line(line++); + tft_string.set(pref); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + + if (string) { + menu_line(line++); + tft_string.set(string); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + } + + if (suff) { + menu_line(line); + tft_string.set(suff); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + } + #if ENABLED(TOUCH_SCREEN) + add_control(48, 176, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + add_control(208, 176, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + #endif +} + +#if ENABLED(SDSUPPORT) + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + menu_item(row, sel); + if (isDir) + tft.add_image(0, 0, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + tft.add_text(32, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); + } +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + touch.add_control(RESUME_CONTINUE , 0, 0, 320, 240); + #endif + + menu_line(row); + tft_string.set(GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE)); + tft_string.add('E'); + tft_string.add((char)('1' + extruder)); + tft_string.add(' '); + tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.add(" / "); + tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + } +#endif // ADVANCED_PAUSE_FEATURE + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #define GRID_OFFSET_X 8 + #define GRID_OFFSET_Y 8 + #define GRID_WIDTH 144 + #define GRID_HEIGHT 144 + #define CONTROL_OFFSET 8 + + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + + tft.canvas(GRID_OFFSET_X, GRID_OFFSET_Y, GRID_WIDTH, GRID_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); + + for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) + for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + + const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, + lpos = pos.asLogical(); + + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2 - 32, 96, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(X_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.x)); + tft_string.trim(); + tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2, 96, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Y_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.y)); + tft_string.trim(); + tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2 + 32, 96, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Z_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.trim(); + tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 32) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 1, 32, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(x_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(32), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + (GRID_HEIGHT - 27) / 2, 32, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(y_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(32), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); + add_control(224, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); + add_control(144, 206, BACK, imgBack); + #endif + } +#endif // AUTO_BED_LEVELING_UBL + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + void MarlinUI::touch_calibration() { + static uint16_t x, y; + + calibrationState calibration_stage = touch.get_calibration_state(); + + if (calibration_stage == CALIBRATION_NONE) { + defer_status_screen(true); + clear_lcd(); + calibration_stage = touch.calibration_start(); + } + else { + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + } + + x = 20; y = 20; + touch.clear(); + + if (calibration_stage < CALIBRATION_SUCCESS) { + switch(calibration_stage) { + case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; + case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; + case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; + case CALIBRATION_POINT_4: x = TFT_WIDTH - 21; y = TFT_HEIGHT - 21; tft_string.set("Bottom Right"); break; + default: break; + } + + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); + tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); + + touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); + } + else { + tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? "Calibration Completed" : "Calibration Failed"); + defer_status_screen(false); + touch.calibration_end(); + touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); + } + + tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } +#endif // TOUCH_SCREEN_CALIBRATION + +void menu_line(const uint8_t row, uint16_t color) { + tft.canvas(0, 2 + 34 * row, TFT_WIDTH, 32); + tft.set_background(color); +} + +void menu_pause_option(); + +void menu_item(const uint8_t row, bool sel ) { + #if ENABLED(TOUCH_SCREEN) + if (row == 0) { + touch.clear(); + draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); + } + #endif + + menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 2 + 34 * row, 320, 32, encoderTopLine + row)); +} + +#endif // HAS_UI_320x240 diff --git a/Marlin/src/lcd/tft/ui_320x240.h b/Marlin/src/lcd/tft/ui_320x240.h new file mode 100644 index 000000000000..ed69acbcd2e9 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_320x240.h @@ -0,0 +1,106 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#include "tft.h" +#include "tft_image.h" + +#if ENABLED(TOUCH_SCREEN) + #include "touch.h" +#endif + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); +void draw_fan_status(uint16_t x, uint16_t y, const bool blink); + +#define MENU_TEXT_X_OFFSET 10 +#define MENU_TEXT_Y_OFFSET 7 +void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); +void menu_item(const uint8_t row, bool sel = false); + +#define MENU_FONT_NAME Helvetica14 +#define SYMBOLS_FONT_NAME Helvetica14_symbols + +#define ABSOLUTE_ZERO -273.15 + +const tImage Images[imgCount] = { + MarlinLogo320x240x16, + HotEnd_64x64x4, + Bed_64x64x4, + Bed_Heated_64x64x4, + Chamber_64x64x4, + Chamber_Heated_64x64x4, + Fan0_64x64x4, + Fan_Slow0_64x64x4, + Fan_Slow1_64x64x4, + Fan_Fast0_64x64x4, + Fan_Fast1_64x64x4, + Feedrate_32x32x4, + Flowrate_32x32x4, + SD_64x64x4, + Menu_64x64x4, + Settings_64x64x4, + Directory_32x32x4, + Confirm_64x64x4, + Cancel_64x64x4, + Increase_64x64x4, + Decrease_64x64x4, + Back_32x32x4, + Up_32x32x4, + Down_32x32x4, + Left_32x32x4, + Right_32x32x4, + Refresh_32x32x4, + Leveling_32x32x4, + Slider8x16x4, +}; + +#if HAS_TEMP_CHAMBER && HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_CHAMBER 3 + #define ITEM_FAN 4 + #define ITEMS_COUNT 5 + #define POS_Y 0 +#elif HAS_TEMP_CHAMBER + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_CHAMBER 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 + #define POS_Y 0 +#elif HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 + #define POS_Y 0 +#else + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_FAN 2 + #define ITEMS_COUNT 3 + #define POS_Y 0 +#endif diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp new file mode 100644 index 000000000000..3eeed903cb17 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -0,0 +1,657 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_UI_480x320 + +#include "ui_480x320.h" + +#include "../ultralcd.h" +#include "../menu/menu.h" +#include "../../libs/numtostr.h" + +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/printcounter.h" +#include "../../module/planner.h" +#include "../../module/motion.h" + +#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + #include "../../feature/filwidth.h" + #include "../../gcode/parser.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if !HAS_LCD_MENU + #error "Seriously? High resolution TFT screen without menu?" +#endif + +static bool draw_menu_navigation = false; + +void MarlinUI::tft_idle() { + #if ENABLED(TOUCH_SCREEN) + if (draw_menu_navigation) { + add_control(104, 286, PAGE_UP, imgPageUp, encoderTopLine > 0); + add_control(344, 286, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); + add_control(224, 286, BACK, imgBack); + draw_menu_navigation = false; + } + #endif + + tft.queue.async(); + TERN_(TOUCH_SCREEN, touch.idle()); +} + +void MarlinUI::init_lcd() { + tft.init(); + tft.set_font(MENU_FONT_NAME); + #ifdef SYMBOLS_FONT_NAME + tft.add_glyphs(SYMBOLS_FONT_NAME); + #endif + TERN_(TOUCH_SCREEN, touch.init()); + clear_lcd(); +} + +bool MarlinUI::detected() { return true; } + +void MarlinUI::clear_lcd() { + #if ENABLED(TOUCH_SCREEN) + touch.reset(); + draw_menu_navigation = false; + #endif + + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); +} + +#if ENABLED(SHOW_BOOTSCREEN) + #ifndef BOOTSCREEN_TIMEOUT + #define BOOTSCREEN_TIMEOUT 1500 + #endif + + #undef BOOTSCREEN_TIMEOUT + #define BOOTSCREEN_TIMEOUT 5000 + + void MarlinUI::show_bootscreen() { + tft.queue.reset(); + + tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(142, 130, imgBootScreen); // MarlinLogo195x59x16 + + #ifdef WEBSITE_URL + tft.add_text(8, 250, COLOR_WEBSITE_URL, WEBSITE_URL); + #endif + + tft.queue.sync(); + safe_delay(BOOTSCREEN_TIMEOUT); + clear_lcd(); + } +#endif // SHOW_BOOTSCREEN + +void MarlinUI::draw_kill_screen() { + tft.queue.reset(); + tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_KILL_SCREEN_BG); + + uint16_t line = 2; + + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + line++; + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_HALTED)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + menu_line(line++, COLOR_KILL_SCREEN_BG); + tft_string.set(GET_TEXT(MSG_PLEASE_RESET)); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + tft.queue.sync(); +} + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { + MarlinImage image = imgHotEnd; + uint16_t Color; + float currentTemperature, targetTemperature; + + if (Heater >= 0) { // HotEnd + currentTemperature = thermalManager.degHotend(Heater); + targetTemperature = thermalManager.degTargetHotend(Heater); + } +#if HAS_HEATED_BED + else if (Heater == H_BED) { + currentTemperature = thermalManager.degBed(); + targetTemperature = thermalManager.degTargetBed(); + } +#endif // HAS_HEATED_BED +#if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + currentTemperature = thermalManager.degChamber(); + #if HAS_HEATED_CHAMBER + targetTemperature = thermalManager.degTargetChamber(); + #else + targetTemperature = ABSOLUTE_ZERO; + #endif + } +#endif // HAS_TEMP_CHAMBER + else return; + + TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, Heater)); + tft.canvas(x, y, 80, 120); + tft.set_background(COLOR_BACKGROUND); + + Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; + + if (Heater >= 0) { // HotEnd + if (currentTemperature >= 50) Color = COLOR_HOTEND; + } + #if HAS_HEATED_BED + else if (Heater == H_BED) { + if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + image = targetTemperature > 0 ? imgBedHeated : imgBed; + } + #endif // HAS_HEATED_BED + #if HAS_TEMP_CHAMBER + else if (Heater == H_CHAMBER) { + if (currentTemperature >= 50) Color = COLOR_CHAMBER; + image = targetTemperature > 0 ? imgChamberHeated : imgChamber; + } + #endif // HAS_TEMP_CHAMBER + + tft.add_image(8, 28, image, Color); + + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 2, 82, Color, tft_string); + + if (targetTemperature >= 0) { + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 2, 8, Color, tft_string); + } +} + +void draw_fan_status(uint16_t x, uint16_t y, const bool blink) { + TERN_(TOUCH_SCREEN, touch.add_control(FAN, x, y, 80, 120)); + tft.canvas(x, y, 80, 120); + tft.set_background(COLOR_BACKGROUND); + + uint8_t fanSpeed = thermalManager.fan_speed[0]; + MarlinImage image; + + if (fanSpeed >= 127) + image = blink ? imgFanFast1 : imgFanFast0; + else if (fanSpeed > 0) + image = blink ? imgFanSlow1 : imgFanSlow0; + else + image = imgFanIdle; + + tft.add_image(8, 20, image, COLOR_FAN); + + tft_string.set((uint8_t *)ui8tostr4pctrj(thermalManager.fan_speed[0])); + tft_string.trim(); + tft.add_text(tft_string.center(80) + 6, 82, COLOR_FAN, tft_string); +} + +void MarlinUI::draw_status_screen() { + const bool blink = get_blink(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + // heaters and fan + uint16_t i, x, y = POS_Y; + + for (i = 0 ; i < ITEMS_COUNT; i++) { + x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); + switch (i) { + #ifdef ITEM_E0 + case ITEM_E0: draw_heater_status(x, y, H_E0); break; + #endif + #ifdef ITEM_E1 + case ITEM_E1: draw_heater_status(x, y, H_E1); break; + #endif + #ifdef ITEM_E2 + case ITEM_E2: draw_heater_status(x, y, H_E2); break; + #endif + #ifdef ITEM_BED + case ITEM_BED: draw_heater_status(x, y, H_BED); break; + #endif + #ifdef ITEM_CHAMBER + case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; + #endif + #ifdef ITEM_FAN + case ITEM_FAN: draw_fan_status(x, y, blink); break; + #endif + } + } + + // coordinates + tft.canvas(4, 132, TFT_WIDTH - 8, 34); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, TFT_WIDTH - 8, 34, COLOR_AXIS_HOMED); + + uint16_t color; + uint16_t offset; + bool is_homed; + + tft.add_text( 16, 3, COLOR_AXIS_HOMED , "X"); + tft.add_text(192, 3, COLOR_AXIS_HOMED , "Y"); + tft.add_text(330, 3, COLOR_AXIS_HOMED , "Z"); + + is_homed = TEST(axis_homed, X_AXIS); + tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft.add_text(102 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + is_homed = TEST(axis_homed, Y_AXIS); + tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text(280 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + is_homed = TEST(axis_homed, Z_AXIS); + if (blink & !is_homed) { + tft_string.set("?"); + offset = 32; // ".00" + } + else { + const float z = LOGICAL_Z_POSITION(current_position.z); + tft_string.set(ftostr52sp((int16_t)z)); + tft_string.rtrim(); + offset = tft_string.width(); + + tft_string.set(ftostr52sp(z)); + offset += 32 - tft_string.width(); + } + tft.add_text(455 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); + + // feed rate + tft.canvas(96, 180, 100, 32); + tft.set_background(COLOR_BACKGROUND); + color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFeedRate, color); + tft_string.set(i16tostr3rj(feedrate_percentage)); + tft_string.add('%'); + tft.add_text(36, 1, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 96, 176, 100, 32)); + + // flow rate + tft.canvas(284, 180, 100, 32); + tft.set_background(COLOR_BACKGROUND); + color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFlowRate, color); + tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); + tft_string.add('%'); + tft.add_text(36, 1, color , tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 284, 176, 100, 32, active_extruder)); + + // print duration + char buffer[14]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toDigital(buffer); + + tft.canvas((TFT_WIDTH - 128) / 2, 224, 128, 29); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(buffer); + tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); + + // progress bar + const uint8_t progress = ui.get_progress_percent(); + tft.canvas(4, 260, TFT_WIDTH - 8, 9); + tft.set_background(COLOR_PROGRESS_BG); + tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME); + if (progress) + tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR); + + // status message + tft.canvas(0, 280, TFT_WIDTH, 29); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(status_message); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); + + + #if ENABLED(TOUCH_SCREEN) + add_control(404, 180, menu_main, imgSettings); + TERN_(SDSUPPORT, add_control(12, 180, menu_media, imgSD, card.isMounted() && !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + #endif +} + +// Draw a static item with no left-right margin required. Centered by default. +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + menu_item(row); + tft_string.set(pstr, itemIndex, itemString); + if (valstr) + tft_string.add(valstr); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); +} + +// Draw a generic menu item with pre_char (if selected) and post_char +void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { + menu_item(row, sel); + + uint8_t *string = (uint8_t *)pstr; + MarlinImage image = noImage; + switch (*string) { + case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH + case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER + } + + uint8_t offset = MENU_TEXT_X_OFFSET; + if (image != noImage) { + string++; + offset = 42; + tft.add_image(5, 5, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + } + + tft_string.set(string, itemIndex, itemString); + tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); +} + +// Draw a menu item with a (potentially) editable value +void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + menu_item(row, sel); + + tft_string.set(pstr, itemIndex, itemString); + tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + if (data) { + tft_string.set(data); + tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } +} + +// Low-level draw_edit_screen can be used to draw an edit screen from anyplace +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + ui.encoder_direction_normal(); + TERN_(TOUCH_SCREEN, touch.clear()); + + uint16_t line = 1; + + menu_line(line++); + tft_string.set(pstr, itemIndex, itemString); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + + TERN_(AUTO_BED_LEVELING_UBL, if (ui.external_control) line++); // ftostr52() will overwrite *value so *value has to be displayed first + + menu_line(line); + tft_string.set(value); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + if (ui.external_control) { + menu_line(line - 1); + + tft_string.set(X_LBL); + tft.add_text((TFT_WIDTH / 2 - 120), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.x))); + tft_string.trim(); + tft.add_text((TFT_WIDTH / 2 - 16) - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft_string.set(Y_LBL); + tft.add_text((TFT_WIDTH / 2 + 16), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.y))); + tft_string.trim(); + tft.add_text((TFT_WIDTH / 2 + 120) - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + } + #endif + + extern screenFunc_t _manual_move_func_ptr; + if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { + + #define SLIDER_LENGHT 336 + #define SLIDER_Y_POSITION 186 + + tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); + tft.set_background(COLOR_BACKGROUND); + + int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; + tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); + tft.add_bar(1, 6, position, 4, COLOR_SLIDER); + tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); + tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); + + #if ENABLED(TOUCH_SCREEN) + tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); + touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); + #endif + } + + #if ENABLED(TOUCH_SCREEN) + add_control(64, 256, DECREASE, imgDecrease); + add_control(352, 256, INCREASE, imgIncrease); + add_control(208, 256, CLICK, imgConfirm); + #endif +} + +// The Select Screen presents a prompt and two "buttons" +void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { + uint16_t line = 1; + + if (string == NULL) line++; + + menu_line(line++); + tft_string.set(pref); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + + if (string) { + menu_line(line++); + tft_string.set(string); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } + + if (suff) { + menu_line(line); + tft_string.set(suff); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } + #if ENABLED(TOUCH_SCREEN) + add_control(88, 256, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + add_control(328, 256, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + #endif +} + +#if ENABLED(SDSUPPORT) + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + menu_item(row, sel); + if (isDir) + tft.add_image(5, 5, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + tft.add_text(42, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); + } +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + touch.add_control(RESUME_CONTINUE , 0, 0, TFT_WIDTH, TFT_HEIGHT); + #endif + + menu_line(row); + tft_string.set(GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE)); + tft_string.add('E'); + tft_string.add((char)('1' + extruder)); + tft_string.add(' '); + tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.add(" / "); + tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); + tft_string.add(LCD_STR_DEGREE); + tft_string.trim(); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } +#endif // ADVANCED_PAUSE_FEATURE + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #define GRID_OFFSET_X 8 + #define GRID_OFFSET_Y 8 + #define GRID_WIDTH 192 + #define GRID_HEIGHT 192 + #define CONTROL_OFFSET 16 + + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + + tft.canvas(GRID_OFFSET_X, GRID_OFFSET_Y, GRID_WIDTH, GRID_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); + + for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) + for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + + const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, + lpos = pos.asLogical(); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2 - 43, 120, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(X_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.x)); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2, 120, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Y_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(ftostr52(lpos.y)); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2 + 43, 120, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(Z_LBL); + tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); + tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); + tft_string.trim(); + tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + + tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 48) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 5, 48, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(x_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET + 16 - 24, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2, 48, 43); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ui8tostr3rj(y_plot)); + tft_string.trim(); + tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); + + #if ENABLED(TOUCH_SCREEN) + touch.clear(); + draw_menu_navigation = false; + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); + add_control(320, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); + add_control(224, 286, BACK, imgBack); + #endif + } +#endif // AUTO_BED_LEVELING_UBL + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + void MarlinUI::touch_calibration() { + static uint16_t x, y; + + calibrationState calibration_stage = touch.get_calibration_state(); + + if (calibration_stage == CALIBRATION_NONE) { + defer_status_screen(true); + clear_lcd(); + calibration_stage = touch.calibration_start(); + } + else { + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + } + + x = 20; y = 20; + touch.clear(); + + if (calibration_stage < CALIBRATION_SUCCESS) { + switch(calibration_stage) { + case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; + case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; + case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; + case CALIBRATION_POINT_4: x = TFT_WIDTH - 21; y = TFT_HEIGHT - 21; tft_string.set("Bottom Right"); break; + default: break; + } + + tft.canvas(x - 15, y - 15, 31, 31); + tft.set_background(COLOR_BACKGROUND); + tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); + tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); + + touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); + } + else { + tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? "Calibration Completed" : "Calibration Failed"); + defer_status_screen(false); + touch.calibration_end(); + touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); + } + + tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + } +#endif // TOUCH_SCREEN_CALIBRATION + +void menu_line(const uint8_t row, uint16_t color) { + tft.canvas(0, 4 + 45 * row, TFT_WIDTH, 43); + tft.set_background(color); +} + +void menu_pause_option(); + +void menu_item(const uint8_t row, bool sel ) { + #if ENABLED(TOUCH_SCREEN) + if (row == 0) { + touch.clear(); + draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); + } + #endif + + menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); + TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row)); +} + +#endif // HAS_UI_480x320 diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h new file mode 100644 index 000000000000..d803df4a247d --- /dev/null +++ b/Marlin/src/lcd/tft/ui_480x320.h @@ -0,0 +1,106 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../inc/MarlinConfigPre.h" + +#include "tft.h" +#include "tft_image.h" + +#if ENABLED(TOUCH_SCREEN) + #include "touch.h" +#endif + +void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); +void draw_fan_status(uint16_t x, uint16_t y, const bool blink); + +#define MENU_TEXT_X_OFFSET 16 +#define MENU_TEXT_Y_OFFSET 7 +void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); +void menu_item(const uint8_t row, bool sel = false); + +#define MENU_FONT_NAME Helvetica18 +#define SYMBOLS_FONT_NAME Helvetica18_symbols + +#define ABSOLUTE_ZERO -273.15 + +const tImage Images[imgCount] = { + MarlinLogo195x59x16, + HotEnd_64x64x4, + Bed_64x64x4, + Bed_Heated_64x64x4, + Chamber_64x64x4, + Chamber_Heated_64x64x4, + Fan0_64x64x4, + Fan_Slow0_64x64x4, + Fan_Slow1_64x64x4, + Fan_Fast0_64x64x4, + Fan_Fast1_64x64x4, + Feedrate_32x32x4, + Flowrate_32x32x4, + SD_64x64x4, + Menu_64x64x4, + Settings_64x64x4, + Directory_32x32x4, + Confirm_64x64x4, + Cancel_64x64x4, + Increase_64x64x4, + Decrease_64x64x4, + Back_32x32x4, + Up_32x32x4, + Down_32x32x4, + Left_32x32x4, + Right_32x32x4, + Refresh_32x32x4, + Leveling_32x32x4, + Slider8x16x4, +}; + +#if HAS_TEMP_CHAMBER && HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_CHAMBER 3 + #define ITEM_FAN 4 + #define ITEMS_COUNT 5 + #define POS_Y 4 +#elif HAS_TEMP_CHAMBER + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_CHAMBER 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 + #define POS_Y 4 +#elif HOTENDS > 1 + #define ITEM_E0 0 + #define ITEM_E1 1 + #define ITEM_BED 2 + #define ITEM_FAN 3 + #define ITEMS_COUNT 4 + #define POS_Y 4 +#else + #define ITEM_E0 0 + #define ITEM_BED 1 + #define ITEM_FAN 2 + #define ITEMS_COUNT 3 + #define POS_Y 4 +#endif diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 88a9c36b3642..92e3f136c953 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -149,7 +149,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if HAS_SLOW_BUTTONS volatile uint8_t MarlinUI::slow_buttons; #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 #include "../feature/touch/xpt2046.h" bool MarlinUI::on_edit_screen = false; #endif @@ -229,7 +229,7 @@ millis_t MarlinUI::next_button_update_ms; // = 0 int8_t MarlinUI::encoderDirection = ENCODERBASE; #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 uint8_t MarlinUI::touch_buttons; uint8_t MarlinUI::repeat_delay; #endif @@ -802,6 +802,9 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { LCDViewAction MarlinUI::lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; millis_t next_lcd_update_ms; +#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS + millis_t MarlinUI::return_to_status_ms = 0; +#endif void MarlinUI::update() { @@ -809,7 +812,6 @@ void MarlinUI::update() { millis_t ms = millis(); #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 - static millis_t return_to_status_ms = 0; #define RESET_STATUS_TIMEOUT() (return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS) #else #define RESET_STATUS_TIMEOUT() NOOP @@ -838,7 +840,7 @@ void MarlinUI::update() { quick_feedback(); // - Always make a click sound }; - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 if (touch_buttons) { RESET_STATUS_TIMEOUT(); if (touch_buttons & (EN_A | EN_B)) { // Menu arrows, in priority @@ -859,7 +861,7 @@ void MarlinUI::update() { } else // keep wait_for_unclick value - #endif // TOUCH_BUTTONS + #endif // HAS_TOUCH_XPT2046 { // Integrated LCD click handling via button_pressed @@ -881,7 +883,7 @@ void MarlinUI::update() { next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 if (on_status_screen()) next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2; @@ -1078,6 +1080,8 @@ void MarlinUI::update() { } // switch } // ELAPSED(ms, next_lcd_update_ms) + + TERN_(HAS_GRAPHICAL_TFT, tft_idle()); } #if HAS_ADC_BUTTONS @@ -1224,7 +1228,7 @@ void MarlinUI::update() { #if HAS_SLOW_BUTTONS | slow_buttons #endif - #if BOTH(TOUCH_BUTTONS, HAS_ENCODER_ACTION) + #if BOTH(HAS_TOUCH_XPT2046, HAS_ENCODER_ACTION) | (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF)) #endif ); @@ -1533,7 +1537,7 @@ void MarlinUI::update() { #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 // // Screen Click diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index f3c06177bb20..662adef0c5e2 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -74,7 +74,7 @@ uint8_t get_ADC_keyValue(); #endif - #define LCD_UPDATE_INTERVAL TERN(TOUCH_BUTTONS, 50, 100) + #define LCD_UPDATE_INTERVAL TERN(HAS_TOUCH_XPT2046, 50, 100) #if HAS_LCD_MENU @@ -149,7 +149,7 @@ #define BUTTON_PRESSED(BN) !READ(BTN_## BN) - #if BUTTON_EXISTS(ENC) || ENABLED(TOUCH_BUTTONS) + #if BUTTON_EXISTS(ENC) || HAS_TOUCH_XPT2046 #define BLEN_C 2 #define EN_C _BV(BLEN_C) #endif @@ -215,7 +215,7 @@ #endif -#if BUTTON_EXISTS(BACK) || ENABLED(TOUCH_BUTTONS) +#if BUTTON_EXISTS(BACK) || HAS_TOUCH_XPT2046 #define BLEN_D 3 #define EN_D _BV(BLEN_D) #define LCD_BACK_CLICKED() (buttons & EN_D) @@ -451,7 +451,7 @@ class MarlinUI { static void draw_hotend_status(const uint8_t row, const uint8_t extruder); #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 static bool on_edit_screen; static void screen_click(const uint8_t row, const uint8_t col, const uint8_t x, const uint8_t y); #endif @@ -501,8 +501,11 @@ class MarlinUI { #endif #if HAS_LCD_MENU + #if LCD_TIMEOUT_TO_STATUS + static millis_t return_to_status_ms; + #endif - #if ENABLED(TOUCH_BUTTONS) + #if HAS_TOUCH_XPT2046 static uint8_t touch_buttons; static uint8_t repeat_delay; #endif @@ -633,7 +636,7 @@ class MarlinUI { #endif static void update_buttons(); - static inline bool button_pressed() { return BUTTON_CLICK(); } + static inline bool button_pressed() { return BUTTON_CLICK() || TERN(TOUCH_SCREEN, touch_pressed(), false); } #if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) static void wait_for_release(); #endif @@ -668,6 +671,10 @@ class MarlinUI { #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static void touch_calibration(); + #endif + private: #if HAS_DISPLAY @@ -681,6 +688,12 @@ class MarlinUI { static constexpr bool defer_return_to_status = false; #endif static void draw_status_screen(); + #if HAS_GRAPHICAL_TFT + static void tft_idle(); + #if ENABLED(TOUCH_SCREEN) + static bool touch_pressed(); + #endif + #endif #endif }; diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index 72ff0576283b..b9f44eb6f817 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -140,6 +140,10 @@ #define HAS_CASE_LIGHT_BRIGHTNESS 1 #endif +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + #include "../lcd/tft/touch.h" +#endif + #pragma pack(push, 1) // No padding between variables typedef struct { uint16_t X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_stepper_current_t; @@ -403,6 +407,13 @@ typedef struct SettingsDataStruct { uint8_t case_light_brightness; #endif + // + // TOUCH_SCREEN_CALIBRATION + // + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + touch_calibration_t touch_calibration; + #endif + } SettingsData; //static_assert(sizeof(SettingsData) <= MARLIN_EEPROM_SIZE, "EEPROM too small to contain SettingsData!"); @@ -1334,6 +1345,13 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(case_light_brightness); #endif + // + // TOUCH_SCREEN_CALIBRATION + // + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + EEPROM_WRITE(touch.calibration); + #endif + // // Validate CRC and Data Size // @@ -2167,6 +2185,14 @@ void MarlinSettings::postprocess() { EEPROM_READ(case_light_brightness); #endif + // + // TOUCH_SCREEN_CALIBRATION + // + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + _FIELD_TEST(touch.calibration); + EEPROM_READ(touch.calibration); + #endif + eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); if (eeprom_error) { DEBUG_ECHO_START(); @@ -2469,6 +2495,11 @@ void MarlinSettings::reset() { // TERN_(HAS_CASE_LIGHT_BRIGHTNESS, case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); + // + // TOUCH_SCREEN_CALIBRATION + // + TERN_(TOUCH_SCREEN_CALIBRATION, touch.calibration_reset()); + // // Magnetic Parking Extruder // diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 1b78b0f769ad..1f120e0c12d1 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -503,7 +503,7 @@ #elif MB(CHITU3D) #include "stm32f1/pins_CHITU3D.h" // STM32F1 env:STM32F103RE #elif MB(MKS_ROBIN) - #include "stm32f1/pins_MKS_ROBIN.h" // STM32F1 env:mks_robin + #include "stm32f1/pins_MKS_ROBIN.h" // STM32F1 env:mks_robin env:mks_robin_stm32 #elif MB(MKS_ROBIN_MINI) #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini #elif MB(MKS_ROBIN_NANO) @@ -632,6 +632,12 @@ #elif MB(AGCM4_RAMPS_144) #include "samd/pins_RAMPS_144.h" // SAMD51 env:SAMD51_grandcentral_m4 +// +// Custom board (with custom PIO env) +// +#elif MB(CUSTOM) + #include "pins_custom.h" // env:custom + // // Linux Native Debug board // diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 5a672d29b173..b2eda47978a1 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -108,7 +108,7 @@ // TronXY TFT Support // //#define FSMC_GRAPHICAL_TFT -//#define TOUCH_BUTTONS +//#define HAS_TOUCH_XPT2046 1 #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 @@ -126,7 +126,7 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index be71d3f2c246..39db37a1a270 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -132,7 +132,7 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index c68c059265e4..dcd1c868f4c0 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -126,7 +126,7 @@ // // Touch support // -#if ENABLED(TOUCH_BUTTONS) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PA4 #define TOUCH_INT_PIN PC4 #endif diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index e99b70270093..2f5dbd010564 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -135,7 +135,7 @@ * mixed up MOSI and MISO pins. SPI is managed in SW, and needs pins * declared below. */ -#if ENABLED(TOUCH_BUTTONS) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB12 // pin 51 SPI2_NSS #define TOUCH_SCK_PIN PB13 // pin 52 #define TOUCH_MOSI_PIN PB14 // pin 53 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 86b6f613d2d8..5193ddad2329 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -27,7 +27,7 @@ * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware */ -#ifndef __STM32F1__ +#if !defined(STM32F1) && !defined(STM32F1xx) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin supports up to 2 hotends / E-steppers. Comment out this line to continue." @@ -43,7 +43,14 @@ // // Enable SD EEPROM to prevent infinite boot loop // -#define SDCARD_EEPROM_EMULATION +#ifdef ARDUINO_ARCH_STM32 + #define FLASH_EEPROM_EMULATION + #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) + #define MARLIN_EEPROM_SIZE (EEPROM_PAGE_SIZE) +#else + #define SDCARD_EEPROM_EMULATION +#endif // // Servos @@ -112,35 +119,47 @@ #define PS_ON_PIN PA3 // PW_OFF #define FIL_RUNOUT_PIN PF11 // MT_DET -#define BEEPER_PIN PC13 +#ifdef ARDUINO_ARCH_STM32F1 + #define BEEPER_PIN PC13 +#else + #define BEEPER_PIN -1 +#endif #define LED_PIN PB2 -/** - * Note: MKS Robin TFT screens use various TFT controllers - * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) - * ILI9488 is not supported - * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp - * - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - * - * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu - * because Marlin uses the reset as a failsafe to revive a glitchy LCD. - */ -//#define LCD_RESET_PIN PF6 -#define LCD_BACKLIGHT_PIN PG11 -#define FSMC_CS_PIN PG12 // NE4 -#define FSMC_RS_PIN PF0 // A0 - -#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT -#define FSMC_DMA_DEV DMA2 -#define FSMC_DMA_CHANNEL DMA_CH5 +#ifdef HAS_GRAPHICAL_TFT + #define TFT_RESET_PIN PF6 + #define TFT_BACKLIGHT_PIN PG11 + #define TFT_CS_PIN PG12 // NE4 + #define TFT_RS_PIN PF0 // A0 +#else + /** + * Note: MKS Robin TFT screens use various TFT controllers + * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) + * ILI9488 is not supported + * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp + * + * If the screen stays white, disable 'LCD_RESET_PIN' + * to let the bootloader init the screen. + * + * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu + * because Marlin uses the reset as a failsafe to revive a glitchy LCD. + */ + //#define LCD_RESET_PIN PF6 + #define LCD_BACKLIGHT_PIN PG11 + #define FSMC_CS_PIN PG12 // NE4 + #define FSMC_RS_PIN PF0 // A0 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 +#endif -#if ENABLED(TOUCH_BUTTONS) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB1 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + #define TOUCH_INT_PIN -1 #endif // SPI1(PA7) & SPI3(PB5) not available @@ -150,7 +169,6 @@ #define SCK_PIN PB13 // SPI2 #define MISO_PIN PB14 // SPI2 #define MOSI_PIN PB15 // SPI2 - #define SS_PIN -1 // PB12 is X- #define SD_DETECT_PIN PF12 // SD_CD #else // SD as custom software SPI (SDIO pins) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index a4c179afce23..73e1b12b88eb 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -128,7 +128,7 @@ #define LCD_RESET_PIN PC6 #define LCD_BACKLIGHT_PIN PD13 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PC2 #define TOUCH_SCK_PIN PB13 #define TOUCH_MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 610f4b5735dd..844fb6b0d6a4 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -210,7 +210,7 @@ #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PA7 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK #define TOUCH_MISO_PIN PB14 // SPI2_MISO diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index afbcc8f32a05..3c950a38e31c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -293,8 +293,8 @@ #define TOUCH_BUTTONS_HW_SPI #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - //#define TOUCH_BUTTONS - #if ENABLED(TOUCH_BUTTONS) + //#define TOUCH_SCREEN + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PE14 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 2d6c98eb1e40..3ca59a93a3c1 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -221,7 +221,7 @@ #define LCD_RESET_PIN PF6 #define LCD_BACKLIGHT_PIN PD13 - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PA7 #else #define BEEPER_PIN PC5 diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index 16e665621cd9..eb7fc9493955 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -143,7 +143,7 @@ #endif #endif - #if ENABLED(TOUCH_BUTTONS) + #if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB12 // SPI2_NSS #define TOUCH_SCK_PIN PB13 diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index 2ca5897e9e69..c0a0c016b0bc 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -129,7 +129,7 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 -#if ENABLED(TOUCH_BUTTONS) +#if NEED_TOUCH_PINS #define TOUCH_CS_PIN PB7 // SPI2_NSS #define TOUCH_SCK_PIN PA5 // SPI2_SCK #define TOUCH_MISO_PIN PA6 // SPI2_MISO diff --git a/buildroot/bin/opt_add b/buildroot/bin/opt_add index 2c1eb3000822..2306ebdaa1b8 100755 --- a/buildroot/bin/opt_add +++ b/buildroot/bin/opt_add @@ -1,3 +1,3 @@ #!/usr/bin/env bash -eval "echo '#define ${@}' >>Marlin/Configuration_adv.h" +eval "echo '#define ${@}' | cat - Marlin/Configuration.h > temp && mv temp Marlin/Configuration.h" diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index 4510f689f2b0..96be67e53d17 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -1,15 +1,18 @@ #!/usr/bin/env bash -restore_configs +IFS=: read -r PART1 PART2 <<< "$@" +[ -n "${PART2}" ] && { REPO="$PART1" ; RDIR="$PART2" ; } \ + || { REPO=bugfix-2.0.x ; RDIR="$PART1" ; } +EXAMPLES="https://raw.githubusercontent.com/MarlinFirmware/Configurations/$REPO/config/examples" -EXAMPLES="https://raw.githubusercontent.com/MarlinFirmware/Configurations/bugfix-2.0.x/config/examples" +restore_configs cd Marlin -wget -q "$EXAMPLES/$@/Configuration.h" -O wgot && mv wgot Configuration.h -wget -q "$EXAMPLES/$@/Configuration_adv.h" -O wgot && mv wgot Configuration_adv.h -wget -q "$EXAMPLES/$@/_Bootscreen.h" -O wgot && mv wgot _Bootscreen.h -wget -q "$EXAMPLES/$@/_Statusscreen.h" -O wgot && mv wgot _Statusscreen.h +wget -q "$EXAMPLES/$RDIR/Configuration.h" -O wgot && mv wgot Configuration.h +wget -q "$EXAMPLES/$RDIR/Configuration_adv.h" -O wgot && mv wgot Configuration_adv.h +wget -q "$EXAMPLES/$RDIR/_Bootscreen.h" -O wgot && mv wgot _Bootscreen.h +wget -q "$EXAMPLES/$RDIR/_Statusscreen.h" -O wgot && mv wgot _Statusscreen.h rm -f wgot cd - >/dev/null diff --git a/buildroot/share/PlatformIO/scripts/mks_encrypt.py b/buildroot/share/PlatformIO/scripts/mks_encrypt.py new file mode 100644 index 000000000000..0d53cdfbe934 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_encrypt.py @@ -0,0 +1,32 @@ +import os,sys +Import("env") + +from SCons.Script import DefaultEnvironment +board = DefaultEnvironment().BoardConfig() + +# Encrypt ${PROGNAME}.bin and save it as build.firmware ('Robin.bin') +def encrypt(source, target, env): + key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] + + firmware = open(target[0].path, "rb") + robin = open(target[0].dir.path +'/'+ board.get("build.firmware"), "wb") + length = os.path.getsize(target[0].path) + position = 0 + try: + while position < length: + byte = firmware.read(1) + if position >= 320 and position < 31040: + byte = chr(ord(byte) ^ key[position & 31]) + if sys.version_info[0] > 2: + byte = bytes(byte, 'latin1') + robin.write(byte) + position += 1 + finally: + firmware.close() + robin.close() + +if 'firmware' in board.get("build").keys(): + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); +else: + print("You need to define output file via board_build.firmware = 'filename' parameter", file=sys.stderr) + exit(1); diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp index 93ae231518c3..2210e9844c53 100755 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp @@ -123,7 +123,7 @@ static void setup_clocks(void) { #if !USE_HSI_CLOCK // Enable HSE, and wait until it's ready. rcc_turn_on_clk(RCC_CLK_HSE); - while (!rcc_is_clk_ready(RCC_CLK_HSE)) + while(!rcc_is_clk_ready(RCC_CLK_HSE)) ; #endif // Configure AHBx, APBx, etc. prescalers and the main PLL. diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c new file mode 100644 index 000000000000..c9d2bb88b87a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c @@ -0,0 +1,425 @@ +/* + ******************************************************************************* + * Copyright (c) 2020, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + * Automatically generated from STM32F103V(F-G)Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 +#endif + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 +#endif + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 +#endif + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 +#endif + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 +#endif + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 +#endif + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 +#endif + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 +#endif + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#if defined(STM32F103xE) || defined(STM32F103xG) +#ifdef HAL_DAC_MODULE_ENABLED +WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM2_CH1 + // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 +#endif + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 +#endif + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM2_CH3 + // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 +#endif +#ifdef STM32F103xG + // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 +#endif + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM5_CH4 +#else + {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 +#endif +#if defined(STM32F103xG) + // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 +#endif + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM3_CH1 +#if defined(STM32F103xG) + // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 +#endif + {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N + // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 + // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N +#if defined(STM32F103xG) + // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 +#endif + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM1_CH1 + // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM1_CH2 + // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM1_CH3 + // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM1_CH4 + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 1, 0)}, // TIM2_CH1 + // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 + // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM3_CH3 + // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N +#endif + {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 1)}, // TIM1_CH3N + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N +#endif + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 2, 0)}, // TIM2_CH2 + // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM4_CH3 +#if defined(STM32F103xG) + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 +#endif + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM4_CH4 +#if defined(STM32F103xG) + // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 +#endif + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 + // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 + // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM1_CH2N +#if defined(STM32F103xG) + // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 +#endif + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM1_CH3N +#if defined(STM32F103xG) + // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 +#endif + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 +#endif + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 +#endif + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 3, 0)}, // TIM3_CH3 + // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 4, 0)}, // TIM3_CH4 +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 +#endif + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 4, 0)}, // TIM4_CH4 +#if defined(STM32F103xG) + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 2, 0)}, // TIM9_CH2 +#endif + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 4, 0)}, // TIM1_CH4 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART1_ENABLE)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, +#endif +#if defined(STM32F103xE) || defined(STM32F103xG) + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#endif + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_3, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART1_ENABLE)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PC_11, UART4, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, +#else + {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, +#endif +#if defined(STM32F103xE) || defined(STM32F103xG) + {PD_2, UART5, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, +#endif + {PD_6, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, +#endif + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, +#endif + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, +#endif + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#if defined(STM32F103xE) || defined(STM32F103xG) + // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, +#else + {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, +#endif + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, + {PB_8, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_2)}, + {PD_0, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, + {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_2)}, + {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_3)}, + {NC, NP, 0} +}; +#endif + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB[] = { + {PA_11, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DM + {PA_12, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DP + {NC, NP, 0} +}; +#endif + +//*** No USB_OTG_FS *** + +//*** No USB_OTG_HS *** + +//*** SD *** + +#if defined(STM32F103xE) || defined(STM32F103xG) +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D4 + {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D5 + {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D6 + {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h new file mode 100644 index 000000000000..d9076b4dfb59 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h @@ -0,0 +1,30 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_DM = PA_11, + USB_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld new file mode 100644 index 000000000000..c9197c8b451a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld @@ -0,0 +1,200 @@ +/* +****************************************************************************** +** + +** File : LinkerScript.ld +** +** Author : Auto-generated by STM32CubeIDE +** +** Abstract : Linker script for STM32F103V(8/B/C/E/F/GTx Device from STM32F1 series +** 64/128/256/512/768/1024Kbytes FLASH +** 20/20/48/64/64/96/96Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed as is without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2019 STMicroelectronics

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of "RAM" Ram type memory */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE + FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "FLASH" Rom type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data into "FLASH" Rom type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp new file mode 100644 index 000000000000..25b4b511458b --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp @@ -0,0 +1,235 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Digital PinName array +const PinName digitalPin[] = { + PA_0, //D0 + PA_1, //D1 + PA_2, //D2 + PA_3, //D3 + PA_4, //D4 + PA_5, //D5 + PA_6, //D6 + PA_7, //D7 + PA_8, //D8 + PA_9, //D9 + PA_10, //D10 + PA_11, //D11 + PA_12, //D12 + PA_13, //D13 + PA_14, //D14 + PA_15, //D15 + + PB_0, //D16 + PB_1, //D17 + PB_2, //D18 + PB_3, //D19 + PB_4, //D20 + PB_5, //D21 + PB_6, //D22 + PB_7, //D23 + PB_8, //D24 + PB_9, //D25 + PB_10, //D26 + PB_11, //D27 + PB_12, //D28 + PB_13, //D29 + PB_14, //D30 + PB_15, //D31 + + PC_0, //D32 + PC_1, //D33 + PC_2, //D34 + PC_3, //D35 + PC_4, //D36 + PC_5, //D37 + PC_6, //D38 + PC_7, //D39 + PC_8, //D40 + PC_9, //D41 + PC_10, //D42 + PC_11, //D43 + PC_12, //D44 + PC_13, //D45 + PC_14, //D46 + PC_15, //D47 + + PD_0, //D48 + PD_1, //D49 + PD_2, //D50 + PD_3, //D51 + PD_4, //D52 + PD_5, //D53 + PD_6, //D54 + PD_7, //D55 + PD_8, //D56 + PD_9, //D57 + PD_10, //D58 + PD_11, //D59 + PD_12, //D60 + PD_13, //D61 + PD_14, //D62 + PD_15, //D63 + + PE_0, //D64 + PE_1, //D65 + PE_2, //D66 + PE_3, //D67 + PE_4, //D68 + PE_5, //D69 + PE_6, //D70 + PE_7, //D71 + PE_8, //D72 + PE_9, //D73 + PE_10, //D74 + PE_11, //D75 + PE_12, //D76 + PE_13, //D77 + PE_14, //D78 + PE_15, //D79 +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 0, // A0, PA0 + 1, // A1, PA1 + 2, // A2, PA2 + 3, // A3, PA3 + 4, // A4, PA4 + 5, // A5, PA5 + 6, // A6, PA6 + 7, // A7, PA7 + 16, // A8, PB0 + 17, // A9, PB1 + 32, // A10, PC0 + 33, // A11, PC1 + 34, // A12, PC2 + 35, // A13, PC3 + 36, // A14, PC4 + 37, // A15, PC5 +}; + +/******************************************************************************/ +/* PLL (clocked by HSE) used as System clock source */ +/******************************************************************************/ +static bool SetSysClock_PLL_HSE(bool bypass) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; + bool ret = false; + + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + if (bypass == false) { + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + } else { + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; + } + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) == HAL_OK) { + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) == HAL_OK) { + ret = true; + } + } + } + return ret; +} + +/******************************************************************************/ +/* PLL (clocked by HSI) used as System clock source */ +/******************************************************************************/ +bool SetSysClock_PLL_HSI(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; + bool ret = false; + + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) == HAL_OK) { + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV4; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) == HAL_OK) { + ret = true; + } + } + } + return ret; +} + +WEAK void SystemClock_Config(void) +{ + /* + * If HSE_VALUE is not 8MHz and you want use it, then: + * - Redefine HSE_VALUE to the correct HSE_VALUE + * - Redefine SystemClock_Config() with the correct settings + */ +#if HSE_VALUE == 8000000U + /* 1- Try to start with HSE and external 8MHz xtal */ + if (SetSysClock_PLL_HSE(false) == false) { + /* 2- If fail try to start with HSE and external clock */ + if (SetSysClock_PLL_HSE(true) == false) { +#endif + /* 3- If fail start with HSI clock */ + if (SetSysClock_PLL_HSI() == false) { + Error_Handler(); + } +#if HSE_VALUE == 8000000U + } + } +#endif +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h new file mode 100644 index 000000000000..b622b39376b9 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h @@ -0,0 +1,181 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +#define PA0 0 +#define PA1 1 +#define PA2 2 +#define PA3 3 +#define PA4 4 +#define PA5 5 +#define PA6 6 +#define PA7 7 +#define PA8 8 +#define PA9 9 +#define PA10 10 +#define PA11 11 +#define PA12 12 +#define PA13 13 +#define PA14 14 +#define PA15 15 + +#define PB0 16 +#define PB1 17 +#define PB2 18 +#define PB3 19 +#define PB4 20 +#define PB5 21 +#define PB6 22 +#define PB7 23 +#define PB8 24 +#define PB9 25 +#define PB10 26 +#define PB11 27 +#define PB12 28 +#define PB13 29 +#define PB14 30 +#define PB15 31 + +#define PC0 32 +#define PC1 33 +#define PC2 34 +#define PC3 35 +#define PC4 36 +#define PC5 37 +#define PC6 38 +#define PC7 39 +#define PC8 40 +#define PC9 41 +#define PC10 42 +#define PC11 43 +#define PC12 44 +#define PC13 45 +#define PC14 46 +#define PC15 47 + +#define PD0 48 +#define PD1 49 +#define PD2 50 +#define PD3 51 +#define PD4 52 +#define PD5 53 +#define PD6 54 +#define PD7 55 +#define PD8 56 +#define PD9 57 +#define PD10 58 +#define PD11 59 +#define PD12 60 +#define PD13 61 +#define PD14 62 +#define PD15 63 + +#define PE0 64 +#define PE1 65 +#define PE2 66 +#define PE3 67 +#define PE4 68 +#define PE5 69 +#define PE6 70 +#define PE7 71 +#define PE8 72 +#define PE9 73 +#define PE10 74 +#define PE11 75 +#define PE12 76 +#define PE13 77 +#define PE14 78 +#define PE15 79 + +// This must be a literal +#define NUM_DIGITAL_PINS 80 +#define NUM_ANALOG_INPUTS 16 + +// On-board LED pin number +#ifndef LED_BUILTIN +#define LED_BUILTIN PB11 +#endif + +// On-board user button +#ifndef USER_BTN +#define USER_BTN PC13 +#endif + +// SPI Definitions +#define PIN_SPI_SS PC4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + +// I2C Definitions +#define PIN_WIRE_SDA PB7 +#define PIN_WIRE_SCL PB6 + +// Timer Definitions (optional) +// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin +#define TIMER_TONE TIM3 +#define TIMER_SERVO TIM2 + +// UART Definitions +// Define here Serial instance number to map on Serial generic name +#define SERIAL_UART_INSTANCE 1 + +// Extra HAL modules +#if defined(STM32F103xE) || defined(STM32F103xG) +#define HAL_DAC_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED +#endif + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE Serial1 +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c new file mode 100644 index 000000000000..5736e5206e09 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c @@ -0,0 +1,368 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + * Automatically generated from STM32F103Z(C-D-E|F-G))Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + // {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + // {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +WEAK const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SCL[] = { + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM2_CH1 + // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 + // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 + // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM2_CH3 + // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 + // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 +#ifdef STM32F103xG + // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 +#endif + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM5_CH4 +#ifdef STM32F103xG + // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 +#endif + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM3_CH1 +#ifdef STM32F103xG + // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 +#endif + // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N + // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 + {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N +#ifdef STM32F103xG + // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 +#endif + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM1_CH1 + // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM1_CH2 + // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM1_CH3 + // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM1_CH4 + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 1, 0)}, // TIM2_CH1 + // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 + // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM3_CH3 + // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 + {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N + {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 1)}, // TIM1_CH3N + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 2, 0)}, // TIM2_CH2 + // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM4_CH3 +#ifdef STM32F103xG + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 +#endif + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM4_CH4 +#ifdef STM32F103xG + // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 +#endif + // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 + // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM1_CH2N +#ifdef STM32F103xG + // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 +#endif + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM1_CH3N +#ifdef STM32F103xG + // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 +#endif + // {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 + {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 + // {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 + {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 3, 0)}, // TIM3_CH3 + // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 4, 0)}, // TIM3_CH4 + // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 4, 0)}, // TIM4_CH4 +#ifdef STM32F103xG + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 2, 0)}, // TIM9_CH2 +#endif + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 4, 0)}, // TIM1_CH4 +#ifdef STM32F103xG + {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM10_ENABLE, 1, 0)}, // TIM10_CH1 + {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM11_ENABLE, 1, 0)}, // TIM11_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM13_ENABLE, 1, 0)}, // TIM13_CH1 + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM14_ENABLE, 1, 0)}, // TIM14_CH1 +#endif + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART1_ENABLE)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {PA_3, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART1_ENABLE)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PC_11, UART4, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + // {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_2, UART5, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, + {PD_6, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, + {PB_8, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_2)}, + {PD_0, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +WEAK const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, + {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_2)}, + {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_3)}, + {NC, NP, 0} +}; +#endif + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB[] = { + {PA_11, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DM + {PA_12, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DP + {NC, NP, 0} +}; +#endif + +//*** No USB_OTG_FS *** + +//*** No USB_OTG_HS *** + +//*** SD *** + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D4 + // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D5 + // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D6 + // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h new file mode 100644 index 000000000000..d9076b4dfb59 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h @@ -0,0 +1,30 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_DM = PA_11, + USB_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h new file mode 100644 index 000000000000..014943f311ed --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h @@ -0,0 +1,412 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_conf_default.h + * @brief HAL default configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F1xx_HAL_CONF_DEFAULT_H +#define __STM32F1xx_HAL_CONF_DEFAULT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief Include the default list of modules to be used in the HAL driver + * and manage module deactivation + */ +#include "stm32yyxx_hal_conf.h" +#if 0 +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CAN_MODULE_ENABLED +/*#define HAL_CAN_LEGACY_MODULE_ENABLED*/ +#define HAL_CEC_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DAC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_ETH_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_HCD_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_I2S_MODULE_ENABLED +#define HAL_IRDA_MODULE_ENABLED +#define HAL_IWDG_MODULE_ENABLED +#define HAL_NAND_MODULE_ENABLED +#define HAL_NOR_MODULE_ENABLED +#define HAL_PCCARD_MODULE_ENABLED +#define HAL_PCD_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SMARTCARD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_WWDG_MODULE_ENABLED +#define HAL_MMC_MODULE_ENABLED +#endif + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) +#if defined(USE_STM3210C_EVAL) +#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ +#else +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) +#define HSI_VALUE 8000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) +#define LSI_VALUE 40000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) +#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#if !defined(VDD_VALUE) +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#endif +#if !defined (TICK_INT_PRIORITY) +#define TICK_INT_PRIORITY 0x00U /*!< tick interrupt priority */ +#endif +#if !defined (USE_RTOS) +#define USE_RTOS 0U +#endif +#if !defined (PREFETCH_ENABLE) +#define PREFETCH_ENABLE 1U +#endif + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB 8U /* 8 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848 PHY Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ + +#define PHY_SR ((uint16_t)0x0010) /*!< PHY status register Offset */ +#define PHY_MICR ((uint16_t)0x0011) /*!< MII Interrupt Control Register */ +#define PHY_MISR ((uint16_t)0x0012) /*!< MII Interrupt Status and Misc. Control Register */ + +#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ + +#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ +#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ + +#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ +#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ +#if !defined (USE_SPI_CRC) +#define USE_SPI_CRC 0U +#endif + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f1xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f1xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f1xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f1xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f1xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f1xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "Legacy/stm32f1xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f1xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f1xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f1xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f1xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f1xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f1xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f1xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f1xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f1xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f1xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f1xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f1xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f1xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f1xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f1xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f1xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f1xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f1xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f1xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f1xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f1xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f1xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f1xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f1xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f1xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f1xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_HAL_CONF_DEFAULT_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld new file mode 100644 index 000000000000..098e83b060d9 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld @@ -0,0 +1,200 @@ +/* +****************************************************************************** +** + +** File : LinkerScript.ld +** +** Author : Auto-generated by STM32CubeIDE +** +** Abstract : Linker script for STM32F103Z(C/D/E/G/GTx Device from STM32F1 series +** 256/386/512K/786/1024bytes FLASH +** 48/64/96Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed as is without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2019 STMicroelectronics

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of "RAM" Ram type memory */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE + FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "FLASH" Rom type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data into "FLASH" Rom type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp new file mode 100644 index 000000000000..ff7ab771c02b --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp @@ -0,0 +1,222 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Digital PinName array +const PinName digitalPin[] = { + PA_0, //D0 + PA_1, //D1 + PA_2, //D2 + PA_3, //D3 + PA_4, //D4 + PA_5, //D5 + PA_6, //D6 + PA_7, //D7 + PA_8, //D8 + PA_9, //D9 + PA_10, //D10 + PA_11, //D11 + PA_12, //D12 + PA_13, //D13 + PA_14, //D14 + PA_15, //D15 + + PB_0, //D16 + PB_1, //D17 + PB_2, //D18 + PB_3, //D19 + PB_4, //D20 + PB_5, //D21 + PB_6, //D22 + PB_7, //D23 + PB_8, //D24 + PB_9, //D25 + PB_10, //D26 + PB_11, //D27 + PB_12, //D28 + PB_13, //D29 + PB_14, //D30 + PB_15, //D31 + + PC_0, //D32 + PC_1, //D33 + PC_2, //D34 + PC_3, //D35 + PC_4, //D36 + PC_5, //D37 + PC_6, //D38 + PC_7, //D39 + PC_8, //D40 + PC_9, //D41 + PC_10, //D42 + PC_11, //D43 + PC_12, //D44 + PC_13, //D45 + PC_14, //D46 + PC_15, //D47 + + PD_0, //D48 + PD_1, //D49 + PD_2, //D50 + PD_3, //D51 + PD_4, //D52 + PD_5, //D53 + PD_6, //D54 + PD_7, //D55 + PD_8, //D56 + PD_9, //D57 + PD_10, //D58 + PD_11, //D59 + PD_12, //D60 + PD_13, //D61 + PD_14, //D62 + PD_15, //D63 + + PE_0, //D64 + PE_1, //D65 + PE_2, //D66 + PE_3, //D67 + PE_4, //D68 + PE_5, //D69 + PE_6, //D70 + PE_7, //D71 + PE_8, //D72 + PE_9, //D73 + PE_10, //D74 + PE_11, //D75 + PE_12, //D76 + PE_13, //D77 + PE_14, //D78 + PE_15, //D79 + + PF_0, //D80 + PF_1, //D81 + PF_2, //D82 + PF_3, //D83 + PF_4, //D84 + PF_5, //D85 + PF_6, //D86 + PF_7, //D87 + PF_8, //D88 + PF_9, //D89 + PF_10, //D90 + PF_11, //D91 + PF_12, //D92 + PF_13, //D93 + PF_14, //D94 + PF_15, //D95 + + PG_0, //D96 + PG_1, //D97 + PG_2, //D98 + PG_3, //D99 + PG_4, //D100 + PG_5, //D101 + PG_6, //D102 + PG_7, //D103 + PG_8, //D104 + PG_9, //D105 + PG_10, //D106 + PG_11, //D107 + PG_12, //D108 + PG_13, //D109 + PG_14, //D110 + PG_15 //D111 +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 0, // A0, PA0 + 1, // A1, PA1 + 2, // A2, PA2 + 3, // A3, PA3 + 4, // A4, PA4 + 5, // A5, PA5 + 6, // A6, PA6 + 7, // A7, PA7 + 16, // A8, PB0 + 17, // A9, PB1 + 32, // A10, PC0 + 33, // A11, PC1 + 34, // A12, PC2 + 35, // A13, PC3 + 36, // A14, PC4 + 37, // A15, PC5 + 86, // A16, PF6 + 87, // A17, PF7 + 88, // A18, PF8 + 89, // A19, PF9 + 90 // A20, PF10 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; + + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + Error_Handler(); + } + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { + Error_Handler(); + } + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { + Error_Handler(); + } +} + + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h new file mode 100644 index 000000000000..fb878f8b78f3 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h @@ -0,0 +1,232 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ******************************************************************************* + */ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +#define PA0 0 +#define PA1 1 +#define PA2 2 +#define PA3 3 +#define PA4 4 +#define PA5 5 +#define PA6 6 +#define PA7 7 +#define PA8 8 +#define PA9 9 +#define PA10 10 +#define PA11 11 +#define PA12 12 +#define PA13 13 +#define PA14 14 +#define PA15 15 + +#define PB0 16 +#define PB1 17 +#define PB2 18 +#define PB3 19 +#define PB4 20 +#define PB5 21 +#define PB6 22 +#define PB7 23 +#define PB8 24 +#define PB9 25 +#define PB10 26 +#define PB11 27 +#define PB12 28 +#define PB13 29 +#define PB14 30 +#define PB15 31 + +#define PC0 32 +#define PC1 33 +#define PC2 34 +#define PC3 35 +#define PC4 36 +#define PC5 37 +#define PC6 38 +#define PC7 39 +#define PC8 40 +#define PC9 41 +#define PC10 42 +#define PC11 43 +#define PC12 44 +#define PC13 45 +#define PC14 46 +#define PC15 47 + +#define PD0 48 +#define PD1 49 +#define PD2 50 +#define PD3 51 +#define PD4 52 +#define PD5 53 +#define PD6 54 +#define PD7 55 +#define PD8 56 +#define PD9 57 +#define PD10 58 +#define PD11 59 +#define PD12 60 +#define PD13 61 +#define PD14 62 +#define PD15 63 + +#define PE0 64 +#define PE1 65 +#define PE2 66 +#define PE3 67 +#define PE4 68 +#define PE5 69 +#define PE6 70 +#define PE7 71 +#define PE8 72 +#define PE9 73 +#define PE10 74 +#define PE11 75 +#define PE12 76 +#define PE13 77 +#define PE14 78 +#define PE15 79 + +#define PF0 80 +#define PF1 81 +#define PF2 82 +#define PF3 83 +#define PF4 84 +#define PF5 85 +#define PF6 86 +#define PF7 87 +#define PF8 88 +#define PF9 89 +#define PF10 90 +#define PF11 91 +#define PF12 92 +#define PF13 93 +#define PF14 94 +#define PF15 95 + +#define PG0 96 +#define PG1 97 +#define PG2 98 +#define PG3 99 +#define PG4 100 +#define PG5 101 +#define PG6 102 +#define PG7 103 +#define PG8 104 +#define PG9 105 +#define PG10 106 +#define PG11 107 +#define PG12 108 +#define PG13 109 +#define PG14 110 +#define PG15 111 + +// This must be a literal +#define NUM_DIGITAL_PINS 112 +#define NUM_ANALOG_INPUTS 21 + +// On-board LED pin number +#ifdef ARDUINO_VCCGND_F103ZET6_MINI +#define LED_BUILTIN PG15 +#elif defined(ARDUINO_VCCGND_F103ZET6) +#define LED_BUILTIN PC13 +#elif !defined(LED_BUILTIN) +#define LED_BUILTIN PC13 +#endif + +// On-board user button +#ifndef USER_BTN +#define USER_BTN PB1 +#endif + +// SPI Definitions +#ifdef ARDUINO_VCCGND_F103ZET6 +#define PIN_SPI_SS PA15 +#define PIN_SPI_MOSI PB5 +#define PIN_SPI_MISO PB4 +#define PIN_SPI_SCK PB3 +#else +#define PIN_SPI_SS PC4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 +#endif + +// I2C Definitions +#define PIN_WIRE_SDA PB7 +#define PIN_WIRE_SCL PB6 + +// Timer Definitions (optional) +// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin +#define TIMER_TONE TIM6 +#define TIMER_SERVO TIM7 + +// UART Definitions +// Define here Serial instance number to map on Serial generic name +#define SERIAL_UART_INSTANCE 1 + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +// Default pin used for 'Serial2' instance +#define PIN_SERIAL2_RX PA3 +#define PIN_SERIAL2_TX PA2 + +// Default pin used for 'Serial3' instance +#define PIN_SERIAL3_RX PB11 +#define PIN_SERIAL3_TX PB10 + +/* Extra HAL modules */ +#define HAL_DAC_MODULE_ENABLED +#define HAL_SD_MODULE_ENABLED +#define HAL_SRAM_MODULE_ENABLED + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE Serial1 +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests index 99d41ef4ad56..d6350622052c 100644 --- a/buildroot/tests/mks_robin-tests +++ b/buildroot/tests/mks_robin-tests @@ -1,13 +1,16 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 genericSTM32F103ZE +# Build tests for MKS Robin +# (STM32F1 genericSTM32F103ZE) # # exit on first failure set -e use_example_configs Mks/Robin -exec_test $1 $2 "Default Configuration" +opt_disable TFT_320x240 +opt_enable FSMC_GRAPHICAL_TFT +exec_test $1 $2 "MKS Robin base configuration" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests index c8ba5a5a4870..1c40ea453554 100644 --- a/buildroot/tests/mks_robin_mini-tests +++ b/buildroot/tests/mks_robin_mini-tests @@ -1,6 +1,7 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 genericSTM32F103VE +# Build tests for MKS Robin mini +# (STM32F1 genericSTM32F103VE) # # exit on first failure @@ -10,7 +11,7 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_MINI opt_set EXTRUDERS 1 opt_set TEMP_SENSOR_1 0 -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "MKS Robin mini" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_nano-tests b/buildroot/tests/mks_robin_nano-tests index 809fd6e6f503..d3df7e2e5a57 100644 --- a/buildroot/tests/mks_robin_nano-tests +++ b/buildroot/tests/mks_robin_nano-tests @@ -1,6 +1,7 @@ #!/usr/bin/env bash # -# Build tests for STM32F1 genericSTM32F103VE +# Build tests for MKS Robin nano +# (STM32F1 genericSTM32F103VE) # # exit on first failure @@ -8,7 +9,7 @@ set -e use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -exec_test $1 $2 "Default Configuration" +exec_test $1 $2 "MKS Robin nano" # cleanup restore_configs diff --git a/buildroot/tests/mks_robin_stm32-tests b/buildroot/tests/mks_robin_stm32-tests new file mode 100644 index 000000000000..4aa146fa5288 --- /dev/null +++ b/buildroot/tests/mks_robin_stm32-tests @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# +# Build tests for MKS Robin (HAL/STM32) +# + +# exit on first failure +set -e + +use_example_configs Mks/Robin +exec_test $1 $2 "MKS Robin base configuration" + +# cleanup +restore_configs diff --git a/platformio.ini b/platformio.ini index 24d416444f83..2f7059e48852 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,7 +26,7 @@ include_dir = Marlin # [common] default_src_filter = + - - + - - - - - + - - - - - - - - - - - @@ -62,6 +62,7 @@ USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 DWIN_CREALITY_LCD = src_filter=+ HAS_CHARACTER_LCD = src_filter=+ +HAS_GRAPHICAL_TFT = src_filter=+ HAS_LCD_MENU = src_filter=+ HAS_DGUS_LCD = src_filter=+ TOUCH_UI_FTDI_EVE = src_filter=+ @@ -603,6 +604,28 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common_stm32f1.build_flags} -DSS_TIMER=4 -DSTM32_XL_DENSITY +# MKS Robin (STM32F103ZET6) +# Uses HAL STM32 to support Marlin UI for TFT screen with optional touch panel +# +[env:mks_robin_stm32] +platform = ${common_stm32.platform} +extends = common_stm32 +board = genericSTM32F103ZE +board_build.core = stm32 +board_build.variant = MARLIN_F103Zx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.firmware = Robin.bin +build_flags = ${common_stm32.build_flags} + -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 +build_unflags = ${common_stm32.build_unflags} + -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py +lib_deps = + # # MKS Robin Pro (STM32F103ZET6) # From f3b37229fa9e7fead9c89fb4b477ba7f9d544c72 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 28 Jul 2020 18:13:20 -0500 Subject: [PATCH 259/483] Update include_tree --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 2f7059e48852..0b1155abaddc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -991,4 +991,4 @@ src_filter = ${common.default_src_filter} + platform = atmelavr board = megaatmega2560 build_flags = -c -H -std=gnu++11 -Wall -Os -D__MARLIN_FIRMWARE__ -src_filter = + +src_filter = + From cc50c4956d3743ec5fe11e1c118d105cf6672304 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 30 Jul 2020 02:07:29 -0500 Subject: [PATCH 260/483] Add monitor_flags --- platformio.ini | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platformio.ini b/platformio.ini index 0b1155abaddc..790d6f9d0f80 100644 --- a/platformio.ini +++ b/platformio.ini @@ -89,6 +89,15 @@ extra_scripts = ${common.extra_scripts} build_flags = ${common.build_flags} lib_deps = ${common.lib_deps} monitor_speed = 250000 +monitor_flags = + --quiet + --echo + --eol + LF + --filter + colorize + --filter + time ################################# # # From 90158f9f679e2d18b10450bca0f3f2966b7756cd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 30 Jul 2020 02:27:52 -0500 Subject: [PATCH 261/483] Repair config order --- Marlin/Configuration.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 363ea2f351ff..9d1f7862bb7f 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2167,16 +2167,16 @@ //#define TFT_DRIVER AUTO // -// FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) +// SPI display (MKS Robin Nano V2.0, MKS Gen L V2.0) // Upscaled 128x64 Marlin UI // -//#define FSMC_GRAPHICAL_TFT +//#define SPI_GRAPHICAL_TFT // -// SPI display (MKS Robin Nano V2.0, MKS Gen L V2.0) +// FSMC display (MKS Robin, Alfawise U20, JGAurora A5S, REXYZ A1, etc.) // Upscaled 128x64 Marlin UI // -//#define SPI_GRAPHICAL_TFT +//#define FSMC_GRAPHICAL_TFT // // TFT LVGL UI From b058aee1d4664ca7ee8053c5e3d7f2d12b5c5881 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 31 Jul 2020 00:09:42 +0000 Subject: [PATCH 262/483] [cron] Bump distribution date (2020-07-31) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 199f09221d02..6afa9175d7ea 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-30" + #define STRING_DISTRIBUTION_DATE "2020-07-31" #endif /** From 6b0d154956989e3222fce41f9563bdc8b527e386 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 1 Aug 2020 00:09:59 +0000 Subject: [PATCH 263/483] [cron] Bump distribution date (2020-08-01) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 6afa9175d7ea..06e0adb12449 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-07-31" + #define STRING_DISTRIBUTION_DATE "2020-08-01" #endif /** From 2465f2fd746169bca31ec43a956211bed15839c6 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 2 Aug 2020 00:10:12 +0000 Subject: [PATCH 264/483] [cron] Bump distribution date (2020-08-02) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 06e0adb12449..7eeafdb7b994 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-01" + #define STRING_DISTRIBUTION_DATE "2020-08-02" #endif /** From 5847f9c71848ca26e8c5abe7acd4a62989f4296b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 3 Aug 2020 00:10:15 +0000 Subject: [PATCH 265/483] [cron] Bump distribution date (2020-08-03) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 7eeafdb7b994..b8e0c837513e 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-02" + #define STRING_DISTRIBUTION_DATE "2020-08-03" #endif /** From 1d240ce5a3a5222ae43204fed3bbaf368fa93c2e Mon Sep 17 00:00:00 2001 From: Slats <2580606+mslattery@users.noreply.github.com> Date: Sun, 2 Aug 2020 21:00:06 -0400 Subject: [PATCH 266/483] Translated DWIN screen titles (#18893) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dwin/dwin.cpp | 20 +++-- Marlin/src/lcd/dwin/dwin_lcd.cpp | 135 ++++++++++++++++++++++++------- 2 files changed, 116 insertions(+), 39 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index f8c1819c5138..0daaf3982ae4 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -379,6 +379,10 @@ inline void Draw_Title(const char * const title) { DWIN_Draw_String(false, false, HEADER_FONT, White, Background_blue, 14, 4, (char*)title); } +inline void Draw_Title(const __FlashStringHelper * title) { + DWIN_Draw_String(false, false, HEADER_FONT, White, Background_blue, 14, 4, (char*)title); +} + inline void Clear_Menu_Area(void) { DWIN_Draw_Rectangle(1, Background_black, 0, 31, 272, 360); } @@ -568,7 +572,7 @@ inline void Draw_Prepare_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Prepare"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_PREPARE)); #else DWIN_Frame_AreaCopy(1, 178, 2, 271 - 42, 479 - 464 - 1, 14, 8); // "Prepare" #endif @@ -611,7 +615,7 @@ inline void Draw_Control_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Control"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_CONTROL)); #else DWIN_Frame_AreaCopy(1, 128, 2, 271 - 95, 479 - 467, 14, 8); #endif @@ -656,7 +660,7 @@ inline void Draw_Tune_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Tune"); // TODO: GET_TEXT + Draw_Title(GET_TEXT_F(MSG_TUNE)); #else DWIN_Frame_AreaCopy(1, 94, 2, 271 - 145, 479 - 467, 14, 9); #endif @@ -730,7 +734,7 @@ inline void Draw_Motion_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Motion"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_MOTION)); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); #endif @@ -947,7 +951,7 @@ void Goto_MainMenu(void) { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Home"); // TODO: GET_TEXT + Draw_Title(GET_TEXT_F(MSG_MAIN)); #else DWIN_Frame_AreaCopy(1, 0, 2, 271 - 232, 479 - 467, 14, 9); #endif @@ -1714,7 +1718,7 @@ inline void Draw_Info_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Info"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_INFO_SCREEN)); #else DWIN_Frame_AreaCopy(1, 190, 16, 271 - 56, 479 - 453, 14, 8); #endif @@ -2091,7 +2095,7 @@ inline void Draw_Move_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Move"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_MOVE_AXIS)); #else DWIN_Frame_AreaCopy(1, 231, 2, 271 - 6, 479 - 467, 14, 8); #endif @@ -2245,7 +2249,7 @@ void Draw_Temperature_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Temperature"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); #endif diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 3c14a95936e7..0ca6b8a3ae62 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -21,11 +21,11 @@ */ /******************************************************************************** - * @file dwin_lcd.c + * @file dwin_lcd.cpp * @author LEO / Creality3D * @date 2019/07/18 * @version 2.0.1 - * @brief 迪文å±æŽ§åˆ¶æ“作函数 + * @brief DWIN screen control functions ********************************************************************************/ #include "../../inc/MarlinConfigPre.h" @@ -68,7 +68,15 @@ inline void DWIN_String(size_t &i, char * const string) { i += len; } -/*å‘é€å½“å‰BUF中的数æ®ä»¥åŠåŒ…å°¾æ•°æ® len:整包数æ®é•¿åº¦*/ +inline void DWIN_String(size_t &i, const __FlashStringHelper * string) { + if (!string) return; + const size_t len = strlen_P((PGM_P)string); // cast it to PGM_P, which is basically const char *, and measure it using the _P version of strlen. + if (len == 0) return; + memcpy(&DWIN_SendBuf[i+1], string, len); + i += len; +} + +// Send the data in the buffer and the packet end inline void DWIN_Send(size_t &i) { ++i; LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); @@ -77,8 +85,9 @@ inline void DWIN_Send(size_t &i) { delayMicroseconds(1); } } -/*----------------------------------------------系统å˜é‡å‡½æ•°----------------------------------------------*/ -/*æ¡æ‰‹ 1: æ¡æ‰‹æˆåŠŸ 2: æ¡æ‰‹å¤±è´¥*/ +/*-------------------------------------- System variable function --------------------------------------*/ + +// Handshake (1: Success, 0: Fail) bool DWIN_Handshake(void) { size_t i = 0; DWIN_Byte(i, 0x00); @@ -105,7 +114,8 @@ bool DWIN_Handshake(void) { && databuf[3] == 'K' ); } -/*设定背光亮度 luminance:亮度(0x00~0xFF)*/ +// Set the backlight luminance +// luminance: (0x00-0xFF) void DWIN_Backlight_SetLuminance(const uint8_t luminance) { size_t i = 0; DWIN_Byte(i, 0x30); @@ -113,7 +123,8 @@ void DWIN_Backlight_SetLuminance(const uint8_t luminance) { DWIN_Send(i); } -/*设定画é¢æ˜¾ç¤ºæ–¹å‘ dir:0,0°; 1,90°; 2,180°; 3,270°*/ +// Set screen display direction +// dir: 0=0°, 1=90°, 2=180°, 3=270° void DWIN_Frame_SetDir(uint8_t dir) { size_t i = 0; DWIN_Byte(i, 0x34); @@ -123,15 +134,17 @@ void DWIN_Frame_SetDir(uint8_t dir) { DWIN_Send(i); } -/*更新显示*/ +// Update display void DWIN_UpdateLCD(void) { size_t i = 0; DWIN_Byte(i, 0x3D); DWIN_Send(i); } -/*----------------------------------------------绘图相关函数----------------------------------------------*/ -/*ç”»é¢æ¸…å± color:清å±é¢œè‰²*/ +/*---------------------------------------- Drawing functions ----------------------------------------*/ + +// Clear screen +// color: Clear screen color void DWIN_Frame_Clear(const uint16_t color) { size_t i = 0; DWIN_Byte(i, 0x01); @@ -139,7 +152,10 @@ void DWIN_Frame_Clear(const uint16_t color) { DWIN_Send(i); } -/*ç”»é¢ç”»çº¿ color:线段颜色 xStart:X起始åæ ‡ yStart:Y起始åæ ‡ xEnd:X终止åæ ‡ yEnd:Y终止åæ ‡*/ +// Draw a line +// color: Line segment color +// xStart/yStart: Start point +// xEnd/yEnd: End point void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; DWIN_Byte(i, 0x03); @@ -151,7 +167,11 @@ void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t x DWIN_Send(i); } -/*ç”»é¢ç”»çŸ©å½¢ mode:0,外框;1,å¡«å……;2,异或填充 color:颜色 xStart/yStart:矩形左上åæ ‡ xEnd/yEnd:矩形å³ä¸‹åæ ‡*/ +// Draw a rectangle +// mode: 0=frame, 1=fill, 2=XOR fill +// color: Rectangle color +// xStart/yStart: upper left point +// xEnd/yEnd: lower right point void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; @@ -165,8 +185,14 @@ void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, DWIN_Send(i); } -/*ç”»é¢åŒºåŸŸç§»åŠ¨ mode:0,环移;1,平移 dir:0,å‘左移动;1,å‘å³ç§»åŠ¨;2,å‘上移动;3,å‘下移动 dis:移动è·ç¦» - color:填充颜色 xStart/yStart:选定区域左上åæ ‡ xEnd/yEnd:选定区域å³ä¸‹åæ ‡*/ +// +// Move a screen area +// mode: 0, circle shift; 1, translation +// dir: 0=left, 1=right, 2=up, 3=down +// dis: Distance +// color: Fill color +// xStart/yStart: upper left point +// xEnd/yEnd: bottom right point void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; @@ -181,14 +207,21 @@ void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, DWIN_Send(i); } -/*----------------------------------------------文本相关函数----------------------------------------------*/ -/*ç”»é¢æ˜¾ç¤ºå­—符串 widthAdjust:true,自调整字符宽度;false,ä¸è°ƒæ•´å­—符宽度 bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 x/y:字符串左上åæ ‡ *string:字符串*/ +/*---------------------------------------- Text related functions ----------------------------------------*/ + +// Draw a string +// widthAdjust: true=self-adjust character width; false=no adjustment +// bShow: true=display background color; false=don't display background color +// size: Font size +// color: Character color +// bColor: Background color +// x/y: Upper-left coordinate of the string +// *string: The string void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, char *string) { size_t i = 0; DWIN_Byte(i, 0x11); - DWIN_Byte(i, (widthAdjust? 0x80:0x00) | (bShow? 0x40:0x00) | size); + DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); DWIN_Word(i, color); DWIN_Word(i, bColor); DWIN_Word(i, x); @@ -197,13 +230,34 @@ void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, DWIN_Send(i); } -/*ç”»é¢æ˜¾ç¤ºæ­£æ•´æ•° bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² zeroFill:true,补零;false,ä¸è¡¥é›¶ zeroMode:1,无效0显示为0; 0,无效0显示为空格 size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 iNum:ä½æ•° x/y:å˜é‡å·¦ä¸Šåæ ‡ value:æ•´åž‹å˜é‡*/ +void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, + uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const __FlashStringHelper *string) { + size_t i = 0; + DWIN_Byte(i, 0x11); + DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); + DWIN_Word(i, color); + DWIN_Word(i, bColor); + DWIN_Word(i, x); + DWIN_Word(i, y); + DWIN_String(i, string); + DWIN_Send(i); +} + +// Draw a positive integer +// bShow: true=display background color; false=don't display background color +// zeroFill: true=zero fill; false=no zero fill +// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space +// size: Font size +// color: Character color +// bColor: Background color +// iNum: Number of digits +// x/y: Upper-left coordinate +// value: Integer value void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint16_t value) { size_t i = 0; DWIN_Byte(i, 0x14); - DWIN_Byte(i, (bShow? 0x80:0x00) | (zeroFill? 0x20:0x00) | (zeroMode? 0x10:0x00) | size); + DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); DWIN_Word(i, color); DWIN_Word(i, bColor); DWIN_Byte(i, iNum); @@ -214,7 +268,7 @@ void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t for (char count = 0; count < 8; count++) { DWIN_Byte(i, value); value >>= 8; - if ((value&0xFF) == 0x00) break; + if (!(value & 0xFF)) break; } #else // Write a big-endian 64 bit integer @@ -229,14 +283,23 @@ void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t DWIN_Send(i); } -/*ç”»é¢æ˜¾ç¤ºæµ®ç‚¹æ•° bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² zeroFill:true,补零;false,ä¸è¡¥é›¶ zeroMode:1,无效0显示为0; 0,无效0显示为空格 size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 iNum:æ•´æ•°ä½æ•° fNum:å°æ•°ä½æ•° x/y:å˜é‡å·¦ä¸Šåæ ‡ value:浮点数å˜é‡*/ +// Draw a floating point number +// bShow: true=display background color; false=don't display background color +// zeroFill: true=zero fill; false=no zero fill +// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space +// size: Font size +// color: Character color +// bColor: Background color +// iNum: Number of whole digits +// fNum: Number of decimal digits +// x/y: Upper-left point +// value: Float value void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { //uint8_t *fvalue = (uint8_t*)&value; size_t i = 0; DWIN_Byte(i, 0x14); - DWIN_Byte(i, (bShow? 0x80:0x00) | (zeroFill? 0x20:0x00) | (zeroMode? 0x10:0x00) | size); + DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); DWIN_Word(i, color); DWIN_Word(i, bColor); DWIN_Byte(i, iNum); @@ -253,16 +316,21 @@ void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_ DWIN_Send(i); } -/*----------------------------------------------图片相关函数----------------------------------------------*/ -/*jpg图片显示并缓存在#0虚拟显示区 id:图片ID*/ +/*---------------------------------------- Picture related functions ----------------------------------------*/ + +// Draw JPG and cached in #0 virtual display area +// id: Picture ID void DWIN_JPG_ShowAndCache(const uint8_t id) { size_t i = 0; DWIN_Word(i, 0x2200); DWIN_Byte(i, id); - DWIN_Send(i); //AA 23 00 00 00 00 08 00 01 02 03 CC 33 C3 3C + DWIN_Send(i); // AA 23 00 00 00 00 08 00 01 02 03 CC 33 C3 3C } -/*图标显示 libID:图标库ID picID:图标ID x/y:图标左上åæ ‡*/ +// Draw an Icon +// libID: Icon library ID +// picID: Icon ID +// x/y: Upper-left point void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { NOMORE(x, DWIN_WIDTH - 1); NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl @@ -275,7 +343,8 @@ void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { DWIN_Send(i); } -/*jpg图片解压到#1虚拟显示区 id:图片ID*/ +// Unzip the JPG picture to virtual display area #1 +// id: picture ID void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { size_t i = 0; DWIN_Byte(i, 0x25); @@ -284,7 +353,11 @@ void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { DWIN_Send(i); } -/*从虚拟显示区å¤åˆ¶åŒºåŸŸè‡³å½“å‰ç”»é¢ cacheID:è™šæ‹ŸåŒºå· xStart/yStart:虚拟区左上åæ ‡ xEnd/yEnd:虚拟区å³ä¸‹åæ ‡ x/y:当å‰ç”»é¢ç²˜è´´åæ ‡*/ +// Copy area from virtual display area to current screen +// cacheID: virtual area number +// xStart/yStart: Upper-left of virtual area +// xEnd/yEnd: Lower-right of virtual area +// x/y: Screen paste point void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y) { size_t i = 0; From dd587d45db4bb7b4e59d8d81b2ac889339231022 Mon Sep 17 00:00:00 2001 From: Sebastien Andrivet Date: Mon, 3 Aug 2020 03:10:16 +0200 Subject: [PATCH 267/483] Fix Duplicator i3 Plus pin diagram (#18862) --- Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h index 21c3f6dbfee8..de80851df00c 100644 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -113,7 +113,7 @@ * # Pin | ATMEGA2560 Pin | Arduino # * ################################## * # 1 | 52 / PG1 (!RD) | 40 # - * # 2 | 95 / PF2 (A2) | 2 # + * # 2 | 95 / PF2 (A2) | 56 # * # 3 | 54 / PC1 (A9) | 36 # * # 4 | 53 / PC0 (A8) | 37 # * # 5 | 56 / PC3 (A11) | 34 # From c175cce56e28e578b808309a09e48b1a92da70a3 Mon Sep 17 00:00:00 2001 From: FLYmaker <49380822+FLYmaker@users.noreply.github.com> Date: Mon, 3 Aug 2020 09:13:57 +0800 Subject: [PATCH 268/483] Fix FLYF407ZG pins (#18865) --- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 42 ++- .../variants/FLY_F407ZG/PeripheralPins.c | 338 +++++++++--------- .../variants/FLY_F407ZG/variant.cpp | 226 ++++++------ .../PlatformIO/variants/FLY_F407ZG/variant.h | 237 ++++++------ 4 files changed, 443 insertions(+), 400 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 497db5817b76..499edc8dc0a7 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -31,7 +31,26 @@ #define BOARD_WEBSITE_URL "github.com/FLYmaker/FLYF407ZG" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB +// +// EEPROM Emulation +// +#if NO_EEPROM_SELECTED + #define FLASH_EEPROM_EMULATION + //#define SRAM_EEPROM_EMULATION + //#define I2C_EEPROM +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across + // the 128kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#elif ENABLED(I2C_EEPROM) + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB +#endif + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif // // Servos @@ -139,14 +158,14 @@ #define HEATER_2_PIN PE6 #define HEATER_3_PIN PE5 #define HEATER_4_PIN PE4 -#define HEATER_5_PIN PA2 +#define HEATER_5_PIN PE3 #define HEATER_BED_PIN PE2 #ifndef FAN_PIN #define FAN_PIN PF8 #endif #define FAN1_PIN PF9 -#define FAN2_PIN PE3 +#define FAN2_PIN PA2 #define FAN3_PIN PA1 #define FAN4_PIN PE13 #define FAN5_PIN PB11 @@ -168,8 +187,8 @@ #endif #if SD_CONNECTION_IS(ONBOARD) - #define SDIO_SUPPORT // Use SDIO for onboard SD + #define SDIO_SUPPORT // Use SDIO for onboard SD #ifndef SDIO_SUPPORT #define SOFTWARE_SPI // Use soft SPI for onboard SD #define SDSS SDIO_D3_PIN @@ -177,6 +196,15 @@ #define MISO_PIN SDIO_D0_PIN #define MOSI_PIN SDIO_CMD_PIN #endif + +#elif SD_CONNECTION_IS(LCD) + + #define SCK_PIN PB13 + #define MISO_PIN PB14 + #define MOSI_PIN PB15 + #define SDSS PF11 + #define SD_DETECT_PIN PB2 + #endif // @@ -232,11 +260,7 @@ // // LCD / Controller // -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SDSS PF11 -#define SD_DETECT_PIN PB2 + #define BEEPER_PIN PB10 #define LCD_PINS_RS PE12 #define LCD_PINS_ENABLE PE14 diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c index 5cce88b175a0..d621325aa3a4 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c @@ -45,26 +45,26 @@ const PinMap PinMap_ADC[] = { {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + //{PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 // {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + //{PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + //{PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + //{PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 @@ -73,21 +73,21 @@ const PinMap PinMap_ADC[] = { // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 // {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 // {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 + //{PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 + //{PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 + //{PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 // {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 {NC, NP, 0} @@ -98,8 +98,8 @@ const PinMap PinMap_ADC[] = { #ifdef HAL_DAC_MODULE_ENABLED const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 {NC, NP, 0} }; #endif @@ -109,21 +109,21 @@ const PinMap PinMap_DAC[] = { #ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SDA[] = { {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; #endif #ifdef HAL_I2C_MODULE_ENABLED const PinMap PinMap_I2C_SCL[] = { - {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + //{PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + //{PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; #endif @@ -132,78 +132,93 @@ const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED const PinMap PinMap_PWM[] = { - {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + + + + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 +// {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + + // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 +// {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + + // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + + // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + // {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + + //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + + // {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + + //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {NC, NP, 0} }; #endif @@ -212,17 +227,17 @@ const PinMap PinMap_PWM[] = { #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_TX[] = { - {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; @@ -230,17 +245,17 @@ const PinMap PinMap_UART_TX[] = { #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_RX[] = { - {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; @@ -248,26 +263,26 @@ const PinMap PinMap_UART_RX[] = { #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_RTS[] = { - {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +// {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, +// {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, +// {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, +// {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, +// {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, +// {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +// {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; #endif #ifdef HAL_UART_MODULE_ENABLED const PinMap PinMap_UART_CTS[] = { - {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +// {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, +// {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, +// {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, +// {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, +// {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, +// {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +// {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; #endif @@ -277,11 +292,11 @@ const PinMap PinMap_UART_CTS[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, +//{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; #endif @@ -289,11 +304,11 @@ const PinMap PinMap_SPI_MOSI[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, +//{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; #endif @@ -301,11 +316,11 @@ const PinMap PinMap_SPI_MISO[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, +//{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; #endif @@ -313,11 +328,11 @@ const PinMap PinMap_SPI_SCLK[] = { #ifdef HAL_SPI_MODULE_ENABLED const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, +//{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, +//{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, +//{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {NC, NP, 0} }; #endif @@ -326,22 +341,22 @@ const PinMap PinMap_SPI_SSEL[] = { #ifdef HAL_CAN_MODULE_ENABLED const PinMap PinMap_CAN_RD[] = { - {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, +//{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, +//{PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; #endif #ifdef HAL_CAN_MODULE_ENABLED const PinMap PinMap_CAN_TD[] = { - {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, +//{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +//{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, +//{PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; #endif @@ -349,7 +364,7 @@ const PinMap PinMap_CAN_TD[] = { //*** ETHERNET *** #ifdef HAL_ETH_MODULE_ENABLED -const PinMap PinMap_Ethernet[] = { +const PinMap PinMap_Ethernet[] = {/* {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO @@ -374,6 +389,7 @@ const PinMap PinMap_Ethernet[] = { {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 {NC, NP, 0} + */ }; #endif @@ -394,26 +410,26 @@ const PinMap PinMap_USB_OTG_FS[] = { #ifdef HAL_PCD_MODULE_ENABLED const PinMap PinMap_USB_OTG_HS[] = { -#ifdef USE_USB_HS_IN_FS - {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP -#else - {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK - {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT -#endif /* USE_USB_HS_IN_FS */ +//#ifdef USE_USB_HS_IN_FS +// {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF +// {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID +// {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS +// {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM +// {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP +// #else +// {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 +// {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK +// {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 +// {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 +// {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 +// {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 +// {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 +// {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 +// {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 +// {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP +// {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR +// {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT +//#endif /* USE_USB_HS_IN_FS */ {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp index 82cfc573dce2..1c7aedd9ac9c 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp @@ -36,118 +36,120 @@ extern "C" { const PinName digitalPin[] = { - PB_12, - PB_13, - PB_14, - PB_15, - PD_8, - PD_9, - PD_10, - PD_11, - PD_12, - PD_13, - PD_14, - PD_15, - PG_2, - PG_3, - PG_4, - PG_5, - PG_6, - PG_7, - PG_8, - PC_6, - PC_7, - PC_8, - PC_9, - PA_8, - PA_9, - PA_10, - PA_11, - PA_12, - PA_13, - PA_14, - PA_15, - PC_10, - PC_11, - PC_12, - PD_0, - PD_1, - PD_2, - PD_3, - PD_4, - PD_5, - PD_6, - PD_7, - PG_9, - PG_10, - PG_11, - PG_12, - PG_13, - PG_14, - PG_15, - PB_3, - PB_4, - PB_5, - PB_6, - PB_7, - PB_8, - PB_9, - PB_10, - PB_11, - PE_14, - PE_15, - PE_12, - PE_13, - PE_10, - PE_11, - PE_8, - PE_9, - PG_1, - PE_7, - PF_15, - PG_0, - PF_13, - PF_14, - PF_11, - PF_12, - PB_2, - PB_1, - PC_5, - PB_0, - PA_7, - PC_4, - PA_5, - PA_6, - PA_3, - PA_4, - PA_1, - PA_2, - PC_3, - PA_0, - PC_1, - PC_2, - PC_0, - PF_8, - PF_6, - PF_7, - PF_9, - PF_10, - PF_4, - PF_5, - PF_2, - PF_3, - PF_0, - PF_1, - PE_6, - PC_13, - PE_4, - PE_5, - PE_2, - PE_3, - PE_0, - PE_1, - PC_14, - PC_15, +PA_1, +PA_2, +PA_3, +PA_4, +PA_5, +PA_6, +PA_7, +PA_8, +PA_9, +PA_10, +PA_11, +PA_12, +PA_13, +PA_14, +PA_15, +PB_0, +PB_1, +PB_2, +PB_3, +PB_4, +PB_5, +PB_6, +PB_7, +PB_8, +PB_9, +PB_10, +PB_11, +PB_12, +PB_13, +PB_14, +PB_15, +PC_2, +PC_3, +PC_4, +PC_5, +PC_6, +PC_7, +PC_8, +PC_9, +PC_10, +PC_11, +PC_12, +PC_13, +PC_14, +PC_15, +PD_0, +PD_1, +PD_2, +PD_3, +PD_4, +PD_5, +PD_6, +PD_7, +PD_8, +PD_9, +PD_10, +PD_11, +PD_12, +PD_13, +PD_14, +PD_15, +PE_0, +PE_1, +PE_11, +PE_3, +PE_4, +PE_5, +PE_6, +PE_7, +PE_8, +PE_9, +PE_10, +PE_2, +PE_12, +PE_13, +PE_14, +PE_15, +PF_0, +PF_1, +PF_2, +PF_6, +PF_7, +PF_8, +PF_9, +PF_11, +PF_12, +PF_13, +PF_14, +PF_15, +PG_0, +PG_1, +PG_2, +PG_3, +PG_4, +PG_5, +PG_6, +PG_7, +PG_8, +PG_9, +PG_10, +PG_11, +PG_12, +PG_13, +PG_14, +PG_15, +PH_0, +PH_1, +PA_0, +PC_1, +PC_0, +PF_10, +PF_5, +PF_4, +PF_3, }; #ifdef __cplusplus diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h index 87033a68e5f6..ae973c89c527 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h @@ -38,126 +38,127 @@ extern "C" { * Pins *----------------------------------------------------------------------------*/ -// Left Side -#define PB12 0 -#define PB13 1 -#define PB14 2 -#define PB15 3 -#define PD8 4 -#define PD9 5 -#define PD10 6 -#define PD11 7 -#define PD12 8 -#define PD13 9 -#define PD14 10 -#define PD15 11 -#define PG2 12 -#define PG3 13 -#define PG4 14 -#define PG5 15 -#define PG6 16 -#define PG7 17 -#define PG8 18 -#define PC6 19 -#define PC7 20 -#define PC8 21 -#define PC9 22 -#define PA8 23 -#define PA9 24 -#define PA10 25 -#define PA11 26 // USB_DM -#define PA12 27 // USB_DP -#define PA13 28 -#define PA14 29 -#define PA15 30 -#define PC10 31 -#define PC11 32 -#define PC12 33 -#define PD0 34 -#define PD1 35 -#define PD2 36 -#define PD3 37 -#define PD4 38 -#define PD5 39 -#define PD6 40 -#define PD7 41 -#define PG9 42 -#define PG10 43 -#define PG11 44 -#define PG12 45 -#define PG13 46 -#define PG14 47 -#define PG15 48 -#define PB3 49 -#define PB4 50 -#define PB5 51 -#define PB6 52 -#define PB7 53 -#define PB8 54 -#define PB9 55 - -// Right Side -#define PB10 56 -#define PB11 57 -#define PE14 58 -#define PE15 59 -#define PE12 60 -#define PE13 61 -#define PE10 62 -#define PE11 63 -#define PE8 64 -#define PE9 65 -#define PG1 66 -#define PE7 67 -#define PF15 68 -#define PG0 69 -#define PF13 70 -#define PF14 71 -#define PF11 72 -#define PF12 73 -#define PB2 74 -#define PB1 75 // A0 -#define PC5 76 // A1 -#define PB0 77 // A2 -#define PA7 78 // A3 -#define PC4 79 // A4 -#define PA5 80 // A5 -#define PA6 81 // A6 -#define PA3 82 // A7 -#define PA4 83 // A8 -#define PA1 84 // A9 -#define PA2 85 // A10 -#define PC3 86 // A11 -#define PA0 87 // A12/PA_0(WK_UP): BUT K_UP) -#define PC1 88 // A13 -#define PC2 89 // A14 -#define PC0 90 // A15 -#define PF8 91 // A16 -#define PF6 92 // A17 -#define PF7 93 // A18 -#define PF9 94 // LED D1 (active low) -#define PF10 95 // LED D2 (active low) -#define PF4 96 -#define PF5 97 -#define PF2 98 -#define PF3 99 -#define PF0 100 -#define PF1 101 -#define PE6 102 -#define PC13 103 -#define PE4 104 // BUT K0 -#define PE5 105 // BUT K1 -#define PE2 106 -#define PE3 107 -#define PE0 108 -#define PE1 109 -#define PC14 110 -#define PC15 111 + +#define PA1 0 +#define PA2 1 +#define PA3 2 +#define PA4 3 +#define PA5 4 +#define PA6 5 +#define PA7 6 +#define PA8 7 +#define PA9 8 +#define PA10 9 +#define PA11 10 +#define PA12 11 +#define PA13 12 +#define PA14 13 +#define PA15 14 +#define PB0 15 +#define PB1 16 +#define PB2 17 +#define PB3 18 +#define PB4 19 +#define PB5 20 +#define PB6 21 +#define PB7 22 +#define PB8 23 +#define PB9 24 +#define PB10 25 +#define PB11 26 +#define PB12 27 +#define PB13 28 +#define PB14 29 +#define PB15 30 +#define PC2 31 +#define PC3 32 +#define PC4 33 +#define PC5 34 +#define PC6 35 +#define PC7 36 +#define PC8 37 +#define PC9 38 +#define PC10 39 +#define PC11 40 +#define PC12 41 +#define PC13 42 +#define PC14 43 +#define PC15 44 +#define PD0 45 +#define PD1 46 +#define PD2 47 +#define PD3 48 +#define PD4 49 +#define PD5 50 +#define PD6 51 +#define PD7 52 +#define PD8 53 +#define PD9 54 +#define PD10 55 +#define PD11 56 +#define PD12 57 +#define PD13 58 +#define PD14 59 +#define PD15 60 +#define PE0 61 +#define PE1 62 +#define PE11 63 +#define PE3 64 +#define PE4 65 +#define PE5 66 +#define PE6 67 +#define PE7 68 +#define PE8 69 +#define PE9 70 +#define PE10 71 +#define PE2 72 +#define PE12 73 +#define PE13 74 +#define PE14 75 +#define PE15 76 +#define PF0 77 +#define PF1 78 +#define PF2 79 +#define PF6 80 +#define PF7 81 +#define PF8 82 +#define PF9 83 +#define PF11 84 +#define PF12 85 +#define PF13 86 +#define PF14 87 +#define PF15 88 +#define PG0 89 +#define PG1 90 +#define PG2 91 +#define PG3 92 +#define PG4 93 +#define PG5 94 +#define PG6 95 +#define PG7 96 +#define PG8 97 +#define PG9 98 +#define PG10 99 +#define PG11 100 +#define PG12 101 +#define PG13 102 +#define PG14 103 +#define PG15 104 +#define PH0 105 +#define PH1 106 +#define PA0 107 +#define PC1 108 +#define PC0 109 +#define PF10 110 +#define PF5 111 +#define PF4 112 +#define PF3 113 + // This must be a literal -#define NUM_DIGITAL_PINS 112 +#define NUM_DIGITAL_PINS 114 // This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS 23 -#define NUM_ANALOG_FIRST 75 +#define NUM_ANALOG_INPUTS 7 +#define NUM_ANALOG_FIRST 107 // Below SPI and I2C definitions already done in the core From 5701387ab9bc4f493f2db84694133e0fe8dce232 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 3 Aug 2020 13:16:12 +1200 Subject: [PATCH 269/483] Fix Spindle/Laser PWM DC (#18871) --- Marlin/src/feature/spindle_laser.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 3dcf6e928a26..68261f2fc581 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -66,6 +66,9 @@ void SpindleLaser::init() { void SpindleLaser::set_ocr(const uint8_t ocr) { WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_HIGH); // turn spindle on analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY + set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); + #endif } void SpindleLaser::ocr_off() { WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Turn spindle off From 4d36baf3759dcf951e815ed18012adac2f504930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus=20N=C3=A4veke?= Date: Mon, 3 Aug 2020 03:17:43 +0200 Subject: [PATCH 270/483] No mks_robin extra_scripts in Trigorilla build (#18872) --- platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio.ini b/platformio.ini index 790d6f9d0f80..450fffcc005f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -651,6 +651,7 @@ extra_scripts = ${common.extra_scripts} [env:trigorilla_pro] platform = ${common_stm32f1.platform} extends = env:mks_robin +extra_scripts = ${common.extra_scripts} # # MKS Robin E3D (STM32F103RCT6) and From 5e3411029d594ade5b4a496ac43864b9fa52fbdc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 2 Aug 2020 20:34:24 -0500 Subject: [PATCH 271/483] Clean up some PeripheralPins --- .../variants/FLY_F407ZG/PeripheralPins.c | 357 +++++++++--------- .../variants/MARLIN_F407VE/PeripheralPins.c | 30 +- 2 files changed, 175 insertions(+), 212 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c index d621325aa3a4..0ac1d25ce9f5 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c @@ -31,7 +31,6 @@ #include #include - /* ===== * Note: Commented lines are alternative possibilities which are not used per default. * If you change them, you will have to know what you do @@ -41,46 +40,46 @@ //*** ADC *** #ifdef HAL_ADC_MODULE_ENABLED -const PinMap PinMap_ADC[] = { +WEAK const PinMap PinMap_ADC[] = { {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 //{PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + //{PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - // {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + //{PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 //{PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + //{PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 //{PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 //{PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + //{PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - // {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + //{PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - // {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + //{PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + //{PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + //{PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 @@ -88,7 +87,7 @@ const PinMap PinMap_ADC[] = { //{PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 //{PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 //{PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 - // {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 + //{PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 {NC, NP, 0} }; @@ -97,9 +96,9 @@ const PinMap PinMap_ADC[] = { //*** DAC *** #ifdef HAL_DAC_MODULE_ENABLED -const PinMap PinMap_DAC[] = { - // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 +WEAK const PinMap PinMap_DAC[] = { + //{PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + //{PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 {NC, NP, 0} }; #endif @@ -107,7 +106,7 @@ const PinMap PinMap_DAC[] = { //*** I2C *** #ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SDA[] = { +WEAK const PinMap PinMap_I2C_SDA[] = { {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, //{PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, //{PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, @@ -115,10 +114,8 @@ const PinMap PinMap_I2C_SDA[] = { //{PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SCL[] = { +WEAK const PinMap PinMap_I2C_SCL[] = { //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, //{PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -131,91 +128,88 @@ const PinMap PinMap_I2C_SCL[] = { //*** PWM *** #ifdef HAL_TIM_MODULE_ENABLED -const PinMap PinMap_PWM[] = { - - - - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 +WEAK const PinMap PinMap_PWM[] = { + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - - // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N -// {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N -// {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - // {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - - // {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + + //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 @@ -226,7 +220,7 @@ const PinMap PinMap_PWM[] = { //*** SERIAL *** #ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_TX[] = { +WEAK const PinMap PinMap_UART_TX[] = { //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -241,10 +235,8 @@ const PinMap PinMap_UART_TX[] = { {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_RX[] = { +WEAK const PinMap PinMap_UART_RX[] = { //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -259,30 +251,26 @@ const PinMap PinMap_UART_RX[] = { {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_RTS[] = { -// {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, -// {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, -// {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -// {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, -// {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -// {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, -// {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +WEAK const PinMap PinMap_UART_RTS[] = { + //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_CTS[] = { -// {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, -// {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, -// {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -// {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, -// {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -// {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, -// {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +WEAK const PinMap PinMap_UART_CTS[] = { + //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, {NC, NP, 0} }; #endif @@ -290,49 +278,43 @@ const PinMap PinMap_UART_CTS[] = { //*** SPI *** #ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MOSI[] = { +WEAK const PinMap PinMap_SPI_MOSI[] = { {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MISO[] = { +WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_SCLK[] = { +WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, -//{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_SSEL[] = { +WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, -//{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, -//{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, -//{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, -//{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + //{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, {NC, NP, 0} }; #endif @@ -340,23 +322,21 @@ const PinMap PinMap_SPI_SSEL[] = { //*** CAN *** #ifdef HAL_CAN_MODULE_ENABLED -const PinMap PinMap_CAN_RD[] = { -//{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, -//{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, -//{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, -//{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, -//{PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +WEAK const PinMap PinMap_CAN_RD[] = { + //{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED -const PinMap PinMap_CAN_TD[] = { -//{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, -//{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, -//{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, -//{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, -//{PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, +WEAK const PinMap PinMap_CAN_TD[] = { + //{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + //{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + //{PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; #endif @@ -364,7 +344,8 @@ const PinMap PinMap_CAN_TD[] = { //*** ETHERNET *** #ifdef HAL_ETH_MODULE_ENABLED -const PinMap PinMap_Ethernet[] = {/* +WEAK const PinMap PinMap_Ethernet[] = { + /* {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO @@ -398,38 +379,38 @@ const PinMap PinMap_Ethernet[] = {/* //*** USB *** #ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID +WEAK const PinMap PinMap_USB_OTG_FS[] = { + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_HS[] = { -//#ifdef USE_USB_HS_IN_FS -// {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF -// {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID -// {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS -// {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM -// {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP -// #else -// {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 -// {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK -// {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 -// {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 -// {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 -// {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 -// {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 -// {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 -// {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 -// {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP -// {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR -// {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT -//#endif /* USE_USB_HS_IN_FS */ +WEAK const PinMap PinMap_USB_OTG_HS[] = { + /* + #ifdef USE_USB_HS_IN_FS + {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP + #else + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT + #endif // USE_USB_HS_IN_FS + */ {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c index 6b6cfdbcb0b8..d3c76713bf53 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c @@ -122,9 +122,7 @@ WEAK const PinMap PinMap_I2C_SDA[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_I2C_MODULE_ENABLED WEAK const PinMap PinMap_I2C_SCL[] = { {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, @@ -239,9 +237,7 @@ WEAK const PinMap PinMap_UART_TX[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RX[] = { {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, @@ -259,9 +255,7 @@ WEAK const PinMap PinMap_UART_RX[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_RTS[] = { {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -274,9 +268,7 @@ WEAK const PinMap PinMap_UART_RTS[] = { #endif {NC, NP, 0} }; -#endif -#ifdef HAL_UART_MODULE_ENABLED WEAK const PinMap PinMap_UART_CTS[] = { {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, @@ -303,9 +295,7 @@ WEAK const PinMap PinMap_SPI_MOSI[] = { {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_MISO[] = { {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, @@ -315,9 +305,7 @@ WEAK const PinMap PinMap_SPI_MISO[] = { {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SCLK[] = { {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, @@ -327,9 +315,7 @@ WEAK const PinMap PinMap_SPI_SCLK[] = { {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, {NC, NP, 0} }; -#endif -#ifdef HAL_SPI_MODULE_ENABLED WEAK const PinMap PinMap_SPI_SSEL[] = { {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, @@ -352,9 +338,7 @@ WEAK const PinMap PinMap_CAN_RD[] = { {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {NC, NP, 0} }; -#endif -#ifdef HAL_CAN_MODULE_ENABLED WEAK const PinMap PinMap_CAN_TD[] = { {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, @@ -388,12 +372,12 @@ WEAK const PinMap PinMap_Ethernet[] = { {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 -#endif + #if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + #endif {NC, NP, 0} }; #endif @@ -411,9 +395,7 @@ WEAK const PinMap PinMap_USB_OTG_FS[] = { {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP {NC, NP, 0} }; -#endif -#ifdef HAL_PCD_MODULE_ENABLED WEAK const PinMap PinMap_USB_OTG_HS[] = { #ifdef USE_USB_HS_IN_FS {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF From ef749bb69dbf23ccce343eb028c46a8a620b3c18 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 4 Aug 2020 00:10:16 +0000 Subject: [PATCH 272/483] [cron] Bump distribution date (2020-08-04) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index b8e0c837513e..ce9146bb69a6 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-03" + #define STRING_DISTRIBUTION_DATE "2020-08-04" #endif /** From ca0ebf10d10d3c8e99c83c123c5ff2a678cda900 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 3 Aug 2020 21:55:37 -0500 Subject: [PATCH 273/483] Move scaled TFT / touch defines (#18915) --- .../STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp | 4 +- Marlin/src/MarlinCore.cpp | 31 +++-- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 129 +++++++++--------- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 21 --- .../extui/lib/mks_ui/mks_hardware_test.cpp | 3 +- .../lib/mks_ui/tft_lvgl_configuration.cpp | 40 +++--- Marlin/src/lcd/lcdprint.h | 22 +++ Marlin/src/lcd/scaled_tft.h | 50 +++++++ Marlin/src/{feature => lcd}/touch/xpt2046.cpp | 37 ++--- Marlin/src/{feature => lcd}/touch/xpt2046.h | 0 Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 41 +++--- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 41 +++--- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 11 +- 14 files changed, 242 insertions(+), 190 deletions(-) create mode 100644 Marlin/src/lcd/scaled_tft.h rename Marlin/src/{feature => lcd}/touch/xpt2046.cpp (87%) rename Marlin/src/{feature => lcd}/touch/xpt2046.h (100%) diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp index 286dcfb5d0dc..206c3fda3d3f 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp @@ -20,7 +20,7 @@ #include "../../../inc/MarlinConfig.h" -#if BOTH(HAS_GRAPHICAL_LCD, SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) +#if ENABLED(SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) #include "../HAL.h" #include @@ -232,5 +232,5 @@ uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void return 1; } -#endif // HAS_GRAPHICAL_LCD +#endif // SPI_GRAPHICAL_TFT && !FORCE_SOFT_SPI #endif // STM32F1 diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 98f4527eee57..74e15250e6ff 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -39,26 +39,27 @@ #include #include "core/utility.h" -#include "lcd/ultralcd.h" #include "module/motion.h" #include "module/planner.h" -#include "module/stepper.h" #include "module/endstops.h" -#include "module/probe.h" #include "module/temperature.h" -#include "sd/cardreader.h" #include "module/configuration_store.h" #include "module/printcounter.h" // PrintCounter or Stopwatch -#include "feature/closedloop.h" +#include "module/stepper.h" #include "module/stepper/indirection.h" -#include "libs/nozzle.h" - #include "gcode/gcode.h" #include "gcode/parser.h" #include "gcode/queue.h" +#include "sd/cardreader.h" + +#include "lcd/ultralcd.h" +#if HAS_TOUCH_XPT2046 + #include "lcd/touch/xpt2046.h" +#endif + #if HAS_TFT_LVGL_UI #include "lcd/extui/lib/mks_ui/tft_lvgl_configuration.h" #include "lcd/extui/lib/mks_ui/draw_ui.h" @@ -80,10 +81,6 @@ #include "feature/direct_stepping.h" #endif -#if HAS_TOUCH_XPT2046 - #include "feature/touch/xpt2046.h" -#endif - #if ENABLED(HOST_ACTION_COMMANDS) #include "feature/host_actions.h" #endif @@ -92,6 +89,10 @@ #include "libs/buzzer.h" #endif +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + #include "feature/closedloop.h" +#endif + #if HAS_I2C_DIGIPOT #include "feature/digipot/digipot.h" #endif @@ -176,6 +177,10 @@ #include "feature/runout.h" #endif +#if HAS_Z_SERVO_PROBE + #include "module/probe.h" +#endif + #if ENABLED(HOTEND_IDLE_TIMEOUT) #include "feature/hotend_idle.h" #endif @@ -1194,7 +1199,9 @@ void setup() { #endif #if HAS_TFT_LVGL_UI - if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts + #if ENABLED(SDSUPPORT) + if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts + #endif SETUP_RUN(tft_lvgl_init()); #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index d081541c5ae6..0f6cbcbb8a68 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -20,40 +20,39 @@ * */ -/* - - u8g_dev_tft_320x240_upscale_from_128x64.cpp - - Universal 8bit Graphics Library - - Copyright (c) 2011, olikraus@gmail.com - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list - of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ +/** + * u8g_dev_tft_320x240_upscale_from_128x64.cpp + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ #include "../../inc/MarlinConfig.h" @@ -80,14 +79,16 @@ extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); #endif -#define WIDTH LCD_PIXEL_WIDTH +#define WIDTH LCD_PIXEL_WIDTH #define HEIGHT LCD_PIXEL_HEIGHT #define PAGE_HEIGHT 8 -#define X_LO LCD_PIXEL_OFFSET_X -#define Y_LO LCD_PIXEL_OFFSET_Y -#define X_HI (X_LO + (FSMC_UPSCALE) * WIDTH - 1) -#define Y_HI (Y_LO + (FSMC_UPSCALE) * HEIGHT - 1) +#include "../scaled_tft.h" + +#define UPSCALE0(M) ((M) * (FSMC_UPSCALE)) +#define UPSCALE(A,M) (UPSCALE0(M) + (A)) +#define X_HI (UPSCALE(LCD_PIXEL_OFFSET_X, WIDTH) - 1) +#define Y_HI (UPSCALE(LCD_PIXEL_OFFSET_Y, HEIGHT) - 1) // see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html @@ -153,7 +154,6 @@ static uint32_t lcd_id = 0; #define ILI9328_VASTART 0x52 /* Vertical address start position (0-511) */ #define ILI9328_VAEND 0x53 /* Vertical address end position (0-511) */ - static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { #if HAS_LCD_IO #define IO_REG_DATA(R,D) do { LCD_IO_WriteReg(R); LCD_IO_WriteData(D); }while(0) @@ -216,7 +216,6 @@ static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_ static void setWindow_none(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) {} void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) = setWindow_none; - #define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x #define ESC_DELAY(x) 0xFFFF, 0x8000 | (x & 0x7FFF) #define ESC_END 0xFFFF, 0x7FFF @@ -552,20 +551,20 @@ static const uint16_t st9677_init[] = { #define BUTTON_SIZE_Y 20 // 14, 90, 166, 242, 185 are the original values upscaled 2x. - #define BUTTOND_X_LO (14 / 2) * (FSMC_UPSCALE) - #define BUTTOND_X_HI (BUTTOND_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1) + #define BUTTOND_X_LO UPSCALE0(14 / 2) + #define BUTTOND_X_HI (UPSCALE(BUTTOND_X_LO, BUTTON_SIZE_X) - 1) - #define BUTTONA_X_LO (90 / 2) * (FSMC_UPSCALE) - #define BUTTONA_X_HI (BUTTONA_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1) + #define BUTTONA_X_LO UPSCALE0(90 / 2) + #define BUTTONA_X_HI (UPSCALE(BUTTONA_X_LO, BUTTON_SIZE_X) - 1) - #define BUTTONB_X_LO (166 / 2) * (FSMC_UPSCALE) - #define BUTTONB_X_HI (BUTTONB_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1) + #define BUTTONB_X_LO UPSCALE0(166 / 2) + #define BUTTONB_X_HI (UPSCALE(BUTTONB_X_LO, BUTTON_SIZE_X) - 1) - #define BUTTONC_X_LO (242 / 2) * (FSMC_UPSCALE) - #define BUTTONC_X_HI (BUTTONC_X_LO + (FSMC_UPSCALE) * BUTTON_SIZE_X - 1) + #define BUTTONC_X_LO UPSCALE0(242 / 2) + #define BUTTONC_X_HI (UPSCALE(BUTTONC_X_LO, BUTTON_SIZE_X) - 1) - #define BUTTON_Y_LO (140 / 2) * (FSMC_UPSCALE) + 44 //184 2x, 254 3x - #define BUTTON_Y_HI (BUTTON_Y_LO + (FSMC_UPSCALE) * BUTTON_SIZE_Y - 1) + #define BUTTON_Y_LO UPSCALE0(140 / 2) + 44 // 184 2x, 254 3x + #define BUTTON_Y_HI (UPSCALE(BUTTON_Y_LO, BUTTON_SIZE_Y) - 1) void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) { uint16_t buffer[BUTTON_SIZE_X * sq(FSMC_UPSCALE)]; @@ -584,8 +583,8 @@ static const uint16_t st9677_init[] = { } #if HAS_LCD_IO LOOP_S_L_N(n, 1, FSMC_UPSCALE) - for (uint16_t l = 0; l < length * (FSMC_UPSCALE); l++) - buffer[l + (length * (FSMC_UPSCALE) * n)] = buffer[l]; + for (uint16_t l = 0; l < UPSCALE0(length); l++) + buffer[l + n * UPSCALE0(length)] = buffer[l]; LCD_IO_WriteSequence(buffer, length * sq(FSMC_UPSCALE)); #else @@ -660,27 +659,27 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u } // Clear Screen - setWindow(u8g, dev, 0, 0, LCD_FULL_PIXEL_WIDTH - 1, LCD_FULL_PIXEL_HEIGHT - 1); + setWindow(u8g, dev, 0, 0, (LCD_FULL_PIXEL_WIDTH) - 1, (LCD_FULL_PIXEL_HEIGHT) - 1); #if HAS_LCD_IO - LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT); + LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); #else - memset2(buffer, TFT_MARLINBG_COLOR, 160); - for (uint16_t i = 0; i < 960; i++) - u8g_WriteSequence(u8g, dev, 160, (uint8_t *)buffer); + memset2(buffer, TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) / 2); + for (uint16_t i = 0; i < (LCD_FULL_PIXEL_WIDTH) * 3; i++) + u8g_WriteSequence(u8g, dev, (LCD_FULL_PIXEL_WIDTH) / 2, (uint8_t *)buffer); #endif // Bottom buttons #if HAS_TOUCH_XPT2046 - setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); + setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR); - setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI); + setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI); drawImage(buttonA, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); - setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI); + setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI); drawImage(buttonB, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); - setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); + setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR); #endif // HAS_TOUCH_XPT2046 @@ -690,7 +689,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u case U8G_DEV_MSG_PAGE_FIRST: page = 0; - setWindow(u8g, dev, X_LO, Y_LO, X_HI, Y_HI); + setWindow(u8g, dev, LCD_PIXEL_OFFSET_X, LCD_PIXEL_OFFSET_Y, X_HI, Y_HI); break; case U8G_DEV_MSG_PAGE_NEXT: @@ -708,8 +707,8 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u } #if HAS_LCD_IO LOOP_S_L_N(n, 1, FSMC_UPSCALE) - for (uint16_t l = 0; l < WIDTH * (FSMC_UPSCALE); l++) - buffer[l + WIDTH * (FSMC_UPSCALE) * n] = buffer[l]; + for (uint16_t l = 0; l < UPSCALE0(WIDTH); l++) + buffer[l + n * UPSCALE0(WIDTH)] = buffer[l]; if (allow_async) { if (y > 0 || page > 1) LCD_IO_WaitSequence_Async(); diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 5ebff37edfd1..40402fe5acb2 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -212,30 +212,9 @@ #endif #endif -// LCD_FULL_PIXEL_WIDTH = -// LCD_PIXEL_OFFSET_X + (LCD_PIXEL_WIDTH * 2) + LCD_PIXEL_OFFSET_X -#if TFT_SCALED_DOGLCD - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 320 - #endif - #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 32 - #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 240 - #endif - #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 - #endif -#endif - // For selective rendering within a Y range #define PAGE_OVER(ya) ((ya) <= u8g.getU8g()->current_page.y1) // Does the current page follow a region top? #define PAGE_UNDER(yb) ((yb) >= u8g.getU8g()->current_page.y0) // Does the current page precede a region bottom? #define PAGE_CONTAINS(ya, yb) ((yb) >= u8g.getU8g()->current_page.y0 && (ya) <= u8g.getU8g()->current_page.y1) // Do two vertical regions overlap? -#ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 2 -#endif - extern U8G_CLASS u8g; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index b5b77c50b24b..00371d7ab5ab 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -35,9 +35,10 @@ #include "pic_manager.h" #include +#include "../../../touch/xpt2046.h" + #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" -#include "../../../../feature/touch/xpt2046.h" #include "../../../../sd/cardreader.h" uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det2_sta, mt_det3_sta; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 96eedd32964f..fc5b8c1bf24e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -41,8 +41,11 @@ #include "draw_ui.h" #include -#include "../../../../MarlinCore.h" -#include "../../../../feature/touch/xpt2046.h" +#include "../../../../inc/MarlinConfig.h" + +#if HAS_TOUCH_XPT2046 + #include "../../../touch/xpt2046.h" +#endif #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -50,6 +53,13 @@ #include +#ifndef LCD_FULL_PIXEL_WIDTH + #define LCD_FULL_PIXEL_WIDTH 480 +#endif +#ifndef LCD_FULL_PIXEL_HEIGHT + #define LCD_FULL_PIXEL_HEIGHT 320 +#endif + #if HAS_SPI_FLASH_FONT extern void init_gb2312_font(); #endif @@ -127,9 +137,8 @@ void LCD_WriteRAM_Prepare(void) { void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { //if (DeviceCode == 0x9488) { - if ((x > 480) || (y > 320)) return; + if (x > (LCD_FULL_PIXEL_WIDTH) || y > (LCD_FULL_PIXEL_HEIGHT)) return; //} - //**if ( (x>320)||(y>240) ) return; tft_set_cursor(x, y); LCD_WriteRAM_Prepare(); @@ -187,10 +196,10 @@ void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16 LCD_WriteReg(0x0052, StartY); LCD_WriteReg(0x0051, xEnd); LCD_WriteReg(0x0053, yEnd);*/ - LCD_WriteReg(0x0050, StartY); //Specify the start/end positions of the window address in the horizontal direction by an address unit - LCD_WriteReg(0x0051, yEnd); //Specify the start positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit + LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit LCD_WriteReg(0x0052, 320 - xEnd); - LCD_WriteReg(0x0053, 320 - StartX - 1); //Specify the end positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0053, 320 - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit } else { @@ -224,16 +233,16 @@ void LCD_Clear(uint16_t Color) { if (DeviceCode == 0x9488) { tft_set_cursor(0, 0); - ili9320_SetWindows(0, 0, 480, 320); + ili9320_SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); LCD_WriteRAM_Prepare(); #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteMultiple(Color, LCD_FULL_PIXEL_WIDTH * LCD_FULL_PIXEL_HEIGHT); + LCD_IO_WriteMultiple(Color, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); #else - //index = (160*480); - for (index = 0; index < 320 * 480; index++) - LCD_IO_WriteData(Color); + //index = (LCD_FULL_PIXEL_HEIGHT) / 2 * (LCD_FULL_PIXEL_WIDTH); + for (index = 0; index < (LCD_FULL_PIXEL_HEIGHT) * (LCD_FULL_PIXEL_WIDTH); index++) + LCD_IO_WriteData(Color); #endif - //LCD_IO_WriteMultiple(Color, (480*320)); + //LCD_IO_WriteMultiple(Color, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); //while(index --) LCD_IO_WriteData(Color); } else if (DeviceCode == 0x5761) { @@ -262,7 +271,6 @@ void LCD_Clear(uint16_t Color) { extern uint16_t ILI9488_ReadRAM(); - void init_tft() { uint16_t i; //************* Start Initial Sequence **********// @@ -393,7 +401,7 @@ void init_tft() { for (i = 0; i < 65535; i++); LCD_IO_WriteReg(0x0029); - ili9320_SetWindows(0, 0, 480, 320); + ili9320_SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); LCD_Clear(0x0000); OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); @@ -486,7 +494,7 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co #if ENABLED(TFT_LVGL_UI_SPI) uint16_t i, width, height; uint16_t clr_temp; - uint8_t tbuf[480 * 2]; + uint8_t tbuf[(LCD_FULL_PIXEL_WIDTH) * 2]; SPI_TFT.spi_init(SPI_FULL_SPEED); diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 341cc4f5c21c..8e611bde8325 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /** * @file lcdprint.h * @brief LCD print api diff --git a/Marlin/src/lcd/scaled_tft.h b/Marlin/src/lcd/scaled_tft.h new file mode 100644 index 000000000000..f22bdf696ad9 --- /dev/null +++ b/Marlin/src/lcd/scaled_tft.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../inc/MarlinConfig.h" + +#ifndef FSMC_UPSCALE + #define FSMC_UPSCALE 2 +#endif + +#ifndef LCD_FULL_PIXEL_WIDTH + #if FSMC_UPSCALE == 3 + #define LCD_FULL_PIXEL_WIDTH 480 + #else + #define LCD_FULL_PIXEL_WIDTH 320 + #endif +#endif +#ifndef LCD_FULL_PIXEL_HEIGHT + #if FSMC_UPSCALE == 3 + #define LCD_FULL_PIXEL_HEIGHT 320 + #else + #define LCD_FULL_PIXEL_HEIGHT 240 + #endif +#endif + +#ifndef LCD_PIXEL_OFFSET_X + #define LCD_PIXEL_OFFSET_X 48 +#endif +#ifndef LCD_PIXEL_OFFSET_Y + #define LCD_PIXEL_OFFSET_Y 48 +#endif diff --git a/Marlin/src/feature/touch/xpt2046.cpp b/Marlin/src/lcd/touch/xpt2046.cpp similarity index 87% rename from Marlin/src/feature/touch/xpt2046.cpp rename to Marlin/src/lcd/touch/xpt2046.cpp index b75f3ee2f220..1fed5b78f0e3 100644 --- a/Marlin/src/feature/touch/xpt2046.cpp +++ b/Marlin/src/lcd/touch/xpt2046.cpp @@ -21,11 +21,8 @@ #if HAS_TOUCH_XPT2046 -#if TFT_SCALED_DOGLCD - #include "../../lcd/dogm/ultralcd_DOGM.h" // for LCD_FULL_PIXEL_WIDTH, etc. -#endif - #include "xpt2046.h" +#include "../scaled_tft.h" #ifndef XPT2046_Z1_THRESHOLD #define XPT2046_Z1_THRESHOLD 10 @@ -35,12 +32,12 @@ * Draw and Touch processing * * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. - * TOUCH_SCREEN_WIDTH/HEIGHT (320x240) is the Touch Area resolution. + * TOUCH_SENSOR_WIDTH/HEIGHT (320x240) is the Touch Area resolution. * LCD_FULL_PIXEL_WIDTH/HEIGHT (320x240 or 480x320) is the Actual (FSMC) Display resolution. * * - All native (u8g) drawing is done in LCD_PIXEL_* (128x64) * - The DOGM pixels are is upscaled 2-3x (as needed) for display. - * - Touch coordinates use TOUCH_SCREEN_* resolution and are converted to + * - Touch coordinates use TOUCH_SENSOR_* resolution and are converted to * click and scroll-wheel events (emulating of a common DOGM display). * * TOUCH_SCREEN resolution exists to fit our calibration values. The original touch code was made @@ -54,21 +51,25 @@ * The Marlin screen touchable area starts at LCD_PIXEL_OFFSET_X/Y (translated to SCREEN_START_LEFT/TOP) * and spans LCD_PIXEL_WIDTH/HEIGHT (scaled to SCREEN_WIDTH/HEIGHT). */ -// Touch screen resolution independent of display resolution -#define TOUCH_SCREEN_HEIGHT 240 -#define TOUCH_SCREEN_WIDTH 320 // Coordinates in terms of touch area #define BUTTON_AREA_TOP 175 #define BUTTON_AREA_BOT 234 -#define SCREEN_START_TOP ((LCD_PIXEL_OFFSET_Y) * (TOUCH_SCREEN_HEIGHT) / (LCD_FULL_PIXEL_HEIGHT)) -#define SCREEN_START_LEFT ((LCD_PIXEL_OFFSET_X) * (TOUCH_SCREEN_WIDTH) / (LCD_FULL_PIXEL_WIDTH)) -#define SCREEN_HEIGHT ((LCD_PIXEL_HEIGHT * FSMC_UPSCALE) * (TOUCH_SCREEN_HEIGHT) / (LCD_FULL_PIXEL_HEIGHT)) -#define SCREEN_WIDTH ((LCD_PIXEL_WIDTH * FSMC_UPSCALE) * (TOUCH_SCREEN_WIDTH) / (LCD_FULL_PIXEL_WIDTH)) +// Touch sensor resolution independent of display resolution +#define TOUCH_SENSOR_WIDTH 320 +#define TOUCH_SENSOR_HEIGHT 240 + +#define SCREEN_WIDTH_PCT(X) ((X) * (TOUCH_SENSOR_WIDTH) / (LCD_FULL_PIXEL_WIDTH)) +#define SCREEN_HEIGHT_PCT(Y) ((Y) * (TOUCH_SENSOR_HEIGHT) / (LCD_FULL_PIXEL_HEIGHT)) + +#define SCREEN_START_LEFT SCREEN_WIDTH_PCT(LCD_PIXEL_OFFSET_X) +#define SCREEN_START_TOP SCREEN_HEIGHT_PCT(LCD_PIXEL_OFFSET_Y) +#define SCREEN_WIDTH SCREEN_WIDTH_PCT((LCD_PIXEL_WIDTH) * (FSMC_UPSCALE)) +#define SCREEN_HEIGHT SCREEN_HEIGHT_PCT((LCD_PIXEL_HEIGHT) * (FSMC_UPSCALE)) -#define TOUCHABLE_Y_HEIGHT SCREEN_HEIGHT #define TOUCHABLE_X_WIDTH SCREEN_WIDTH +#define TOUCHABLE_Y_HEIGHT SCREEN_HEIGHT #ifndef TOUCH_INT_PIN #define TOUCH_INT_PIN -1 @@ -125,8 +126,8 @@ uint8_t XPT2046::read_buttons() { if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. #if ENABLED(GRAPHICAL_TFT_ROTATE_180) - x = TOUCH_SCREEN_WIDTH - x; - y = TOUCH_SCREEN_HEIGHT - y; + x = TOUCH_SENSOR_WIDTH - x; + y = TOUCH_SENSOR_HEIGHT - y; #endif // Touch within the button area simulates an encoder button @@ -137,11 +138,11 @@ uint8_t XPT2046::read_buttons() { : WITHIN(x, 242, 305) ? EN_C : 0; - if (x > TOUCH_SCREEN_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0; + if (x > TOUCH_SENSOR_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0; // Column and row above BUTTON_AREA_TOP int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH), - row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT); + row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT); // Send the touch to the UI (which will simulate the encoder wheel) MarlinUI::screen_click(row, col, x, y); diff --git a/Marlin/src/feature/touch/xpt2046.h b/Marlin/src/lcd/touch/xpt2046.h similarity index 100% rename from Marlin/src/feature/touch/xpt2046.h rename to Marlin/src/lcd/touch/xpt2046.h diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 92e3f136c953..b7dd4944ef70 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -150,7 +150,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; volatile uint8_t MarlinUI::slow_buttons; #endif #if HAS_TOUCH_XPT2046 - #include "../feature/touch/xpt2046.h" + #include "touch/xpt2046.h" bool MarlinUI::on_edit_screen = false; #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index b2eda47978a1..31aa873b5259 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -112,10 +112,6 @@ #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -161,7 +157,7 @@ #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - //SPI 2 + // SPI 2 #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 @@ -171,31 +167,32 @@ #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - // #define TOUCH_INT_PIN PB6 - - #define SPI_TFT_CS_PIN TOUCH_CS_PIN - #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN - #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN - #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN - #define SPI_TFT_DC_PIN PB6 - #define SPI_TFT_RST_PIN PF11 + //#define TOUCH_INT_PIN PB6 + + #if ENABLED(TFT_LVGL_UI_SPI) + #define SPI_TFT_CS_PIN TOUCH_CS_PIN + #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN + #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN + #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN + #define SPI_TFT_DC_PIN PB6 + #define SPI_TFT_RST_PIN PF11 + #endif #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 - - #define LCD_PIXEL_HEIGHT 320 - #define LCD_PIXEL_WIDTH 480 + #define LCD_PIXEL_WIDTH 480 + #define LCD_PIXEL_HEIGHT 320 + #define LCD_FULL_PIXEL_WIDTH LCD_PIXEL_WIDTH + #define LCD_FULL_PIXEL_HEIGHT LCD_PIXEL_HEIGHT + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_PIXEL_OFFSET_Y 48 #define XPT2046_X_CALIBRATION -12316 #define XPT2046_Y_CALIBRATION 8981 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 39db37a1a270..75aa9146f394 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -118,10 +118,6 @@ // #if ENABLED(FSMC_GRAPHICAL_TFT) #define FSMC_UPSCALE 3 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -166,7 +162,7 @@ #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - //SPI 2 + // SPI 2 #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 @@ -176,31 +172,32 @@ #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - // #define TOUCH_INT_PIN PB6 - - #define SPI_TFT_CS_PIN TOUCH_CS_PIN - #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN - #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN - #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN - #define SPI_TFT_DC_PIN PB6 - #define SPI_TFT_RST_PIN PF11 + //#define TOUCH_INT_PIN PB6 + + #if ENABLED(TFT_LVGL_UI_SPI) + #define SPI_TFT_CS_PIN TOUCH_CS_PIN + #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN + #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN + #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN + #define SPI_TFT_DC_PIN PB6 + #define SPI_TFT_RST_PIN PF11 + #endif #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_FULL_PIXEL_WIDTH 480 - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_FULL_PIXEL_HEIGHT 320 - #define LCD_PIXEL_OFFSET_Y 48 - - #define LCD_PIXEL_HEIGHT 320 - #define LCD_PIXEL_WIDTH 480 + #define LCD_PIXEL_WIDTH 480 + #define LCD_PIXEL_HEIGHT 320 + #define LCD_FULL_PIXEL_WIDTH LCD_PIXEL_WIDTH + #define LCD_FULL_PIXEL_HEIGHT LCD_PIXEL_HEIGHT + #define LCD_PIXEL_OFFSET_X 48 + #define LCD_PIXEL_OFFSET_Y 48 #define XPT2046_X_CALIBRATION -12316 #define XPT2046_Y_CALIBRATION 8981 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 3c950a38e31c..9f4e57dd704e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -294,7 +294,7 @@ #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 //#define TOUCH_SCREEN - #if NEED_TOUCH_PINS + #if EITHER(TOUCH_SCREEN, NEED_TOUCH_PINS) #define TOUCH_CS_PIN PE14 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO @@ -317,15 +317,6 @@ #ifndef FSMC_UPSCALE #define FSMC_UPSCALE 3 #endif - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 - #endif - #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 48 - #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 - #endif #ifndef LCD_PIXEL_OFFSET_Y #define LCD_PIXEL_OFFSET_Y 32 #endif From 5823ebb446cc82a9a59eac9e1df5e5ab07bc291a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Mon, 3 Aug 2020 20:39:29 -0700 Subject: [PATCH 274/483] Assisted Tramming requires a probe (#18912) --- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 37c997977192..3fae47384d7a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -769,7 +769,7 @@ #endif // -// Add the G35 command to read bed corners to help adjust screws. +// Add the G35 command to read bed corners to help adjust screws. Requires a bed probe. // //#define ASSISTED_TRAMMING #if ENABLED(ASSISTED_TRAMMING) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 03b869aa6e2c..5608fcff0330 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2072,6 +2072,13 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #endif +/** + * G35 Assisted Tramming + */ +#if ENABLED(ASSISTED_TRAMMING) && !HAS_BED_PROBE + #error "ASSISTED_TRAMMING requires a bed probe." +#endif + /** * G38 Probe Target */ From 04c10eda92ee34ae45da75cd85c42211c23cf1e8 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 4 Aug 2020 01:41:23 -0300 Subject: [PATCH 275/483] Fix MKS Nano v1.2 FSMC display (#18901) --- Marlin/src/inc/SanityCheck.h | 2 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 54 ++++++++--- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 97 +++++-------------- 3 files changed, 66 insertions(+), 87 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5608fcff0330..e1b162a96f98 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -819,7 +819,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS */ #if ENABLED(ADVANCED_PAUSE_FEATURE) #if !HAS_RESUME_CONTINUE - #error "ADVANCED_PAUSE_FEATURE currently requires an LCD controller or EMERGENCY_PARSER." + #error "ADVANCED_PAUSE_FEATURE requires a supported LCD controller (or EMERGENCY_PARSER)." #elif DISABLED(NOZZLE_PARK_FEATURE) #error "ADVANCED_PAUSE_FEATURE requires NOZZLE_PARK_FEATURE." #elif !defined(FILAMENT_UNLOAD_PURGE_FEEDRATE) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 0f6cbcbb8a68..82bef7824444 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -242,6 +242,7 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } } #define WRITE_ESC_SEQUENCE(V) writeEscSequence(V) + #define WRITE_ESC_SEQUENCE16(V) writeEscSequence(V) #else void writeEscSequence8(u8g_t *u8g, u8g_dev_t *dev, const uint16_t *sequence) { uint16_t data; @@ -289,6 +290,8 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint } u8g_SetAddress(u8g, dev, 1); } + + #define WRITE_ESC_SEQUENCE16(V) writeEscSequence16(u8g, dev, V) #endif static const uint16_t st7789v_init[] = { @@ -378,7 +381,28 @@ static const uint16_t ili9341_init[] = { ESC_END }; -static const uint16_t st9677_init[] = { +static const uint16_t ili9488_init[] = { + ESC_REG(0x00E0), 0x0000, 0x0007, 0x000F, 0x000D, 0x001B, 0x000A, 0x003C, 0x0078, 0x004A, 0x0007, 0x000E, 0x0009, 0x001B, 0x001E, 0x000F, + ESC_REG(0x00E1), 0x0000, 0x0022, 0x0024, 0x0006, 0x0012, 0x0007, 0x0036, 0x0047, 0x0047, 0x0006, 0x000A, 0x0007, 0x0030, 0x0037, 0x000F, + ESC_REG(0x00C0), 0x0010, 0x0010, + ESC_REG(0x00C1), 0x0041, + ESC_REG(0x00C5), 0x0000, 0x0022, 0x0080, + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00A8, 0x0068), + ESC_REG(0x003A), 0x0055, + ESC_REG(0x00B0), 0x0000, + ESC_REG(0x00B1), 0x00B0, 0x0011, + ESC_REG(0x00B4), 0x0002, + ESC_REG(0x00B6), 0x0002, 0x0042, + ESC_REG(0x00B7), 0x00C6, + ESC_REG(0x00E9), 0x0000, + ESC_REG(0x00F0), 0x00A9, 0x0051, 0x002C, 0x0082, + ESC_REG(0x0029), + ESC_REG(0x0011), + ESC_DELAY(100), + ESC_END +}; + +static const uint16_t st7796_init[] = { ESC_REG(0x0010), ESC_DELAY(120), ESC_REG(0x0001), ESC_DELAY(120), ESC_REG(0x0011), ESC_DELAY(120), @@ -588,8 +612,8 @@ static const uint16_t st9677_init[] = { LCD_IO_WriteSequence(buffer, length * sq(FSMC_UPSCALE)); #else - u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); - u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); + for (uint8_t i = FSMC_UPSCALE; i--;) + u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); #endif } } @@ -617,7 +641,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u uint16_t* buffer = &bufferA[0]; bool allow_async = DISABLED(SPI_GRAPHICAL_TFT); #else - uint16_t buffer[WIDTH*2]; // 16-bit RGB 565 pixel line buffer + uint16_t buffer[WIDTH * FSMC_UPSCALE]; // 16-bit RGB 565 pixel line buffer #endif switch (msg) { @@ -630,18 +654,21 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u setWindow = setWindow_st7789v; break; case 0x9328: // ILI9328 - WRITE_ESC_SEQUENCE(ili9328_init); + WRITE_ESC_SEQUENCE16(ili9328_init); setWindow = setWindow_ili9328; break; case 0x9341: // ILI9341 case 0x8066: // Anycubic / TronXY TFTs (480x320) - WRITE_ESC_SEQUENCE(ili9341_init); + WRITE_ESC_SEQUENCE(ili9488_init); setWindow = setWindow_st7789v; break; case 0x7796: - WRITE_ESC_SEQUENCE(TERN(HAS_LCD_IO, st9677_init, ili9341_init)); + WRITE_ESC_SEQUENCE(st7796_init); setWindow = setWindow_st7789v; break; + case 0x9488: + WRITE_ESC_SEQUENCE(ili9488_init); + setWindow = setWindow_st7789v; case 0x0404: // No connected display on FSMC lcd_id = 0; return 0; @@ -664,8 +691,8 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); #else memset2(buffer, TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) / 2); - for (uint16_t i = 0; i < (LCD_FULL_PIXEL_WIDTH) * 3; i++) - u8g_WriteSequence(u8g, dev, (LCD_FULL_PIXEL_WIDTH) / 2, (uint8_t *)buffer); + for (uint16_t i = 0; i < (LCD_FULL_PIXEL_HEIGHT) * sq(FSMC_UPSCALE); i++) + u8g_WriteSequence(u8g, dev, LCD_FULL_PIXEL_WIDTH / 2, (uint8_t *)buffer); #endif // Bottom buttons @@ -721,11 +748,10 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u LCD_IO_WriteSequence(buffer, COUNT(bufferA)); #else uint8_t* bufptr = (uint8_t*) buffer; - for (uint8_t i = 2; i--;) { - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[0]); - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH]); - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH*2]); - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH*3]); + for (uint8_t i = FSMC_UPSCALE; i--;) { + LOOP_S_L_N(n, 0, FSMC_UPSCALE * 2) { + u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH * n]); + } } #endif } diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 844fb6b0d6a4..a68b4810717b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -165,28 +165,7 @@ * to let the bootloader init the screen. */ -#if ENABLED(TFT_LVGL_UI_SPI) - - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 - - #define LCD_BACKLIGHT_PIN PD13 - - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 - -#elif ENABLED(TFT_LVGL_UI_FSMC) +#if ENABLED(TFT_LVGL_UI_FSMC) #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -198,15 +177,34 @@ #define LCD_BACKLIGHT_PIN PD13 -#endif +#elif ENABLED(FSMC_GRAPHICAL_TFT) + + #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h + #define DOGLCD_SCK -1 -#if ENABLED(FSMC_GRAPHICAL_TFT) - //#define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h - //#define DOGLCD_SCK -1 + #ifndef FSMC_UPSCALE + #define FSMC_UPSCALE 3 + #endif + #ifndef LCD_FULL_PIXEL_WIDTH + #define LCD_FULL_PIXEL_WIDTH 480 + #endif + #ifndef LCD_PIXEL_OFFSET_X + #define LCD_PIXEL_OFFSET_X 48 + #endif + #ifndef LCD_FULL_PIXEL_HEIGHT + #define LCD_FULL_PIXEL_HEIGHT 320 + #endif + #ifndef LCD_PIXEL_OFFSET_Y + #define LCD_PIXEL_OFFSET_Y 32 + #endif #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 @@ -216,53 +214,8 @@ #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif -#endif -#if HAS_SPI_LCD - - #define BEEPER_PIN PC5 - #define BTN_ENC PE13 - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define LCD_BACKLIGHT_PIN -1 - - // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) - #if ENABLED(MKS_MINI_12864) - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PD11 - #define DOGLCD_CS PE15 - #define DOGLCD_SCK PA5 - #define DOGLCD_MOSI PA7 - - // Required for MKS_MINI_12864 with this board - #define MKS_LCD12864B - #undef SHOW_BOOTSCREEN - - #else // !MKS_MINI_12864 - - #define LCD_PINS_D4 PE14 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PE15 - #define LCD_PINS_D6 PD11 - #define LCD_PINS_D7 PD10 - #endif - - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif - - #endif // !MKS_MINI_12864 - -#endif // HAS_SPI_LCD +#endif #define SPI_FLASH #if ENABLED(SPI_FLASH) From 4856ac50281291790405a0fd35be88d035416b7a Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Tue, 4 Aug 2020 07:31:45 +0200 Subject: [PATCH 276/483] Add Z_AFTER_DEACTIVATE to account for gravity (#18906) --- Marlin/Configuration.h | 6 ++--- Marlin/Configuration_adv.h | 24 ++++++++++++------- .../lcd/dogm/status_screen_lite_ST7920.cpp | 13 +++------- Marlin/src/module/planner.cpp | 7 ++++-- Marlin/src/module/stepper/indirection.h | 8 ++++++- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 9d1f7862bb7f..25efa79b7d78 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1076,18 +1076,18 @@ #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disables axis stepper immediately when it's not being used. +// Disable axis steppers immediately when they're not being stepped. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false -// Warn on display about possibly reduced accuracy +// Turn off the display blinking that warns about possible accuracy reduction //#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder -#define DISABLE_E false // For all extruders +#define DISABLE_E false // Disable the extruder when not stepping #define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled // @section machine diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 3fae47384d7a..de50995ffe14 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -809,24 +809,30 @@ #define INVERT_Z_STEP_PIN false #define INVERT_E_STEP_PIN false -// Default stepper release if idle. Set to 0 to deactivate. -// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. -// Time can be set by M18 and M84. +/** + * Idle Stepper Shutdown + * Set DISABLE_INACTIVE_? 'true' to shut down axis steppers after an idle period. + * The Deactive Time can be overridden with M18 and M84. Set to 0 for No Timeout. + */ #define DEFAULT_STEPPER_DEACTIVE_TIME 120 #define DISABLE_INACTIVE_X true #define DISABLE_INACTIVE_Y true -#define DISABLE_INACTIVE_Z true // Set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_Z true // Set 'false' if the nozzle could fall onto your printed part! #define DISABLE_INACTIVE_E true -#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate -#define DEFAULT_MINTRAVELFEEDRATE 0.0 +// If the Nozzle or Bed falls when the Z stepper is disabled, set its resting position here. +//#define Z_AFTER_DEACTIVATE Z_HOME_POS //#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated -// Minimum time that a segment needs to take if the buffer is emptied -#define DEFAULT_MINSEGMENTTIME 20000 // (µs) +// Minimum time that a segment needs to take as the buffer gets emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. + +// Default Minimum Feedrates for printing and travel moves +#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. +#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. -// Slow down the machine if the look ahead buffer is (by default) half full. +// Slow down the machine if the lookahead buffer is (by default) half full. // Increase the slowdown divisor for larger buffer sizes. #define SLOWDOWN #if ENABLED(SLOWDOWN) diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index 9338ab82e83d..18894db3d69a 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -819,16 +819,9 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { } if (countdown == 0 && (forceUpdate || position_changed() - #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) - || blink_changed() - #endif - )) { - draw_position(current_position, true - #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) - && all_axes_known() - #endif - ); - } + || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed()) + )) + draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, all_axes_known())); #endif } diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 65a9e4e05927..c2a9e6ac7716 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1281,7 +1281,7 @@ void Planner::recalculate() { void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) - xyze_bool_t axis_active = { false }; + xyze_bool_t axis_active = { true, true, true, true }; #endif #if HAS_FAN @@ -1316,7 +1316,10 @@ void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { block_t *block = &block_buffer[b]; - LOOP_XYZE(i) if (block->steps[i]) axis_active[i] = true; + if (ENABLED(DISABLE_X) && block->steps[X_AXIS]) axis_active[X_AXIS] = true; + if (ENABLED(DISABLE_Y) && block->steps[Y_AXIS]) axis_active[Y_AXIS] = true; + if (ENABLED(DISABLE_Z) && block->steps[Z_AXIS]) axis_active[Z_AXIS] = true; + if (ENABLED(DISABLE_E) && block->steps[E_AXIS]) axis_active[E_AXIS] = true; } #endif } diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index e3d3730c79ea..1fd1a72e7e9f 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -848,7 +848,13 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define DISABLE_AXIS_Y() do{ DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); CBI(axis_known_position, Y_AXIS); }while(0) #define ENABLE_AXIS_Z() do{ ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); }while(0) -#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); CBI(axis_known_position, Z_AXIS); }while(0) + +#ifdef Z_AFTER_DEACTIVATE + #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; planner.sync_plan_position(); }while(0) +#else + #define Z_RESET() +#endif +#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); CBI(axis_known_position, Z_AXIS); Z_RESET(); }while(0) // // Extruder steppers enable / disable macros From b615431aa6c01eb8fec4b7e5e1e63321449c14a6 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 4 Aug 2020 07:32:25 +0200 Subject: [PATCH 277/483] Update Italian language (#18886) --- Marlin/src/lcd/language/language_it.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 6de5d9e0323e..1a5bdb22e98e 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -64,6 +64,7 @@ namespace Language_it { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home asse Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home asse Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Tramming assistito"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home assi XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premi per iniziare"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Punto successivo"); From 11b2bd835d743fe583065309340c9d99d1882a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Morav=C4=8D=C3=ADk?= Date: Tue, 4 Aug 2020 07:32:47 +0200 Subject: [PATCH 278/483] Update Slovak language (#18884) --- Marlin/src/lcd/language/language_sk.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 321fa5e05f4f..736e2069d999 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -66,6 +66,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domov os Y"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domov os Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto-zarovn. Z"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Asist. vyrovnanie"); PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Parkovanie XYZ"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím zaÄnete"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("ÄŽalší bod"); @@ -153,14 +154,12 @@ namespace Language_sk { PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec úprav siete"); PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastná sieÅ¥"); PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("VytvoriÅ¥ sieÅ¥"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("SieÅ¥ bodov $"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola siete $"); - #endif + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("SieÅ¥ bodov ($)"); PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená sieÅ¥ bodov"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("UpraviÅ¥ výšku siete"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("SkontrolovaÅ¥ sieÅ¥"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola siete ($)"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast.siete"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 ohrev podlž."); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 ohrev trysky"); @@ -309,7 +308,9 @@ namespace Language_sk { PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Teplota"); PROGMEM Language_Str MSG_MOTION = _UxGT("Pohyb"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E na mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E v mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit v mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Priem. fil."); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Priem. fil. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Vysunúť mm"); @@ -331,6 +332,10 @@ namespace Language_sk { PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info. obrazovka"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Príprava tlaÄe"); PROGMEM Language_Str MSG_TUNE = _UxGT("Doladenie tlaÄe"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Monitor napájania"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Prúd"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Napätie"); + PROGMEM Language_Str MSG_POWER = _UxGT("Výkon"); PROGMEM Language_Str MSG_START_PRINT = _UxGT("SpustiÅ¥ tlaÄ"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("ÄŽalší"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inicial."); From 3a00ebd758e0325c30f6bf9b5b55ef67f48c2162 Mon Sep 17 00:00:00 2001 From: Jeff Eberl Date: Mon, 3 Aug 2020 23:37:08 -0600 Subject: [PATCH 279/483] Change include to (#18880) --- Marlin/src/lcd/tft/tft_image.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index 9e4dc1629753..ff60bee9a9df 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -21,7 +21,7 @@ */ #include "tft_image.h" -#include "cstddef" +#include const tImage NoLogo = { (void *)NULL, 0, 0, NOCOLORS }; From 181a35181b8c14c6304013ed31f28a1b86e4dab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus=20N=C3=A4veke?= Date: Tue, 4 Aug 2020 10:02:08 +0200 Subject: [PATCH 280/483] Make ili9341 rotatable (e.g., Anycubic Predator) (#18877) --- Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 82bef7824444..205cafbccb39 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -366,7 +366,7 @@ static const uint16_t ili9328_init[] = { static const uint16_t ili9341_init[] = { ESC_REG(0x0010), ESC_DELAY(10), ESC_REG(0x0001), ESC_DELAY(200), - ESC_REG(0x0036), 0x00E8, + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028), ESC_REG(0x003A), 0x0055, ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F, ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF, From 3b1f84a9b74888f0cbdde33296f26da64e2288b7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 4 Aug 2020 03:21:19 -0500 Subject: [PATCH 281/483] Followup to #18906 Z_AFTER_DEACTIVATE --- Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index 18894db3d69a..fba485d7060e 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -820,8 +820,7 @@ void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { if (countdown == 0 && (forceUpdate || position_changed() || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed()) - )) - draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, all_axes_known())); + )) draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 1, all_axes_known())); #endif } From 04b12dde492b44a2b1e18f2e38b126bc82edcfdf Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 4 Aug 2020 06:50:05 -0300 Subject: [PATCH 282/483] SPI Flash data compression (#18879) --- .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 317 ++++++++++++++++++ .../lcd/extui/lib/mks_ui/SPIFlashStorage.h | 108 ++++++ .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 96 ++++-- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 4 +- 5 files changed, 489 insertions(+), 40 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp create mode 100644 Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp new file mode 100644 index 000000000000..da87ce976d1e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -0,0 +1,317 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "SPIFlashStorage.h" + +uint8_t SPIFlashStorage::::m_pageData[SPI_FLASH_PageSize]; +uint32_t SPIFlashStorage::::m_currentPage; +uint16_t SPIFlashStorage::::m_pageDataUsed; +uint32_t SPIFlashStorage::::m_startAddress; + +#if HAS_SPI_FLASH_COMPRESSION + + uint8_t SPIFlashStorage::m_compressedData[SPI_FLASH_PageSize]; + uint16_t SPIFlashStorage::m_compressedDataUsed; + + template + static uint32_t rle_compress(T *output, uint32_t outputLength, T *input, uint32_t inputLength, uint32_t& inputProcessed) { + uint32_t count = 0, out = 0, index, i; + T pixel; + //32767 for uint16_t + //127 for uint16_t + //calculated at compile time + constexpr T max = (0xFFFFFFFF >> (8 * (4 - sizeof(T)))) / 2; + + inputProcessed = 0; + while (count < inputLength && out < outputLength) { + index = count; + pixel = input[index++]; + while (index < inputLength && index - count < max && input[index] == pixel) + index++; + if (index - count == 1) { + /* + * Failed to "replicate" the current pixel. See how many to copy. + * Avoid a replicate run of only 2-pixels after a literal run. There + * is no gain in this, and there is a risK of loss if the run after + * the two identical pixels is another literal run. So search for + * 3 identical pixels. + */ + while (index < inputLength && index - count < max && (input[index] != input[index - 1] || (index > 1 && input[index] != input[index - 2]))) + index++; + /* + * Check why this run stopped. If it found two identical pixels, reset + * the index so we can add a run. Do this twice: the previous run + * tried to detect a replicate run of at least 3 pixels. So we may be + * able to back up two pixels if such a replicate run was found. + */ + while (index < inputLength && input[index] == input[index - 1]) + index--; + // If the output buffer could overflow, stop at the remaining bytes + NOMORE(index, count + outputLength - out - 1); + output[out++] = (uint16_t)(count - index); + for (i = count; i < index; i++) + output[out++] = input[i]; + } + else { + // Need at least more 2 spaces + if (out > outputLength - 2) break; + output[out++] = (uint16_t)(index - count); + output[out++] = pixel; + } + count = index; + } + inputProcessed = count; + + // Padding + if (out == outputLength - 1) output[out++] = 0; + + return out; + } + + template + static uint32_t rle_uncompress(UT *output, uint32_t outputLength, UT *input, uint32_t inputLength, uint32_t &outputFilled) { + T count; + UT i; + uint32_t processedBytes = 0; + outputFilled = 0; + + while (outputLength > 0 && inputLength > 0) { + processedBytes++; + count = static_cast(*input++); + inputLength--; + if (count > 0) { // Replicate run + for (i = 0; i < count && outputLength > i; i++) + output[i] = *input; + outputFilled += i; + // If copy incomplete, change the input buffer to start with remaining data in the next call + if (i < count) { + // Change to process the difference in the next call + *(input - 1) = static_cast(count - i); + return processedBytes - 1; + } + input++; + inputLength--; + processedBytes++; + } + else if (count < 0) { // literal run + count = static_cast(-count); + // Copy, validating if the output have enough space + for (i = 0; i < count && outputLength > i; i++) + output[i] = input[i]; + outputFilled += i; + // If copy incomplete, change the input buffer to start with remaining data in the next call + if (i < count) { + input[i - 1] = static_cast((count - i) * -1); + // Back one + return processedBytes + i - 1; + } + input += count; + inputLength -= count; + processedBytes += count; + } + output += count; + outputLength -= count; + } + + return processedBytes; + } + +#endif // HAS_SPI_FLASH_COMPRESSION + +void SPIFlashStorage::beginWrite(uint32_t startAddress) { + m_pageDataUsed = 0; + m_currentPage = 0; + m_startAddress = startAddress; + #if HAS_SPI_FLASH_COMPRESSION + // Restart the compressed buffer, keep the pointers of the uncompressed buffer + m_compressedDataUsed = 0; + #endif +} + + +void SPIFlashStorage::endWrite() { + // Flush remaining data + #if HAS_SPI_FLASH_COMPRESSION + if (m_compressedDataUsed > 0) { + flushPage(); + savePage(m_compressedData); + } + #else + if (m_pageDataUsed > 0) flushPage(); + #endif +} + +void SPIFlashStorage::savePage(uint8_t* buffer) { + W25QXX.SPI_FLASH_BufferWrite(buffer, m_startAddress + (SPI_FLASH_PageSize * m_currentPage), SPI_FLASH_PageSize); + + // Test env + // char fname[256]; + // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); + // FILE *fp = fopen(fname, "wb"); + // fwrite(buffer, 1, m_compressedDataUsed, fp); + // fclose(fp); +} + +void SPIFlashStorage::loadPage(uint8_t* buffer) { + W25QXX.SPI_FLASH_BufferRead(buffer, m_startAddress + (SPI_FLASH_PageSize * m_currentPage), SPI_FLASH_PageSize); + + // Test env + // char fname[256]; + // memset(buffer, 0, SPI_FLASH_PageSize); + // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); + // FILE *fp = fopen(fname, "rb"); + // if (fp != NULL) { + // fread(buffer, 1, SPI_FLASH_PageSize, fp); + // fclose(fp); + // } +} + +void SPIFlashStorage::flushPage() { + #if HAS_SPI_FLASH_COMPRESSION + // Work com with compressed in memory + uint32_t inputProcessed; + uint32_t compressedSize = rle_compress((uint16_t *)(m_compressedData + m_compressedDataUsed), compressedDataFree() / 2, (uint16_t *)m_pageData, m_pageDataUsed / 2, inputProcessed) * 2; + inputProcessed *= 2; + m_compressedDataUsed += compressedSize; + + // Space remaining in the compressed buffer? + if (compressedDataFree() > 0) { + // Free the uncompressed buffer + m_pageDataUsed = 0; + return; + } + + // Part of the m_pageData was compressed, so ajust the pointers, freeing what was processed, shift the buffer + // TODO: To avoid this copy, use a circular buffer + memmove(m_pageData, m_pageData + inputProcessed, m_pageDataUsed - inputProcessed); + m_pageDataUsed -= inputProcessed; + + // No? So flush page with compressed data!! + uint8_t *buffer = m_compressedData; + #else + uint8_t *buffer = m_pageData; + #endif + + savePage(buffer); + + #if HAS_SPI_FLASH_COMPRESSION + // Restart the compressed buffer, keep the pointers of the uncompressed buffer + m_compressedDataUsed = 0; + #elif + m_pageDataUsed = 0; + #endif + m_currentPage++; +} + +void SPIFlashStorage::readPage() { + #if HAS_SPI_FLASH_COMPRESSION + if (compressedDataFree() == 0) { + loadPage(m_compressedData); + m_currentPage++; + m_compressedDataUsed = 0; + } + + // Need to uncompress data + if (pageDataFree() == 0) { + m_pageDataUsed = 0; + uint32_t outpuProcessed = 0; + uint32_t inputProcessed = rle_uncompress((uint16_t *)(m_pageData + m_pageDataUsed), pageDataFree() / 2, (uint16_t *)(m_compressedData + m_compressedDataUsed), compressedDataFree() / 2, outpuProcessed); + inputProcessed *= 2; + outpuProcessed *= 2; + if (outpuProcessed < pageDataFree()) { + m_pageDataUsed = SPI_FLASH_PageSize - outpuProcessed; + // TODO: To avoid this copy, use a circular buffer + memmove(m_pageData + m_pageDataUsed, m_pageData, outpuProcessed); + } + + m_compressedDataUsed += inputProcessed; + } + #else + loadPage(m_pageData); + m_pageDataUsed = 0; + m_currentPage++; + #endif +} + +uint16_t SPIFlashStorage::inData(uint8_t* data, uint16_t size) { + // Don't write more than we can + NOMORE(size, pageDataFree()); + memcpy(m_pageData + m_pageDataUsed, data, size); + m_pageDataUsed += size; + return size; +} + +void SPIFlashStorage::writeData(uint8_t* data, uint16_t size) { + // Flush a page if needed + if (pageDataFree() == 0) flushPage(); + + while (size > 0) { + uint16_t written = inData(data, size); + size -= written; + // Need to write more? Flush page and continue! + if (size > 0) { + flushPage(); + data += written; + } + } +} + +void SPIFlashStorage::beginRead(uint32_t startAddress) { + m_startAddress = startAddress; + m_currentPage = 0; + // Nothing in memory now + m_pageDataUsed = SPI_FLASH_PageSize; + #if HAS_SPI_FLASH_COMPRESSION + m_compressedDataUsed = sizeof(m_compressedData); + #endif +} + +uint16_t SPIFlashStorage::outData(uint8_t* data, uint16_t size) { + // Don't read more than we have + NOMORE(size > pageDataFree()); + memcpy(data, m_pageData + m_pageDataUsed, size); + m_pageDataUsed += size; + return size; +} + +void SPIFlashStorage::readData(uint8_t* data, uint16_t size) { + // Read a page if needed + if (pageDataFree() == 0) readPage(); + + while (size > 0) { + uint16_t read = outData(data, size); + size -= read; + // Need to write more? Flush page and continue! + if (size > 0) { + readPage(); + data += read; + } + } +} + +SPIFlashStorage SPIFlash; + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h new file mode 100644 index 000000000000..c806068dda3c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h @@ -0,0 +1,108 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "W25Qxx.h" + +#define HAS_SPI_FLASH_COMPRESSION 1 + +/** + * This class manages and optimizes SPI Flash data storage, + * keeping an internal buffer to write and save full SPI flash + * pages as needed. + * + * Since the data is always in the buffer, the class is also + * able to support fast on-the-fly RLE compression/decompression. + * + * In testing with the current LVGL_UI it compacts 2.9MB of icons + * (which have lots of runs) down to 370kB!!! As a result the UI + * refresh rate becomes faster and now all LVGL UI can fit into a + * tiny 2MB SPI Flash, such as the Chitu Board. + * + * == Usage == + * + * Writing: + * + * The class keeps an internal buffer that caches data until it + * fits into a full SPI Flash page. Each time the buffer fills up + * the page is saved to SPI Flash. Sequential writes are optimal. + * + * SPIFlashStorage.beginWrite(myStartAddress); + * while (there is data to write) + * SPIFlashStorage.addData(myBuffer, bufferSize); + * SPIFlashStorage.endWrite(); // Flush remaining buffer data + * + * Reading: + * + * When reading, it loads a full page from SPI Flash at once and + * keeps it in a private SRAM buffer. Data is loaded as needed to + * fullfill requests. Sequential reads are optimal. + * + * SPIFlashStorage.beginRead(myStartAddress); + * while (there is data to read) + * SPIFlashStorage.readData(myBuffer, bufferSize); + * + * Compression: + * + * The biggest advantage of this class is the RLE compression. + * With compression activated a second buffer holds the compressed + * data, so when writing data, as this buffer becomes full it is + * flushed to SPI Flash. + * + * The same goes for reading: A compressed page is read from SPI + * flash, and the data is uncompressed as needed to provide the + * requested amount of data. + */ +class SPIFlashStorage { +public: + // Write operation + static void beginWrite(uint32_t startAddress); + static void endWrite(); + static void writeData(uint8_t* data, uint16_t size); + + static // Read operation + static void beginRead(uint32_t startAddress); + static void readData(uint8_t* data, uint16_t size); + + static uint32_t getCurrentPage() { return m_currentPage; } + +private: + static void flushPage(); + static void savePage(uint8_t* buffer); + static void loadPage(uint8_t* buffer); + static void readPage(); + static uint16_t inData(uint8_t* data, uint16_t size); + static uint16_t outData(uint8_t* data, uint16_t size); + + static uint8_t m_pageData[SPI_FLASH_PageSize]; + static uint32_t m_currentPage; + static uint16_t m_pageDataUsed; + static inline uint16_t pageDataFree() { return SPI_FLASH_PageSize - m_pageDataUsed; } + static uint32_t m_startAddress; + #if HAS_SPI_FLASH_COMPRESSION + static uint8_t m_compressedData[SPI_FLASH_PageSize]; + static uint16_t m_compressedDataUsed; + static inline uint16_t compressedDataFree() { return SPI_FLASH_PageSize - m_compressedDataUsed; } + #endif +}; + +extern SPIFlashStorage SPIFlash; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 2a16bcf1b3b9..771e3e062e51 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -23,16 +23,17 @@ #if HAS_TFT_LVGL_UI -#include "../../../../MarlinCore.h" - #include "string.h" - #include "pic_manager.h" -#include "W25Qxx.h" -#include "../../../../sd/cardreader.h" #include "draw_ready_print.h" #include "mks_hardware_test.h" +#include "SPIFlashStorage.h" +#include "W25Qxx.h" + +#include "../../../../MarlinCore.h" +#include "../../../../sd/cardreader.h" + extern uint16_t DeviceCode; extern unsigned char bmp_public_buf[17 * 1024]; @@ -205,11 +206,11 @@ static char assets[][LONG_FILENAME_LENGTH] = { }; #if HAS_SPI_FLASH_FONT - static char fonts[][LONG_FILENAME_LENGTH] = { - "FontUNIGBK.bin", - }; + static char fonts[][LONG_FILENAME_LENGTH] = { "FontUNIGBK.bin" }; #endif +static uint8_t currentFlashPage = 0; + uint32_t lv_get_pic_addr(uint8_t *Pname) { uint8_t Pic_cnt; uint8_t i, j; @@ -217,6 +218,8 @@ uint32_t lv_get_pic_addr(uint8_t *Pname) { uint32_t tmp_cnt = 0; uint32_t addr = 0; + currentFlashPage = 0; + #if ENABLED(MARLIN_DEV_MODE) SERIAL_ECHOLNPAIR("Getting picture SPI Flash Address: ", (const char*)Pname); #endif @@ -371,6 +374,10 @@ uint8_t public_buf[512]; return -1; } + #if ENABLED(MARLIN_DEV_MODE) + static uint32_t totalSizes = 0, totalCompressed = 0; + #endif + #define ASSET_TYPE_ICON 0 #define ASSET_TYPE_LOGO 1 #define ASSET_TYPE_TITLE_LOGO 2 @@ -398,43 +405,52 @@ uint8_t public_buf[512]; pfileSize = file.fileSize(); totalSizeLoaded += pfileSize; if (assetType == ASSET_TYPE_LOGO) { - while (1) { + do { pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } + Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); + } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_TITLE_LOGO) { - while (1) { + do { pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } + Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); + } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_G_PREVIEW) { - while (1) { + do { pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - default_view_Write(public_buf, pbr); // - if (pbr < BMP_WRITE_BUF_LEN) break; - } + default_view_Write(public_buf, pbr); + } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_ICON) { Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize); - while (1) { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); - Pic_Write_Addr += pbr; - if (pbr < BMP_WRITE_BUF_LEN) break; - } + SPIFlash.beginWrite(Pic_Write_Addr); + #if HAS_SPI_FLASH_COMPRESSION + do { + pbr = file.read(public_buf, SPI_FLASH_PageSize); + TERN_(MARLIN_DEV_MODE, totalSizes += pbr); + SPIFlash.writeData(public_buf, SPI_FLASH_PageSize); + } while (pbr >= SPI_FLASH_PageSize); + #else + do { + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); + Pic_Write_Addr += pbr; + } while (pbr >= BMP_WRITE_BUF_LEN); + #endif + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("Space used: ", fn, " - ", (SPIFlash.getCurrentPage() + 1) * SPI_FLASH_PageSize / 1024, "KB"); + totalCompressed += (SPIFlash.getCurrentPage() + 1) * SPI_FLASH_PageSize; + #endif + SPIFlash.endWrite(); } else if (assetType == ASSET_TYPE_FONT) { Pic_Write_Addr = UNIGBK_FLASH_ADDR; - while (1) { + do { pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); Pic_Write_Addr += pbr; - if (pbr < BMP_WRITE_BUF_LEN) break; - } + } while (pbr >= BMP_WRITE_BUF_LEN); } file.close(); @@ -459,13 +475,13 @@ uint8_t public_buf[512]; disp_assets_update_progress("Reading files..."); dir_t d; while (dir.readDir(&d, card.longFilename) > 0) { - // if we dont get a long name, but gets a short one, try it + // If we dont get a long name, but gets a short one, try it if (card.longFilename[0] == 0 && d.name[0] != 0) dosName2LongName((const char*)d.name, card.longFilename); if (card.longFilename[0] == 0) continue; if (card.longFilename[0] == '.') continue; - uint8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); + int8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); if (a >= 0 && a < COUNT(assets)) { uint8_t assetType = ASSET_TYPE_ICON; if (strstr(assets[a], "_logo")) @@ -482,9 +498,8 @@ uint8_t public_buf[512]; #if HAS_SPI_FLASH_FONT a = arrayFindStr(fonts, COUNT(fonts), card.longFilename); - if (a >= 0 && a < COUNT(fonts)) { + if (a >= 0 && a < COUNT(fonts)) loadAsset(dir, d, fonts[a], ASSET_TYPE_FONT); - } #endif } dir.rename(&root, bakPath); @@ -496,11 +511,13 @@ uint8_t public_buf[512]; W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter); #endif + + SERIAL_ECHOLNPAIR("Total Uncompressed: ", totalSizes, ", Compressed: ", totalCompressed); } #if HAS_SPI_FLASH_FONT void spi_flash_read_test() { W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN); } - #endif // HAS_SPI_FLASH_FONT + #endif #endif // SDSUPPORT @@ -531,8 +548,15 @@ void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { } void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) { - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size); + #if HAS_SPI_FLASH_COMPRESSION + if (currentFlashPage == 0) + SPIFlash.beginRead(addr); + SPIFlash.readData(P_Rbuff, size); + currentFlashPage++; + #else + W25QXX.init(SPI_QUARTER_SPEED); + W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size); + #endif } #if HAS_SPI_FLASH_FONT diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 3ef4ee4f8624..d97b54a658f9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -63,7 +63,7 @@ extern "C" { /* C-declarations for C++ */ #define DEFAULT_VIEW_MAX_SIZE (200*200*2) #define FLASH_VIEW_MAX_SIZE (200*200*2) -#define PER_PIC_MAX_SPACE_TFT35 (32*1024) +#define PER_PIC_MAX_SPACE_TFT35 (9*1024) #define PER_PIC_MAX_SPACE_TFT32 (16*1024) #define PER_FONT_MAX_SPACE (16*1024) @@ -88,7 +88,7 @@ extern "C" { /* C-declarations for C++ */ #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 // font - #define FONTINFOADDR 0x183000 // 6M -- font addr + #define FONTINFOADDR 0x150000 // 6M -- font addr #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 #else diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 31aa873b5259..b6863d252b66 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -150,10 +150,10 @@ #define SPI_FLASH_SIZE 0x200000 // 2MB #if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 0 + #define HAS_SPI_FLASH_FONT 1 #define HAS_GCODE_PREVIEW 1 #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 0 + #define HAS_LANG_SELECT_SCREEN 1 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 From 99fb65f359030879fcec2855a77fc2298c7aaec2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 5 Aug 2020 00:10:17 +0000 Subject: [PATCH 283/483] [cron] Bump distribution date (2020-08-05) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ce9146bb69a6..e7fa18a11e71 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-04" + #define STRING_DISTRIBUTION_DATE "2020-08-05" #endif /** From 3341fc6728581408222805d07e3d3835e1df8dfc Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 6 Aug 2020 00:10:09 +0000 Subject: [PATCH 284/483] [cron] Bump distribution date (2020-08-06) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index e7fa18a11e71..5b63f312966b 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-05" + #define STRING_DISTRIBUTION_DATE "2020-08-06" #endif /** From 6da477e6bf675c10e1eb5c3279a06dffeb0c3947 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Thu, 6 Aug 2020 05:38:23 +0200 Subject: [PATCH 285/483] Move Cancel Object menu, fix canceled item index (#18930) --- Marlin/src/lcd/menu/menu_advanced.cpp | 5 ----- Marlin/src/lcd/menu/menu_cancelobject.cpp | 2 +- Marlin/src/lcd/menu/menu_main.cpp | 6 ++++++ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 81baa6156aa7..1c37b2f2d331 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -53,7 +53,6 @@ void menu_tmc(); void menu_backlash(); -void menu_cancelobject(); #if ENABLED(DAC_STEPPER_CURRENT) @@ -560,10 +559,6 @@ void menu_advanced_settings() { SUBMENU(MSG_BACKLASH, menu_backlash); #endif - #if ENABLED(CANCEL_OBJECTS) - SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); - #endif - #if ENABLED(DAC_STEPPER_CURRENT) SUBMENU(MSG_DRIVE_STRENGTH, menu_dac); #endif diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp index 095e4eb7b1ad..55b88c45b033 100644 --- a/Marlin/src/lcd/menu/menu_cancelobject.cpp +++ b/Marlin/src/lcd/menu/menu_cancelobject.cpp @@ -43,7 +43,7 @@ static void lcd_cancel_object_confirm() { }; MenuItem_confirm::confirm_screen( []{ - cancelable.cancel_object(MenuItemBase::itemIndex - 1); + cancelable.cancel_object(MenuItemBase::itemIndex); ui.completion_feedback(); ui.goto_previous_screen(); }, diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 51b67209dc5b..059290c5237e 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -51,6 +51,7 @@ #endif void menu_tune(); +void menu_cancelobject(); void menu_motion(); void menu_temperature(); void menu_configuration(); @@ -110,7 +111,12 @@ void menu_main() { ); }); #endif + SUBMENU(MSG_TUNE, menu_tune); + + #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) + SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); + #endif } else { From d922c002ca3d5de89f4ae2f309d1713100bec977 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 00:40:08 -0300 Subject: [PATCH 286/483] Followup to LVGL patch (#18920) --- Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 11 ++++++----- Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index da87ce976d1e..9d3adc1bab93 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -24,12 +24,13 @@ #if HAS_TFT_LVGL_UI +#include "../../../../inc/MarlinConfig.h" #include "SPIFlashStorage.h" -uint8_t SPIFlashStorage::::m_pageData[SPI_FLASH_PageSize]; -uint32_t SPIFlashStorage::::m_currentPage; -uint16_t SPIFlashStorage::::m_pageDataUsed; -uint32_t SPIFlashStorage::::m_startAddress; +uint8_t SPIFlashStorage::m_pageData[SPI_FLASH_PageSize]; +uint32_t SPIFlashStorage::m_currentPage; +uint16_t SPIFlashStorage::m_pageDataUsed; +uint32_t SPIFlashStorage::m_startAddress; #if HAS_SPI_FLASH_COMPRESSION @@ -291,7 +292,7 @@ void SPIFlashStorage::beginRead(uint32_t startAddress) { uint16_t SPIFlashStorage::outData(uint8_t* data, uint16_t size) { // Don't read more than we have - NOMORE(size > pageDataFree()); + NOMORE(size, pageDataFree()); memcpy(data, m_pageData + m_pageDataUsed, size); m_pageDataUsed += size; return size; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h index c806068dda3c..5a124137095a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h @@ -79,7 +79,7 @@ class SPIFlashStorage { static void endWrite(); static void writeData(uint8_t* data, uint16_t size); - static // Read operation + // Read operation static void beginRead(uint32_t startAddress); static void readData(uint8_t* data, uint16_t size); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 771e3e062e51..3f87c5183f37 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -482,7 +482,7 @@ uint8_t public_buf[512]; if (card.longFilename[0] == '.') continue; int8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); - if (a >= 0 && a < COUNT(assets)) { + if (a >= 0 && a < (int8_t)COUNT(assets)) { uint8_t assetType = ASSET_TYPE_ICON; if (strstr(assets[a], "_logo")) assetType = ASSET_TYPE_LOGO; @@ -498,7 +498,7 @@ uint8_t public_buf[512]; #if HAS_SPI_FLASH_FONT a = arrayFindStr(fonts, COUNT(fonts), card.longFilename); - if (a >= 0 && a < COUNT(fonts)) + if (a >= 0 && a < (int8_t)COUNT(fonts)) loadAsset(dir, d, fonts[a], ASSET_TYPE_FONT); #endif } From c61e980c9c3e8f04c265f1adaaa5be447a213c22 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 5 Aug 2020 20:42:03 -0700 Subject: [PATCH 287/483] Add Chitu 3D V6 2nd Filament Runout pin (#18922) --- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 75aa9146f394..7a3777da46e2 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -111,7 +111,13 @@ #define BEEPER_PIN PB0 //#define LED_PIN PD3 //#define POWER_LOSS_PIN PG2 // PG4 PW_DET -#define FIL_RUNOUT_PIN PA15 // MT_DET + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA15 // MT_DET +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN PF13 +#endif // // TronXY TFT Support From 41718cf55fadd1ded5bfe270c5a8ec73b8dbc76a Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 00:44:30 -0300 Subject: [PATCH 288/483] Request files needed to test a PR (#18925) --- .github/pull_request_template.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9298b2b96d36..d82fb0f9e37b 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,6 +14,10 @@ We must be able to understand your proposed change from this description. If we +### Configurations + + + ### Related Issues From a9912681b40ebaea6b452a41fb0d25ec9c93c8fc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 6 Aug 2020 00:49:15 -0500 Subject: [PATCH 289/483] General cleanup --- Marlin/src/core/multi_language.cpp | 0 Marlin/src/feature/spindle_laser.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_tmc.cpp | 2 +- Marlin/src/lcd/menu/menu_touch_screen.cpp | 4 +++- Marlin/src/lcd/ultralcd.cpp | 2 +- 8 files changed, 9 insertions(+), 7 deletions(-) delete mode 100644 Marlin/src/core/multi_language.cpp diff --git a/Marlin/src/core/multi_language.cpp b/Marlin/src/core/multi_language.cpp deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 68261f2fc581..9d2ee7d9e57c 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -68,7 +68,7 @@ void SpindleLaser::init() { analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); - #endif + #endif } void SpindleLaser::ocr_off() { WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Turn spindle off diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 8d103d52b165..7c1083f7f70f 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -874,7 +874,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(TOUCH_SCREEN_CALIBRATION) case 995: M995(); break; // M995: Touch screen calibration for TFT display #endif - + #if ENABLED(PLATFORM_M997_SUPPORT) case 997: M997(); break; // M997: Perform in-application firmware update #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index b7f92fcb2560..5534acaf2ca7 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2436,7 +2436,7 @@ */ #if PIN_EXISTS(BEEPER) || EITHER(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) #define HAS_BUZZER 1 - #if DISABLED(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) + #if NONE(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) #define USE_BEEPER 1 #endif #endif diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 5887bf9d4aac..60118a3017d7 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -350,7 +350,7 @@ void menu_motion() { #if ENABLED(ASSISTED_TRAMMING) GCODES_ITEM(MSG_ASSISTED_TRAMMING, PSTR("G35")); #endif - + // // Level Bed // diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index e74619d295ed..f2f26886fc87 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_TRINAMIC_CONFIG && HAS_LCD_MENU +#if HAS_LCD_MENU && HAS_TRINAMIC_CONFIG #include "menu.h" #include "../../module/stepper/indirection.h" diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp index 1f315f181a9a..71fb7b75568e 100644 --- a/Marlin/src/lcd/menu/menu_touch_screen.cpp +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -22,13 +22,15 @@ #include "../../inc/MarlinConfigPre.h" -#if ENABLED(TOUCH_SCREEN_CALIBRATION) +#if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) #include "menu.h" #include "../ultralcd.h" void touch_screen_calibration() { + ui.touch_calibration(); + } #endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index b7dd4944ef70..6482cf33d068 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -74,7 +74,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #endif #endif -#if ENABLED(PCA9632_BUZZER) || USE_BEEPER +#if EITHER(PCA9632_BUZZER, USE_BEEPER) #include "../libs/buzzer.h" // for BUZZ() macro #if ENABLED(PCA9632_BUZZER) #include "../feature/leds/pca9632.h" From d69c2a90b7721c2b779d31572faff5fd848d8ea0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 5 Aug 2020 23:21:41 -0500 Subject: [PATCH 290/483] Simple rename of hex_print --- .../src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/feature/tmc_util.cpp | 2 +- Marlin/src/gcode/calibrate/M100.cpp | 2 +- Marlin/src/gcode/eeprom/M500-M504.cpp | 2 +- Marlin/src/gcode/parser.h | 2 +- Marlin/src/inc/Conditionals_adv.h | 5 ++ Marlin/src/libs/hex_print.cpp | 90 +++++++++++++++++++ .../{hex_print_routines.h => hex_print.h} | 0 Marlin/src/libs/hex_print_routines.cpp | 90 ------------------- 10 files changed, 101 insertions(+), 96 deletions(-) create mode 100644 Marlin/src/libs/hex_print.cpp rename Marlin/src/libs/{hex_print_routines.h => hex_print.h} (100%) delete mode 100644 Marlin/src/libs/hex_print_routines.cpp diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp index b03045902935..4d116f440b8e 100644 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp @@ -40,7 +40,7 @@ #include "../../../module/stepper/indirection.h" #include "../../../module/printcounter.h" #include "../../../libs/duration_t.h" -#include "../../../libs/hex_print_routines.h" +#include "../../../libs/hex_print.h" //some default values used in initialization #define DEFAULT_MICROSTEPPING_VALUE 32 diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index f8219ac7e7d7..760d2cdd1ea4 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -28,7 +28,7 @@ #include "../../../MarlinCore.h" #include "../../../HAL/shared/eeprom_api.h" - #include "../../../libs/hex_print_routines.h" + #include "../../../libs/hex_print.h" #include "../../../module/configuration_store.h" #include "../../../lcd/ultralcd.h" #include "../../../module/stepper.h" diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 495d6a9f5bb5..781253079ed5 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -34,7 +34,7 @@ #if ENABLED(TMC_DEBUG) #include "../module/planner.h" - #include "../libs/hex_print_routines.h" + #include "../libs/hex_print.h" #if ENABLED(MONITOR_DRIVER_STATUS) static uint16_t report_tmc_status_interval; // = 0 #endif diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index ea054125b7ca..f03b13e233db 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -26,7 +26,7 @@ #include "../gcode.h" #include "../queue.h" -#include "../../libs/hex_print_routines.h" +#include "../../libs/hex_print.h" #include "../../MarlinCore.h" // for idle() diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp index 5aee68ba997a..30fa2b6e250c 100644 --- a/Marlin/src/gcode/eeprom/M500-M504.cpp +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -60,7 +60,7 @@ void GcodeSuite::M502() { #if ENABLED(EEPROM_SETTINGS) #if ENABLED(MARLIN_DEV_MODE) - #include "../../libs/hex_print_routines.h" + #include "../../libs/hex_print.h" #endif /** diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 5474e5e5f394..eb614c33b4c9 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -31,7 +31,7 @@ //#define DEBUG_GCODE_PARSER #if ENABLED(DEBUG_GCODE_PARSER) - #include "../libs/hex_print_routines.h" + #include "../libs/hex_print.h" #endif #if ENABLED(TEMPERATURE_UNITS_SUPPORT) diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 7b35dc77557c..a057034ab670 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -378,3 +378,8 @@ #if ENABLED(EEPROM_SETTINGS) && NONE(I2C_EEPROM, SPI_EEPROM, QSPI_EEPROM, FLASH_EEPROM_EMULATION, SRAM_EEPROM_EMULATION, SDCARD_EEPROM_EMULATION) #define NO_EEPROM_SELECTED 1 #endif + +// Flag whether hex_print.cpp is used +#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE) + #define NEED_HEX_PRINT 1 +#endif diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp new file mode 100644 index 000000000000..6bcc00e420a9 --- /dev/null +++ b/Marlin/src/libs/hex_print.cpp @@ -0,0 +1,90 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../inc/MarlinConfig.h" +#include "../gcode/parser.h" + +#if NEED_HEX_PRINT + +#include "hex_print.h" + +#ifdef CPU_32_BIT + constexpr int byte_start = 4; + static char _hex[] = "0x00000000"; +#else + constexpr int byte_start = 0; + static char _hex[] = "0x0000"; +#endif + +char* hex_byte(const uint8_t b) { + _hex[byte_start + 4] = hex_nybble(b >> 4); + _hex[byte_start + 5] = hex_nybble(b); + return &_hex[byte_start + 4]; +} + +inline void _hex_word(const uint16_t w) { + _hex[byte_start + 2] = hex_nybble(w >> 12); + _hex[byte_start + 3] = hex_nybble(w >> 8); + _hex[byte_start + 4] = hex_nybble(w >> 4); + _hex[byte_start + 5] = hex_nybble(w); +} + +char* hex_word(const uint16_t w) { + _hex_word(w); + return &_hex[byte_start + 2]; +} + +#ifdef CPU_32_BIT + char* hex_long(const uint32_t l) { + _hex[2] = hex_nybble(l >> 28); + _hex[3] = hex_nybble(l >> 24); + _hex[4] = hex_nybble(l >> 20); + _hex[5] = hex_nybble(l >> 16); + _hex_word((uint16_t)(l & 0xFFFF)); + return &_hex[2]; + } +#endif + +char* hex_address(const void * const w) { + #ifdef CPU_32_BIT + (void)hex_long((ptr_int_t)w); + #else + (void)hex_word((ptr_int_t)w); + #endif + return _hex; +} + +void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } +void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } +void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } +void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } + +void print_hex_long(const uint32_t w, const char delimiter) { + SERIAL_ECHOPGM("0x"); + for (int B = 24; B >= 8; B -= 8){ + print_hex_byte(w >> B); + SERIAL_CHAR(delimiter); + } + print_hex_byte(w); +} + +#endif // NEED_HEX_PRINT diff --git a/Marlin/src/libs/hex_print_routines.h b/Marlin/src/libs/hex_print.h similarity index 100% rename from Marlin/src/libs/hex_print_routines.h rename to Marlin/src/libs/hex_print.h diff --git a/Marlin/src/libs/hex_print_routines.cpp b/Marlin/src/libs/hex_print_routines.cpp deleted file mode 100644 index 5909ffd7d015..000000000000 --- a/Marlin/src/libs/hex_print_routines.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfig.h" -#include "../gcode/parser.h" - -#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE) - - #include "hex_print_routines.h" - - #ifdef CPU_32_BIT - constexpr int byte_start = 4; - static char _hex[] = "0x00000000"; - #else - constexpr int byte_start = 0; - static char _hex[] = "0x0000"; - #endif - - char* hex_byte(const uint8_t b) { - _hex[byte_start + 4] = hex_nybble(b >> 4); - _hex[byte_start + 5] = hex_nybble(b); - return &_hex[byte_start + 4]; - } - - inline void _hex_word(const uint16_t w) { - _hex[byte_start + 2] = hex_nybble(w >> 12); - _hex[byte_start + 3] = hex_nybble(w >> 8); - _hex[byte_start + 4] = hex_nybble(w >> 4); - _hex[byte_start + 5] = hex_nybble(w); - } - - char* hex_word(const uint16_t w) { - _hex_word(w); - return &_hex[byte_start + 2]; - } - - #ifdef CPU_32_BIT - char* hex_long(const uint32_t l) { - _hex[2] = hex_nybble(l >> 28); - _hex[3] = hex_nybble(l >> 24); - _hex[4] = hex_nybble(l >> 20); - _hex[5] = hex_nybble(l >> 16); - _hex_word((uint16_t)(l & 0xFFFF)); - return &_hex[2]; - } - #endif - - char* hex_address(const void * const w) { - #ifdef CPU_32_BIT - (void)hex_long((ptr_int_t)w); - #else - (void)hex_word((ptr_int_t)w); - #endif - return _hex; - } - - void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } - void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } - void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } - void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } - - void print_hex_long(const uint32_t w, const char delimiter) { - SERIAL_ECHOPGM("0x"); - for (int B = 24; B >= 8; B -= 8){ - print_hex_byte(w >> B); - SERIAL_CHAR(delimiter); - } - print_hex_byte(w); - } - -#endif // AUTO_BED_LEVELING_UBL || M100_FREE_MEMORY_WATCHER || DEBUG_GCODE_PARSER From 7a5d408bc0ad461c0bdbfaa4acdfe24356d7e058 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 6 Aug 2020 04:19:56 -0500 Subject: [PATCH 291/483] Conditions cleanup --- Marlin/src/feature/leds/printer_event_leds.cpp | 2 +- Marlin/src/feature/leds/printer_event_leds.h | 2 +- Marlin/src/inc/Conditionals_adv.h | 5 +++++ Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/libs/least_squares_fit.cpp | 4 ++-- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index 58084da83724..31c628c2816a 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -21,7 +21,7 @@ */ /** - * printer_event_leds.cpp - LED color changing based on printer status + * feature/leds/printer_event_leds.cpp - LED color changing based on printer status */ #include "../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index 0295f9f5ac92..86ec292aa3da 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -22,7 +22,7 @@ #pragma once /** - * printer_event_leds.h - LED color changing based on printer status + * feature/leds/printer_event_leds.h - LED color changing based on printer status */ #include "leds.h" diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index a057034ab670..277131289a3c 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -383,3 +383,8 @@ #if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE) #define NEED_HEX_PRINT 1 #endif + +// Flag whether least_squares_fit.cpp is used +#if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + #define NEED_LSF 1 +#endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 5534acaf2ca7..a93e0527bf36 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1955,7 +1955,7 @@ #if PIN_EXISTS(DIGIPOTSS) #define HAS_DIGIPOTSS 1 #endif -#if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_E) +#if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_E) #define HAS_MOTOR_CURRENT_PWM 1 #endif diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 8a5095c88fe7..997130a91a7c 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -451,7 +451,7 @@ void ubl_map_screen() { #if IS_KINEMATIC // Index of the mesh point upon entry - const uint32_t old_pos_index = grid_index(x_plot, y_plot); + const int32_t old_pos_index = grid_index(x_plot, y_plot); // Direction from new (unconstrained) encoder value const int8_t step_dir = int32_t(ui.encoderPosition) < old_pos_index ? -1 : 1; #endif diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp index ce3a342b92ba..ef6ef9e90d80 100644 --- a/Marlin/src/libs/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -34,7 +34,7 @@ #include "../inc/MarlinConfig.h" -#if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) +#if NEED_LSF #include "least_squares_fit.h" @@ -67,4 +67,4 @@ int finish_incremental_LSF(struct linear_fit_data *lsf) { return 0; } -#endif // AUTO_BED_LEVELING_UBL || ENABLED(AUTO_BED_LEVELING_LINEAR) +#endif // NEED_LSF From 6bcfb58cd4b208cf042fa4a66faf14f382d33d07 Mon Sep 17 00:00:00 2001 From: Marco Burato Date: Thu, 6 Aug 2020 12:38:18 +0200 Subject: [PATCH 292/483] More Anycubic + Trigorilla mappings, ExtUI (#18903) --- Marlin/Configuration.h | 16 +- Marlin/src/HAL/AVR/HAL.h | 11 + Marlin/src/HAL/AVR/MarlinSerial.cpp | 18 + Marlin/src/HAL/AVR/MarlinSerial.h | 17 + Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 6 +- .../extui/lib/anycubic/anycubic_serial.cpp | 290 ---------- .../lcd/extui/lib/anycubic/anycubic_serial.h | 145 ----- .../anycubic_i3mega_lcd.cpp} | 327 ++++++----- .../anycubic_i3mega_lcd.h} | 14 +- Marlin/src/lcd/extui/ui_api.cpp | 8 +- Marlin/src/lcd/extui/ui_api.h | 4 +- Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp | 536 ++++++++++++++++++ ..._tft.cpp => extui_anycubic_i3mega_lcd.cpp} | 8 +- Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 100 ++-- platformio.ini | 2 +- 16 files changed, 837 insertions(+), 667 deletions(-) delete mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp delete mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h rename Marlin/src/lcd/extui/lib/{anycubic/anycubic_tft.cpp => anycubic_i3mega/anycubic_i3mega_lcd.cpp} (75%) rename Marlin/src/lcd/extui/lib/{anycubic/anycubic_tft.h => anycubic_i3mega/anycubic_i3mega_lcd.h} (77%) create mode 100644 Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp rename Marlin/src/lcd/{extui_anycubic_tft.cpp => extui_anycubic_i3mega_lcd.cpp} (95%) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 25efa79b7d78..75ee1eb99014 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2136,6 +2136,16 @@ // //#define TOUCH_UI_FTDI_EVE +// +// Touch-screen LCD for Anycubic printers +// +//#define ANYCUBIC_LCD_I3MEGA +//#define ANYCUBIC_LCD_CHIRON +#if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + #define ANYCUBIC_LCD_SERIAL_PORT 3 + //#define ANYCUBIC_LCD_DEBUG +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extensible_ui'. @@ -2188,12 +2198,6 @@ //#define TFT_LVGL_UI_FSMC // Robin nano v1.2 uses FSMC //#define TFT_LVGL_UI_SPI // Robin nano v2.0 uses SPI -// -// Anycubic Mega TFT (AI3M) -// -//#define ANYCUBIC_TFT_MODEL -//#define ANYCUBIC_TFT_DEBUG - //============================================================================= //============================ Other Controllers ============================ //============================================================================= diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index b0e0674c7329..609375e386e8 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -120,6 +120,17 @@ typedef int8_t pin_t; #define DGUS_SERIAL_GET_TX_BUFFER_FREE DGUS_SERIAL.get_tx_buffer_free #endif +#ifdef ANYCUBIC_LCD_SERIAL_PORT + #if !WITHIN(ANYCUBIC_LCD_SERIAL_PORT, -1, 3) + #error "ANYCUBIC_LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #elif ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT + #error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT. Please update your configuration." + #elif defined(SERIAL_PORT_2) && ANYCUBIC_LCD_SERIAL_PORT == SERIAL_PORT_2 + #error "ANYCUBIC_LCD_SERIAL_PORT must be different than SERIAL_PORT_2. Please update your configuration." + #endif + #define ANYCUBIC_LCD_SERIAL anycubicLcdSerial +#endif + // ------------------------ // Public functions // ------------------------ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index f41ef2011407..3d44a3f59ffc 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -792,6 +792,24 @@ #endif +#ifdef ANYCUBIC_LCD_SERIAL_PORT + + ISR(SERIAL_REGNAME(USART,ANYCUBIC_LCD_SERIAL_PORT,_RX_vect)) { + MarlinSerial>::store_rxd_char(); + } + + ISR(SERIAL_REGNAME(USART,ANYCUBIC_LCD_SERIAL_PORT,_UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); + } + + // Preinstantiate + template class MarlinSerial>; + + // Instantiate + MarlinSerial> anycubicLcdSerial; + +#endif + // For AT90USB targets use the UART for BT interfacing #if defined(USBCON) && ENABLED(BLUETOOTH) HardwareSerial bluetoothSerial; diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 1182d86ac58f..e8bfc5583a91 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -312,6 +312,23 @@ extern MarlinSerial> internalDgusSerial; #endif +#ifdef ANYCUBIC_LCD_SERIAL_PORT + template + struct AnycubicLcdSerialCfg { + static constexpr int PORT = serial; + static constexpr unsigned int RX_SIZE = 64; + static constexpr unsigned int TX_SIZE = 128; + static constexpr bool XONOFF = false; + static constexpr bool EMERGENCYPARSER = false; + static constexpr bool DROPPED_RX = false; + static constexpr bool RX_OVERRUNS = false; + static constexpr bool RX_FRAMING_ERRORS = false; + static constexpr bool MAX_RX_QUEUED = false; + }; + + extern MarlinSerial> anycubicLcdSerial; +#endif + // Use the UART for Bluetooth in AT90USB configurations #if defined(USBCON) && ENABLED(BLUETOOTH) extern HardwareSerial bluetoothSerial; diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index c309822f92c9..4ffd6fddcc6f 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -411,7 +411,7 @@ #endif // Extensible UI serial touch screens. (See src/lcd/extui) -#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE) +#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) #define IS_EXTUI #define EXTENSIBLE_UI #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e1b162a96f98..d296eb2f1593 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -515,6 +515,8 @@ #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." #elif defined(TOUCH_BUTTONS) #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." +#elif defined(ANYCUBIC_TFT_MODEL) + #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." #endif #ifdef FIL_RUNOUT_INVERTING @@ -2237,7 +2239,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(TFT_320x240_SPI) \ + ENABLED(FSMC_GRAPHICAL_TFT) \ + ENABLED(TFT_LVGL_UI_FSMC) \ - + ENABLED(TFT_LVGL_UI_SPI) + + ENABLED(TFT_LVGL_UI_SPI) \ + + ENABLED(ANYCUBIC_LCD_I3MEGA) \ + + ENABLED(ANYCUBIC_LCD_CHIRON) #error "Please select no more than one LCD controller option." #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp deleted file mode 100644 index fd5f2691bdfb..000000000000 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - anycubic_serial.cpp --- Support for Anycubic i3 Mega TFT serial connection - Created by Christian Hopp on 09.12.17. - - Original file: - HardwareSerial.cpp - Hardware serial library for Wiring - Copyright (c) 2006 Nicholas Zambetti. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Modified 23 November 2006 by David A. Mellis - Modified 28 September 2010 by Mark Sproul - Modified 14 August 2012 by Alarus -*/ - -#include "../../../../inc/MarlinConfig.h" - -#if ENABLED(ANYCUBIC_TFT_MODEL) - -#include - -// This next line disables the entire anycubic_serial.cpp, -// to support AtTiny series and other chips without a UART -#ifdef UBRR3H - -#include "anycubic_serial.h" - -#include -#include -#include -#include -#include "wiring_private.h" - -// Define constants and variables for buffering incoming serial data. We're -// using a ring buffer (I think), in which head is the index of the location -// to which to write the next incoming character and tail is the index of the -// location from which to read. -#if (RAMEND < 1000) - #define SERIAL_BUFFER_SIZE 64 -#else - #define SERIAL_BUFFER_SIZE 128 -#endif - -struct ring_buffer { - unsigned char buffer[SERIAL_BUFFER_SIZE]; - volatile unsigned int head; - volatile unsigned int tail; -}; - -ring_buffer rx_buffer_ajg = { { 0 }, 0, 0 }; -ring_buffer tx_buffer_ajg = { { 0 }, 0, 0 }; - -inline void store_char(unsigned char c, ring_buffer *buffer) { - int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; - - // if we should be storing the received character into the location - // just before the tail (meaning that the head would advance to the - // current location of the tail), we're about to overflow the buffer - // and so we don't write the character or advance the head. - if (i != buffer->tail) { - buffer->buffer[buffer->head] = c; - buffer->head = i; - } -} - -#if defined(USART3_RX_vect) && defined(UDR3) - void serialEvent3() __attribute__((weak)); - void serialEvent3() {} - #define serialEvent3_implemented - ISR(USART3_RX_vect) { - if (bit_is_clear(UCSR3A, UPE3)) { - unsigned char c = UDR3; - store_char(c, &rx_buffer_ajg); - } - else { - unsigned char c = UDR3; - } - } -#endif - -#ifdef USART3_UDRE_vect - - ISR(USART3_UDRE_vect) { - if (tx_buffer_ajg.head == tx_buffer_ajg.tail) { - // Buffer empty, so disable interrupts - cbi(UCSR3B, UDRIE3); - } - else { - // There is more data in the output buffer. Send the next byte - unsigned char c = tx_buffer_ajg.buffer[tx_buffer_ajg.tail]; - tx_buffer_ajg.tail = (tx_buffer_ajg.tail + 1) % SERIAL_BUFFER_SIZE; - - UDR3 = c; - } - } - -#endif - -// Constructors //////////////////////////////////////////////////////////////// - -AnycubicSerialClass::AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx_buffer, - volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, - volatile uint8_t *ucsra, volatile uint8_t *ucsrb, - volatile uint8_t *ucsrc, volatile uint8_t *udr, - uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x -) { - _rx_buffer = rx_buffer; - _tx_buffer = tx_buffer; - _ubrrh = ubrrh; - _ubrrl = ubrrl; - _ucsra = ucsra; - _ucsrb = ucsrb; - _ucsrc = ucsrc; - _udr = udr; - _rxen = rxen; - _txen = txen; - _rxcie = rxcie; - _udrie = udrie; - _u2x = u2x; -} - -// Public Methods ////////////////////////////////////////////////////////////// - -void AnycubicSerialClass::begin(unsigned long baud) { - uint16_t baud_setting; - bool use_u2x = true; - - #if F_CPU == 16000000UL - // hardcoded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards and the firmware on the 8U2 - // on the Uno and Mega 2560. - if (baud == 57600) use_u2x = false; - #endif - -try_again: - - if (use_u2x) { - *_ucsra = 1 << _u2x; - baud_setting = (F_CPU / 4 / baud - 1) / 2; - } else { - *_ucsra = 0; - baud_setting = (F_CPU / 8 / baud - 1) / 2; - } - - if ((baud_setting > 4095) && use_u2x) { - use_u2x = false; - goto try_again; - } - - // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) - *_ubrrh = baud_setting >> 8; - *_ubrrl = baud_setting; - - transmitting = false; - - sbi(*_ucsrb, _rxen); - sbi(*_ucsrb, _txen); - sbi(*_ucsrb, _rxcie); - cbi(*_ucsrb, _udrie); -} - -void AnycubicSerialClass::begin(unsigned long baud, byte config) { - uint16_t baud_setting; - uint8_t current_config; - bool use_u2x = true; - - #if F_CPU == 16000000UL - // hardcoded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards and the firmware on the 8U2 - // on the Uno and Mega 2560. - if (baud == 57600) use_u2x = false; - #endif - -try_again: - - if (use_u2x) { - *_ucsra = 1 << _u2x; - baud_setting = (F_CPU / 4 / baud - 1) / 2; - } - else { - *_ucsra = 0; - baud_setting = (F_CPU / 8 / baud - 1) / 2; - } - - if ((baud_setting > 4095) && use_u2x) { - use_u2x = false; - goto try_again; - } - - // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) - *_ubrrh = baud_setting >> 8; - *_ubrrl = baud_setting; - - //set the data bits, parity, and stop bits - #ifdef __AVR_ATmega8__ - config |= 0x80; // select UCSRC register (shared with UBRRH) - #endif - *_ucsrc = config; - - sbi(*_ucsrb, _rxen); - sbi(*_ucsrb, _txen); - sbi(*_ucsrb, _rxcie); - cbi(*_ucsrb, _udrie); -} - -void AnycubicSerialClass::end() { - // wait for transmission of outgoing data - while (_tx_buffer->head != _tx_buffer->tail) - ; - - cbi(*_ucsrb, _rxen); - cbi(*_ucsrb, _txen); - cbi(*_ucsrb, _rxcie); - cbi(*_ucsrb, _udrie); - - // clear any received data - _rx_buffer->head = _rx_buffer->tail; -} - -int AnycubicSerialClass::available(void) { - return (int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE; -} - -int AnycubicSerialClass::peek(void) { - if (_rx_buffer->head == _rx_buffer->tail) { - return -1; - } else { - return _rx_buffer->buffer[_rx_buffer->tail]; - } -} - -int AnycubicSerialClass::read(void) { - // if the head isn't ahead of the tail, we don't have any characters - if (_rx_buffer->head == _rx_buffer->tail) { - return -1; - } else { - unsigned char c = _rx_buffer->buffer[_rx_buffer->tail]; - _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % SERIAL_BUFFER_SIZE; - return c; - } -} - -void AnycubicSerialClass::flush() { - // UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT - while (transmitting && ! (*_ucsra & _BV(TXC0))); - transmitting = false; -} - -size_t AnycubicSerialClass::write(uint8_t c) { - int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE; - - // If the output buffer is full, there's nothing for it other than to - // wait for the interrupt handler to empty it a bit - // ???: return 0 here instead? - while (i == _tx_buffer->tail) - ; - - _tx_buffer->buffer[_tx_buffer->head] = c; - _tx_buffer->head = i; - - sbi(*_ucsrb, _udrie); - // clear the TXC bit -- "can be cleared by writing a one to its bit location" - transmitting = true; - sbi(*_ucsra, TXC0); - - return 1; -} - -AnycubicSerialClass::operator bool() { - return true; -} - -// Preinstantiate Objects ////////////////////////////////////////////////////// - -AnycubicSerialClass AnycubicSerial(&rx_buffer_ajg, &tx_buffer_ajg, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); - -#endif // UBRR3H -#endif // ANYCUBIC_TFT_MODEL diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h deleted file mode 100644 index ed4c19b63e88..000000000000 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - anycubic_serial.h --- Support for Anycubic i3 Mega TFT serial connection - Created by Christian Hopp on 09.12.17. - - Original file: - - HardwareSerial.h - Hardware serial library for Wiring - Copyright (c) 2006 Nicholas Zambetti. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Modified 28 September 2010 by Mark Sproul - Modified 14 August 2012 by Alarus -*/ -#pragma once - -#include -#include - -#include "Stream.h" - -#define FORCE_INLINE __attribute__((always_inline)) inline - -struct ring_buffer; - -class AnycubicSerialClass : public Stream { - private: - ring_buffer *_rx_buffer; - ring_buffer *_tx_buffer; - volatile uint8_t *_ubrrh; - volatile uint8_t *_ubrrl; - volatile uint8_t *_ucsra; - volatile uint8_t *_ucsrb; - volatile uint8_t *_ucsrc; - volatile uint8_t *_udr; - uint8_t _rxen; - uint8_t _txen; - uint8_t _rxcie; - uint8_t _udrie; - uint8_t _u2x; - bool transmitting; - public: - AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx_buffer, - volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, - volatile uint8_t *ucsra, volatile uint8_t *ucsrb, - volatile uint8_t *ucsrc, volatile uint8_t *udr, - uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x - ); - void begin(unsigned long); - void begin(unsigned long, uint8_t); - void end(); - virtual int available(void); - virtual int peek(void); - virtual int read(void); - virtual void flush(void); - virtual size_t write(uint8_t); - inline size_t write(unsigned long n) { return write((uint8_t)n); } - inline size_t write(long n) { return write((uint8_t)n); } - inline size_t write(unsigned int n) { return write((uint8_t)n); } - inline size_t write(int n) { return write((uint8_t)n); } - using Print::write; // pull in write(str) and write(buf, size) from Print - operator bool(); -}; - -// Define config for Serial.begin(baud, config); -#define SERIAL_5N1 0x00 -#define SERIAL_6N1 0x02 -#define SERIAL_7N1 0x04 -#define SERIAL_8N1 0x06 -#define SERIAL_5N2 0x08 -#define SERIAL_6N2 0x0A -#define SERIAL_7N2 0x0C -#define SERIAL_8N2 0x0E -#define SERIAL_5E1 0x20 -#define SERIAL_6E1 0x22 -#define SERIAL_7E1 0x24 -#define SERIAL_8E1 0x26 -#define SERIAL_5E2 0x28 -#define SERIAL_6E2 0x2A -#define SERIAL_7E2 0x2C -#define SERIAL_8E2 0x2E -#define SERIAL_5O1 0x30 -#define SERIAL_6O1 0x32 -#define SERIAL_7O1 0x34 -#define SERIAL_8O1 0x36 -#define SERIAL_5O2 0x38 -#define SERIAL_6O2 0x3A -#define SERIAL_7O2 0x3C -#define SERIAL_8O2 0x3E - -extern void serialEventRun(void) __attribute__((weak)); - -#define ANYCUBIC_SERIAL_PROTOCOL(x) (AnycubicSerial.print(x)) -#define ANYCUBIC_SERIAL_PROTOCOL_F(x,y) (AnycubicSerial.print(x, y)) -#define ANYCUBIC_SERIAL_PROTOCOLPGM(x) (AnycubicSerialprintPGM(PSTR(x))) -#define ANYCUBIC_SERIAL_(x) (AnycubicSerial.print(x), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_PROTOCOLLN(x) (AnycubicSerial.print(x), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) (AnycubicSerialprintPGM(PSTR(x)), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) - -#define ANYCUBIC_SERIAL_START() (AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_CMD_SEND(x) (AnycubicSerialprintPGM(PSTR(x)), AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_ENTER() (AnycubicSerial.write('\r'), AnycubicSerial.write('\n')) -#define ANYCUBIC_SERIAL_SPACE() (AnycubicSerial.write(' ')) - -const char newErr[] PROGMEM = "ERR "; -const char newSucc[] PROGMEM = "OK"; - -#define ANYCUBIC_SERIAL_ERROR_START (AnycubicSerialprintPGM(newErr)) -#define ANYCUBIC_SERIAL_ERROR(x) ANYCUBIC_SERIAL_PROTOCOL(x) -#define ANYCUBIC_SERIAL_ERRORPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) -#define ANYCUBIC_SERIAL_ERRORLN(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) -#define ANYCUBIC_SERIAL_ERRORLNPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) - -//##define ANYCUBIC_SERIAL_ECHO_START (AnycubicSerialprintPGM(newSucc)) -#define ANYCUBIC_SERIAL_ECHOLN(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) -#define ANYCUBIC_SERIAL_SUCC_START (AnycubicSerialprintPGM(newSucc)) -#define ANYCUBIC_SERIAL_ECHOPAIR(name,value) (serial_echopair_P(PSTR(name),(value))) -#define ANYCUBIC_SERIAL_ECHOPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) -#define ANYCUBIC_SERIAL_ECHO(x) ANYCUBIC_SERIAL_PROTOCOL(x) - -#ifdef UBRR3H - - extern AnycubicSerialClass AnycubicSerial; - - FORCE_INLINE void AnycubicSerialprintPGM(const char *str) { - char ch = pgm_read_byte(str); - while (ch) { - AnycubicSerial.write(ch); - ch = pgm_read_byte(++str); - } - } - -#endif diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp similarity index 75% rename from Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp rename to Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 718b47fee9b4..1c9b9299fc43 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -1,5 +1,5 @@ /** - * anycubic_tft.cpp --- Support for Anycubic i3 Mega TFT + * anycubic_i3mega_lcd.cpp --- Support for Anycubic i3 Mega TFT * Created by Christian Hopp on 09.12.17. * Improved by David Ramiro * Converted to ext_iu by John BouAntoun 21 June 2020 @@ -21,15 +21,29 @@ #include "../../../../inc/MarlinConfigPre.h" -#if ENABLED(ANYCUBIC_TFT_MODEL) +#if ENABLED(ANYCUBIC_LCD_I3MEGA) -#include "anycubic_tft.h" -#include "anycubic_serial.h" +#include "anycubic_i3mega_lcd.h" #include "../../../../inc/MarlinConfig.h" #include "../../ui_api.h" #include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +// command sending macro's with debugging capability +#define SEND_PGM(x) send_P(PSTR(x)) +#define SENDLINE_PGM(x) sendLine_P(PSTR(x)) +#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(itostr3(y))) +#define SEND(x) send(x) +#define SENDLINE(x) sendLine(x) +#if ENABLED(ANYCUBIC_LCD_DEBUG) + #define SENDLINE_DBG_PGM(x,y) (sendLine_P(PSTR(x)), SERIAL_ECHOLNPGM(y)) + #define SENDLINE_DBG_PGM_VAL(x,y,z) (sendLine_P(PSTR(x)), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) +#else + #define SENDLINE_DBG_PGM(x,y) sendLine_P(PSTR(x)) + #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) +#endif + + AnycubicTFTClass AnycubicTFT; char _conv[8]; @@ -43,6 +57,30 @@ char *itostr2(const uint8_t &x) { return _conv; } +static void sendNewLine(void) { + ANYCUBIC_LCD_SERIAL.write('\r'); + ANYCUBIC_LCD_SERIAL.write('\n'); +} + +static void send(const char *str) { + ANYCUBIC_LCD_SERIAL.print(str); +} + +static void sendLine(const char *str) { + send(str); + sendNewLine(); +} + +static void send_P(PGM_P str) { + while (const char c = pgm_read_byte(str++)) + ANYCUBIC_LCD_SERIAL.write(c); +} + +static void sendLine_P(PGM_P str) { + send_P(str); + sendNewLine(); +} + #ifndef ULTRA_LCD #define DIGIT(n) ('0' + (n)) #define DIGIMOD(n, f) DIGIT((n) / (f) % 10) @@ -74,8 +112,8 @@ char *itostr2(const uint8_t &x) { AnycubicTFTClass::AnycubicTFTClass() {} void AnycubicTFTClass::OnSetup() { - AnycubicSerial.begin(115200); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset + ANYCUBIC_LCD_SERIAL.begin(115200); + SENDLINE_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset ExtUI::delay_ms(10); // initialise the state of the key pins running on the tft @@ -92,7 +130,7 @@ void AnycubicTFTClass::OnSetup() { mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // DoSDCardStateCheck(); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready + SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready ExtUI::delay_ms(10); DoFilamentRunoutCheck(); @@ -101,7 +139,7 @@ void AnycubicTFTClass::OnSetup() { #if ENABLED(STARTUP_CHIME) ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); #endif - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished startup"); #endif } @@ -112,7 +150,7 @@ void AnycubicTFTClass::OnCommandScan() { if (ELAPSED(ms, nextStopCheck)) { nextStopCheck = ms + 1000UL; if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); #endif mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; @@ -120,7 +158,7 @@ void AnycubicTFTClass::OnCommandScan() { ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status ExtUI::delay_ms(200); // tell printer to release resources of print to indicate it is done - ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); + SENDLINE_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); } } @@ -134,11 +172,11 @@ void AnycubicTFTClass::OnCommandScan() { } void AnycubicTFTClass::OnKillTFT() { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); + SENDLINE_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); } void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered..."); SERIAL_ECHO(itostr2(isInserted)); SERIAL_EOL(); @@ -147,21 +185,21 @@ void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { } void AnycubicTFTClass::OnSDCardError() { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); #endif - ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); } void AnycubicTFTClass::OnFilamentRunout() { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); #endif DoFilamentRunoutCheck(); } void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: OnUserConfirmRequired triggered... "); SERIAL_ECHOLN(msg); #endif @@ -181,36 +219,36 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKED; // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); } else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); + SENDLINE_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); } else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKING; // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out // disable continue button - // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause + // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); } else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); } else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED; // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); } #endif } @@ -360,7 +398,7 @@ void AnycubicTFTClass::HandleSpecialMenu() { default: break; } - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) } else { SERIAL_ECHOPGM("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); @@ -375,14 +413,13 @@ void AnycubicTFTClass::RenderCurrentFileList() { SelectedDirectory[0] = 0; SelectedFile[0] = 0; - ANYCUBIC_SERIAL_PROTOCOLPGM("FN "); // Filelist start - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("FN "); // Filelist start if (!ExtUI::isMediaInserted() && !SpecialMenu) { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); } else { if (CodeSeen('S')) @@ -393,8 +430,7 @@ void AnycubicTFTClass::RenderCurrentFileList() { else RenderCurrentFolder(selectedNumber); } - ANYCUBIC_SERIAL_PROTOCOLPGM("END"); // Filelist stop - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("END"); // Filelist stop #endif // SDSUPPORT } @@ -402,58 +438,58 @@ void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { switch (selectedNumber) { #if ENABLED(PROBE_MANUALLY) case 0: // First Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01ZUp0.1>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ZUp0.02>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03ZDn0.02>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04ZDn0.1>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<01ZUp0.1>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<02ZUp0.02>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<03ZDn0.02>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<04ZDn0.1>"); + SENDLINE_PGM(""); break; case 4: // Second Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05PrehtBed>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SMeshLvl>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07MeshNPnt>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<08HtEndPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<05PrehtBed>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<06SMeshLvl>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<07MeshNPnt>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<08HtEndPID>"); + SENDLINE_PGM(""); break; case 8: // Third Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<09HtBedPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<10FWDeflts>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<11SvEEPROM>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<09HtBedPID>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<10FWDeflts>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<11SvEEPROM>"); + SENDLINE_PGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); break; #else case 0: // First Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01PrehtBed>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ABL>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03HtEndPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04HtBedPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<01PrehtBed>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<02ABL>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<03HtEndPID>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<04HtBedPID>"); + SENDLINE_PGM(""); break; case 4: // Second Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05FWDeflts>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SvEEPROM>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07SendM108>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM("<05FWDeflts>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<06SvEEPROM>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<07SendM108>"); + SENDLINE_PGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); break; #endif // PROBE_MANUALLY @@ -477,30 +513,30 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { for (cnt = selectedNumber; cnt <= max_files; cnt++) { if (cnt == 0) { // Special Entry if (currentFileList.isAtRootDir()) { - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); } else { - ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); + SENDLINE_PGM("/.."); + SENDLINE_PGM("/.."); } } else { currentFileList.seek(cnt - 1, false); - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLN(currentFileList.filename()); #endif if (currentFileList.isDir()) { - ANYCUBIC_SERIAL_PROTOCOLPGM("/"); - ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); - ANYCUBIC_SERIAL_PROTOCOLPGM("/"); - ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); + SEND_PGM("/"); + SENDLINE(currentFileList.shortFilename()); + SEND_PGM("/"); + SENDLINE(currentFileList.longFilename()); } else { - ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); - ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); + SENDLINE(currentFileList.shortFilename()); + SENDLINE(currentFileList.longFilename()); } } } @@ -509,7 +545,7 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { void AnycubicTFTClass::OnPrintTimerStarted() { #if ENABLED(SDSUPPORT) if (mediaPrintingState == AMPRINTSTATE_PRINTING) - ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print + SENDLINE_DBG_PGM("J04", "TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print #endif } @@ -528,7 +564,7 @@ void AnycubicTFTClass::OnPrintTimerStopped() { if (mediaPrintingState == AMPRINTSTATE_PRINTING) { mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); + SENDLINE_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); } // otherwise it was stopped by the printer so don't send print completed signal to TFT #endif @@ -536,8 +572,8 @@ void AnycubicTFTClass::OnPrintTimerStopped() { void AnycubicTFTClass::GetCommandFromTFT() { char *starpos = NULL; - while (AnycubicSerial.available() > 0 && TFTbuflen < TFTBUFSIZE) { - serial3_char = AnycubicSerial.read(); + while (ANYCUBIC_LCD_SERIAL.available() > 0 && TFTbuflen < TFTBUFSIZE) { + serial3_char = ANYCUBIC_LCD_SERIAL.read(); if (serial3_char == '\n' || serial3_char == '\r' || serial3_char == ':' || @@ -553,7 +589,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) if ((a_command > 7) && (a_command != 20)) { // No debugging of status polls, please! SERIAL_ECHOPGM("TFT Serial Command: "); SERIAL_ECHOLN(TFTcmdbuffer[TFTbufindw]); @@ -563,25 +599,25 @@ void AnycubicTFTClass::GetCommandFromTFT() { switch (a_command) { case 0: { // A0 GET HOTEND TEMP float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SENDCOMMANDPGM_VAL("A0V ", int(hotendActualTemp + 0.5)); + SEND_PGM_VAL("A0V ", int(hotendActualTemp + 0.5)); } break; case 1: { // A1 GET HOTEND TARGET TEMP float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SENDCOMMANDPGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); + SEND_PGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); } break; case 2: { // A2 GET HOTBED TEMP float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); - ANYCUBIC_SENDCOMMANDPGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); + SEND_PGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); } break; case 3: { // A3 GET HOTBED TARGET TEMP float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); - ANYCUBIC_SENDCOMMANDPGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); + SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); } break; @@ -589,7 +625,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { { float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); fanPercent = constrain(fanPercent, 0, 100); - ANYCUBIC_SENDCOMMANDPGM_VAL("A4V ", int(fanPercent)); + SEND_PGM_VAL("A4V ", int(fanPercent)); } break; @@ -598,58 +634,46 @@ void AnycubicTFTClass::GetCommandFromTFT() { float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); - ANYCUBIC_SERIAL_PROTOCOLPGM("A5V"); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("X: "); - ANYCUBIC_SERIAL_PROTOCOL(xPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("Y: "); - ANYCUBIC_SERIAL_PROTOCOL(yPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("Z: "); - ANYCUBIC_SERIAL_PROTOCOL(zPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_ENTER(); + SEND_PGM("A5V X: "); + ANYCUBIC_LCD_SERIAL.print(xPostition); + SEND_PGM(" Y: "); + ANYCUBIC_LCD_SERIAL.print(yPostition); + SEND_PGM(" Z: "); + ANYCUBIC_LCD_SERIAL.print(zPostition); + SENDLINE_PGM(""); } break; case 6: // A6 GET SD CARD PRINTING STATUS #if ENABLED(SDSUPPORT) if (ExtUI::isPrintingFromMedia()) { - ANYCUBIC_SERIAL_PROTOCOLPGM("A6V "); + SEND_PGM("A6V "); if (ExtUI::isMediaInserted()) { - ANYCUBIC_SERIAL_PROTOCOL(itostr3(int(ExtUI::getProgress_percent()))); - ANYCUBIC_SERIAL_ENTER(); + SENDLINE(itostr3(int(ExtUI::getProgress_percent()))); } else { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); } } else { - ANYCUBIC_SERIAL_PROTOCOLPGM("A6V ---"); - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("A6V ---"); } #endif break; case 7: { // A7 GET PRINTING TIME uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); - ANYCUBIC_SERIAL_PROTOCOLPGM("A7V "); + SEND_PGM("A7V "); if (elapsedSeconds != 0) { // print time uint32_t elapsedMinutes = elapsedSeconds / 60; - ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes / 60)); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("H"); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes % 60)); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("M"); + SEND(itostr2(elapsedMinutes / 60)); + SEND_PGM(" H "); + SEND(itostr2(elapsedMinutes % 60)); + SENDLINE_PGM(" M"); } else { - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("999:999"); + SENDLINE_PGM(" 999:999"); } - ANYCUBIC_SERIAL_ENTER(); } break; @@ -693,15 +717,15 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (TFTstrchr_pointer[4] == '/') { strcpy(SelectedDirectory, TFTstrchr_pointer + 5); SelectedFile[0] = 0; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + SENDLINE_PGM(""); } else if (TFTstrchr_pointer[4] == '<') { strcpy(SelectedDirectory, TFTstrchr_pointer + 4); SpecialMenu = true; SelectedFile[0] = 0; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + SENDLINE_PGM(""); } else { SelectedDirectory[0] = 0; @@ -710,7 +734,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { *(starpos - 1) = '\0'; strcpy(SelectedFile, TFTstrchr_pointer + 4); - ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected + SENDLINE_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected } } #endif @@ -766,7 +790,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM(""); } break; @@ -776,7 +800,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { disable_all_steppers(); } - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM(""); break; case 20: { // A20 read printing speed @@ -785,7 +809,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (CodeSeen('S')) feedrate_percentage = constrain(CodeValue(), 40, 999); else - ANYCUBIC_SENDCOMMANDPGM_VAL("A20V ", feedrate_percentage); + SEND_PGM_VAL("A20V ", feedrate_percentage); } break; @@ -855,14 +879,14 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (strlen(commandStr) > 0) { sprintf_P(fullCommandStr, PSTR("G91\n%s\nG90"), commandStr); - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); SERIAL_ECHOLN(fullCommandStr); #endif ExtUI::injectCommands(fullCommandStr); } } - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM(""); break; case 23: // A23 preheat pla @@ -872,8 +896,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SERIAL_SUCC_START; - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("OK"); } break; @@ -884,8 +907,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SERIAL_SUCC_START; - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM("OK"); } break; @@ -894,7 +916,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { ExtUI::setTargetTemp_celsius(0, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(0, (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down + SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down } break; @@ -915,7 +937,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } } else { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); } SelectedDirectory[0] = 0; @@ -931,13 +953,12 @@ void AnycubicTFTClass::GetCommandFromTFT() { NOOP; else if (CodeSeen('C')) NOOP; - ANYCUBIC_SERIAL_ENTER(); + SENDLINE_PGM(""); break; case 33: // A33 get version info - ANYCUBIC_SERIAL_PROTOCOLPGM("J33 "); - ANYCUBIC_SERIAL_PROTOCOLPGM(DETAILED_BUILD_VERSION); - ANYCUBIC_SERIAL_ENTER(); + SEND_PGM("J33 "); + SENDLINE_PGM(DETAILED_BUILD_VERSION); break; default: @@ -959,9 +980,9 @@ void AnycubicTFTClass::DoSDCardStateCheck() { #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) bool isInserted = ExtUI::isMediaInserted(); if (isInserted) - ANYCUBIC_SENDCOMMAND_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); + SENDLINE_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); else - ANYCUBIC_SENDCOMMAND_DBG_PGM("J01", "TFT Serial Debug: SD card state changed... !isInserted"); + SENDLINE_DBG_PGM("J01", "TFT Serial Debug: SD card state changed... !isInserted"); #endif } @@ -976,10 +997,10 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); // tell the user that the filament has run out and wait - ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); + SENDLINE_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); } else { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); + SENDLINE_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); } } #endif // FILAMENT_RUNOUT_SENSOR @@ -988,7 +1009,7 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { void AnycubicTFTClass::StartPrint() { #if ENABLED(SDSUPPORT) if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); SERIAL_ECHO(ExtUI::isPrinting()); SERIAL_ECHOPGM(" "); @@ -1006,7 +1027,7 @@ void AnycubicTFTClass::PausePrint() { if (ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state - ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause + SENDLINE_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause // for some reason pausing the print doesn't retract the extruder so force a manual one here ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); @@ -1019,7 +1040,7 @@ void AnycubicTFTClass::ResumePrint() { #if ENABLED(SDSUPPORT) #if ENABLED(FILAMENT_RUNOUT_SENSOR) if (READ(FIL_RUNOUT_PIN)) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) + #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); #endif @@ -1027,7 +1048,7 @@ void AnycubicTFTClass::ResumePrint() { DoFilamentRunoutCheck(); // re-enable the continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still tripped... J18"); + SENDLINE_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still tripped... J18"); return; } #endif @@ -1036,7 +1057,7 @@ void AnycubicTFTClass::ResumePrint() { mediaPauseState = AMPAUSESTATE_REHEATING; // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out // // disable the continue button - // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause + // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause // reheat the nozzle ExtUI::setUserConfirmed(); @@ -1045,7 +1066,7 @@ void AnycubicTFTClass::ResumePrint() { mediaPrintingState = AMPRINTSTATE_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now + SENDLINE_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now ExtUI::resumePrint(); } #endif @@ -1055,7 +1076,7 @@ void AnycubicTFTClass::StopPrint() { #if ENABLED(SDSUPPORT) mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); + SENDLINE_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); // for some reason stopping the print doesn't retract the extruder so force a manual one here ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); @@ -1063,4 +1084,4 @@ void AnycubicTFTClass::StopPrint() { #endif } -#endif // ANYCUBIC_TFT_MODEL +#endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h similarity index 77% rename from Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h rename to Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h index 324dfd213f47..ee011f1dfed6 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h @@ -1,5 +1,5 @@ /** - * anycubic_tft.h --- Support for Anycubic i3 Mega TFT + * anycubic_i3mega_lcd.h --- Support for Anycubic i3 Mega TFT * Created by Christian Hopp on 09.12.17. * Improved by David Ramiro * Converted to ext_iu by John BouAntoun 21 June 2020 @@ -23,18 +23,6 @@ #include "../../../../inc/MarlinConfigPre.h" #include "../../../../sd/SdFatConfig.h" // for the FILENAME_LENGTH macro -// command sending macro's with debugging capability -#define ANYCUBIC_SENDCOMMANDPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) -#define ANYCUBIC_SENDCOMMANDPGM_VAL(x,y) (ANYCUBIC_SERIAL_PROTOCOLPGM(x), ANYCUBIC_SERIAL_PROTOCOLLN(itostr3(y))) -#define ANYCUBIC_SENDCOMMAND(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) -#if ENABLED(ANYCUBIC_TFT_DEBUG) - #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOLNPGM(y)) - #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) -#else - #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) - #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) -#endif - char *itostr2(const uint8_t &x); #ifndef ULTRA_LCD char *itostr3(const int); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index b5dbb11a0613..451aa1f12a9b 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -304,7 +304,7 @@ namespace ExtUI { return epos; } - void setAxisPosition_mm(const float position, const axis_t axis) { + void setAxisPosition_mm(const float position, const axis_t axis, const feedRate_t feedrate/*=0*/) { // Start with no limits to movement float min = current_position[axis] - 1000, max = current_position[axis] + 1000; @@ -337,14 +337,14 @@ namespace ExtUI { #endif current_position[axis] = constrain(position, min, max); - line_to_current_position(manual_feedrate_mm_s[axis]); + line_to_current_position(feedrate ?: manual_feedrate_mm_s[axis]); } - void setAxisPosition_mm(const float position, const extruder_t extruder) { + void setAxisPosition_mm(const float position, const extruder_t extruder, const feedRate_t feedrate/*=0*/) { setActiveTool(extruder, true); current_position.e = position; - line_to_current_position(manual_feedrate_mm_s.e); + line_to_current_position(feedrate ?: manual_feedrate_mm_s.e); } void setActiveTool(const extruder_t extruder, bool no_move) { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index ae6f31d43e2f..ca12d79a8bc9 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -164,8 +164,8 @@ namespace ExtUI { void setTargetTemp_celsius(const float, const heater_t); void setTargetTemp_celsius(const float, const extruder_t); void setTargetFan_percent(const float, const fan_t); - void setAxisPosition_mm(const float, const axis_t); - void setAxisPosition_mm(const float, const extruder_t); + void setAxisPosition_mm(const float, const axis_t, const feedRate_t=0); + void setAxisPosition_mm(const float, const extruder_t, const feedRate_t=0); void setAxisSteps_per_mm(const float, const axis_t); void setAxisSteps_per_mm(const float, const extruder_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const axis_t); diff --git a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp new file mode 100644 index 000000000000..9d00db3353f2 --- /dev/null +++ b/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp @@ -0,0 +1,536 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * extui_anycubic_chiron_lcd.cpp + * + * Anycubic Chiron TFT support for Marlin + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "extui/ui_api.h" + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + #if GRID_MAX_POINTS_X != 5 || GRID_MAX_POINTS_Y != 5 + #error ANYCUBIC CHIRON LCD requires a 5x5 bed leveling grid (GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y) + #endif +#else + #error ANYCUBIC CHIRON LCD requires AUTO_BED_LEVELING_BILINEAR enabled +#endif + +#if DISABLED(FILAMENT_RUNOUT_SENSOR) + #error ANYCUBIC CHIRON LCD requires FILAMENT_RUNOUT_SENSOR enabled +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #error ANYCUBIC CHIRON LCD does not currently support POWER_LOSS_RECOVERY +#endif + +static bool is_auto_leveling = false; +static bool is_printing_from_sd = false; +static bool is_out_of_filament = false; + +static void sendNewLine(void) { + ANYCUBIC_LCD_SERIAL.write('\r'); + ANYCUBIC_LCD_SERIAL.write('\n'); +} + +static void send(const char *str) { + ANYCUBIC_LCD_SERIAL.print(str); +} + +static void sendLine(const char *str) { + send(str); + sendNewLine(); +} + +static void send_P(PGM_P str) { + while (const char c = pgm_read_byte(str++)) + ANYCUBIC_LCD_SERIAL.write(c); +} + +static void sendLine_P(PGM_P str) { + send_P(str); + sendNewLine(); +} + +static void sendValue_P(PGM_P prefix, int value) { + send_P(prefix); + ANYCUBIC_LCD_SERIAL.print(value); +} + +static void sendValue_P(PGM_P prefix, float value) { + send_P(prefix); + ANYCUBIC_LCD_SERIAL.print(value); +} + +static void sendValueLine_P(PGM_P prefix, int value) { + send_P(prefix); + ANYCUBIC_LCD_SERIAL.print(value); + sendNewLine(); +} + +static void sendValueLine_P(PGM_P prefix, float value) { + send_P(prefix); + ANYCUBIC_LCD_SERIAL.print(value); + sendNewLine(); +} + +static int parseIntArgument(const char *buffer, char letterId) { + char *p = strchr(buffer, letterId); + if (!p) + return -1; + return atoi(p+1); +} + +static float parseFloatArgument(const char *buffer, char letterId) { + char *p = strchr(buffer, letterId); + if (!p) + return NAN; + return strtof(p+1, nullptr); +} + +static int mmToHundredths(float x) { + // Round + if (x >= 0) + x += 0.005f; + else + x -= 0.005f; + return (int)(x * 100.0f); +} + +static float hundredthsToMm(int x) { + return x / 100.0f; +} + +#define SEND_PGM(str) send_P(PSTR(str)) +#define SENDLINE_PGM(str) sendLine_P(PSTR(str)) +#define SENDVALUE_PGM(prefix, value) sendValue_P(PSTR(prefix), value) +#define SENDVALUELINE_PGM(prefix, value) sendValueLine_P(PSTR(prefix), value) + +namespace ExtUI { + + static void moveAxis(float delta, feedRate_t feedrate, axis_t axis) { + float pos = getAxisPosition_mm(axis); + pos += delta; + setAxisPosition_mm(pos, axis, feedrate); + } + + static void handleCmd(const char *rx) { + static FileList fileList; + static char selectedFileShortName[8+1+3+1]; + + if (rx[0] != 'A') { + SERIAL_ECHOPGM("Unexpected RX: "); + SERIAL_ECHOLN(rx); + + return; + } + + const int cmd = atoi(&rx[1]); + + // Uncomment for debugging RX + //if (cmd > 7 && cmd != 20) { + // SERIAL_ECHOPGM("RX: "); + // SERIAL_ECHOLN(rx); + //} + + switch (cmd) { + case 0: // Get Hotend Actual Temperature + SENDVALUELINE_PGM("A0V ", (int)getActualTemp_celsius(E0)); + break; + case 1: // Get Hotend Target Temperature + SENDVALUELINE_PGM("A1V ", (int)getTargetTemp_celsius(E0)); + break; + case 2: // Get Bed Actual Temperature + SENDVALUELINE_PGM("A2V ", (int)getActualTemp_celsius(BED)); + break; + case 3: // Get Bed Target Temperature + SENDVALUELINE_PGM("A3V ", (int)getTargetTemp_celsius(BED)); + break; + case 4: // Get Fan Speed + SENDVALUELINE_PGM("A4V ", (int)getTargetFan_percent(FAN0)); + break; + case 5: // Get Current Coordinates + SENDVALUE_PGM("A5V X: ", getAxisPosition_mm(X)); + SENDVALUE_PGM(" Y: ", getAxisPosition_mm(Y)); + SENDVALUE_PGM(" Z: ", getAxisPosition_mm(Z)); + sendNewLine(); + break; + case 6: // Get SD Card Print Status + if (isPrintingFromMedia()) + SENDVALUELINE_PGM("A6V ", (int)getProgress_percent()); + else + SENDLINE_PGM("A6V ---"); + break; + case 7: // Get Printing Time + if (isPrinting()) { + const int totalMinutes = getProgress_seconds_elapsed() / 60; + SENDVALUE_PGM("A7V ", (int)(totalMinutes/60)); + SENDVALUE_PGM(" H ", (int)(totalMinutes%60)); + SENDLINE_PGM(" M"); + } else { + SENDLINE_PGM("A7V 999:999"); + } + break; + case 8: // Get SD Card File List + if (isMediaInserted()) { + const int startIndex = parseIntArgument(rx, 'S'); + SENDLINE_PGM("FN "); + for (int i = 0, fileIndex = 0, numFiles = 0; i < (int)fileList.count() && numFiles < 4; i++) { + fileList.seek(i); + if (!fileList.isDir()) { + if (fileIndex >= startIndex) { + sendLine(fileList.shortFilename()); + sendLine(fileList.longFilename()); + numFiles++; + } + fileIndex++; + } + } + SENDLINE_PGM("END"); + } else { + SENDLINE_PGM("J02"); + } + break; + case 9: // Pause SD Card Print + if (isPrintingFromMedia()) { + pausePrint(); + is_printing_from_sd = false; + SENDLINE_PGM("J05"); + } else { + SENDLINE_PGM("J16"); // Print stopped + } + break; + case 10: // Resume SD Card Print + if (is_out_of_filament) { + is_out_of_filament = false; + // Filament change did eject the old filament automatically, + // now continue and load the new one + setUserConfirmed(); + SENDLINE_PGM("J04"); // Printing from SD card + } else if (isPrintingFromMediaPaused()) { + resumePrint(); + SENDLINE_PGM("J04"); // Printing from SD card + } + break; + case 11: // Stop SD Card Print + if (isPrintingFromMedia()) { + stopPrint(); + is_printing_from_sd = false; + SENDLINE_PGM("J16"); // Print stopped + } + break; + //case 12: // Kill + // break; + case 13: // Select File + if (!isPrinting()) { + // Store selected file name + char *p = strchr(rx, ' '); + if (p != nullptr && strlen(p+1) < sizeof(selectedFileShortName)) { + strcpy(selectedFileShortName, p+1); + SENDLINE_PGM("J20"); // Open succeeded + } + else + SENDLINE_PGM("J21"); // Open failed + } + break; + case 14: // Start Print + if (!isPrinting() && strcmp(selectedFileShortName, "") != 0) { + printFile(selectedFileShortName); + is_printing_from_sd = true; + SENDLINE_PGM("J04"); // Printing from SD card + } + break; + case 15: // Resume from power outage + // This is not supported, just report print as completed + SENDLINE_PGM("J16"); // Print stopped + break; + case 16: // Set Hotend Target Temperature + { + int temp = parseIntArgument(rx, 'S'); + if (temp >= 0) + setTargetTemp_celsius(temp, E0); + } + break; + case 17: // Set Bed Target Temperature + { + int temp = parseIntArgument(rx, 'S'); + if (temp >= 0) + setTargetTemp_celsius(temp, BED); + } + break; + case 18: // Set Fan Speed + { + int temp = parseIntArgument(rx, 'S'); + if (temp >= 0) + setTargetFan_percent(temp, FAN0); + } + break; + case 19: // Disable Motors + injectCommands_P(PSTR("M84")); + break; + case 20: // Get/Set Printing Speed + { + int newPerc = parseIntArgument(rx, 'S'); + if (newPerc >= 0) + setFeedrate_percent(newPerc); + else + SENDVALUELINE_PGM("A20V ", (int)getFeedrate_percent()); + } + break; + case 21: // Home axes + if (!isPrinting()) { + const bool hasX = strchr(rx, 'X') != nullptr, + hasY = strchr(rx, 'Y') != nullptr, + hasZ = strchr(rx, 'Z') != nullptr, + hasC = strchr(rx, 'C') != nullptr; + if (hasX || hasY || hasZ) { + if (hasX) injectCommands_P(PSTR("G28 X")); + if (hasY) injectCommands_P(PSTR("G28 Y")); + if (hasZ) injectCommands_P(PSTR("G28 Z")); + } else if (hasC) { + injectCommands_P(PSTR("G28")); + } + } + break; + case 22: // Move axes + if (!isPrinting()) { + const int feedrate = parseIntArgument(rx, 'F') / 60; + float delta; + if (!isnan(delta = parseFloatArgument(rx, 'X'))) + moveAxis(delta, feedrate, X); + else if (!isnan(delta = parseFloatArgument(rx, 'Y'))) + moveAxis(delta, feedrate, Y); + else if (!isnan(delta = parseFloatArgument(rx, 'Z'))) + moveAxis(delta, feedrate, Z); + } + break; + case 23: // Preheat PLA + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); + SENDLINE_PGM("OK"); + break; + case 24: // Preheat ABS + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); + SENDLINE_PGM("OK"); + break; + case 25: // Cool down + setTargetTemp_celsius(0, E0); + setTargetTemp_celsius(0, BED); + SENDLINE_PGM("J12"); + break; + case 26: // Refresh SD Card + fileList.refresh(); + break; + //case 27: // Adjust Servo Angles + // break; + //case 28: // Filament Test + // break; + case 29: // Get Bed Autolevel Grid + { + int x = parseIntArgument(rx, 'X'), + y = parseIntArgument(rx, 'Y'); + if (x != -1 && y != -1) { + xy_uint8_t coord; + coord.set(x, y); + const int value = mmToHundredths(getMeshPoint(coord)); + SENDVALUELINE_PGM("A29V ", value); + } + } + break; + case 30: // Autolevel + if (strchr(rx, 'S')) { // Autoleveling started by clicking "PROBE" and then "OK" + // Note: + // We check for completion by monitoring the command queue. + // Since it will become empty *while* processing the last injected command, + // we enqueue an extra 10ms delay so we can the determine when all the others + // have completed. + if (isMachineHomed()) + injectCommands_P(PSTR("G29\nG4 P10")); + else + injectCommands_P(PSTR("G28\nG29\nG4 P10")); + is_auto_leveling = true; + } else { // Entering Autoleveling screen + if (isPrinting()) + SENDLINE_PGM("J24"); // Disallow autoleveling + else + SENDLINE_PGM("J26"); // Allow autoleveling + } + break; + case 31: // Set Bed Autolevel Z offset + if (strchr(rx, 'G')) { // Get + SENDVALUELINE_PGM("A31V ", getZOffset_mm()); + } else if (strchr(rx, 'S')) { // Set + float delta = parseFloatArgument(rx, 'S'); + delta = constrain(delta, -1.0, 1.0); + setZOffset_mm(getZOffset_mm() + delta); + + SENDVALUELINE_PGM("A31V ", getZOffset_mm()); + } else if (strchr(rx, 'D')) { // Save + injectCommands_P(PSTR("M500")); + } + break; + //case 32: // ? + // break; + case 33: // Get Version Info + SENDLINE_PGM("J33 " SHORT_BUILD_VERSION); + break; + case 34: // Set Bed Autolevel Grid + { + int x = parseIntArgument(rx, 'X'), + y = parseIntArgument(rx, 'Y'), + v = parseIntArgument(rx, 'V'); + if (x != -1 && y != -1 && v != -1) { // Set new value + float value = hundredthsToMm(v); + value = constrain(value, -10, 10); + + xy_uint8_t coord; + coord.set(x, y); + setMeshPoint(coord, value); + } else if (strchr(rx, 'S')) { // Save (apply new values) + injectCommands_P(PSTR("M500")); + } else if (strchr(rx, 'C')) { // Cancel (discard new values) + injectCommands_P(PSTR("M501")); + } + } + break; + } + } + + #define RX_LEN_MAX 63 + static void parseSerialRx() { + static char rxBuffer[RX_LEN_MAX+1]; + static uint8_t rxLen = 0; + + while (ANYCUBIC_LCD_SERIAL.available()) { + const char c = ANYCUBIC_LCD_SERIAL.read(); + switch (c) { + case '\r': case '\n': + if (rxLen > 0 && rxLen <= RX_LEN_MAX) { + rxBuffer[rxLen] = '\0'; // Terminate string + handleCmd(rxBuffer); + } + rxLen = 0; + break; + default: + if (rxLen < RX_LEN_MAX) + rxBuffer[rxLen++] = c; + else { + rxLen = 0xFF; // Overrun + SERIAL_ECHOPGM("Warning: dropping long received line"); + } + break; + } + } + } + + static void detectPrintFromSdCompletion() { + // Note: printFile() queues some commands that actually start the print, so isPrintingFromMedia() + // initially returns false + if (is_printing_from_sd && !commandsInQueue() && !isPrintingFromMedia()) { + is_printing_from_sd = false; + SENDLINE_PGM("J14"); // Print done + } + } + + static void detectAutolevelingCompletion() { + if (is_auto_leveling && !commandsInQueue()) { + is_auto_leveling = false; + injectCommands_P(PSTR("M500")); + SENDLINE_PGM("J25"); // Autoleveling done + } + } + + void onStartup() { + ANYCUBIC_LCD_SERIAL.begin(115200); + sendNewLine(); + SENDLINE_PGM("J17"); // Reset + delay_ms(10); + SENDLINE_PGM("J12"); // Ready + } + + void onIdle() { + parseSerialRx(); + detectAutolevelingCompletion(); + detectPrintFromSdCompletion(); + } + + void onPrinterKilled(PGM_P const error, PGM_P const component) { } + + void onMediaInserted() { + SENDLINE_PGM("J00"); // SD Inserted + } + + void onMediaError() { } + + void onMediaRemoved() { + SENDLINE_PGM("J01"); // SD Removed + } + + void onPlayTone(const uint16_t frequency, const uint16_t duration) { + tone(BEEPER_PIN, frequency, duration); + } + + void onPrintTimerStarted() { } + + void onPrintTimerPaused() { } + + void onPrintTimerStopped() { } + + void onFilamentRunout(const extruder_t extruder) { + is_out_of_filament = true; + SENDLINE_PGM("J23"); // Filament runout + SENDLINE_PGM("J18"); // Print paused + // Note: printer will unload filament automatically + } + + void onUserConfirmRequired(const char * const msg) { } + + void onStatusChanged(const char * const msg) { } + + void onFactoryReset() { } + + void onStoreSettings(char *buff) { } + + void onLoadSettings(const char *buff) { } + + void onConfigurationStoreWritten(bool success) { } + + void onConfigurationStoreRead(bool success) { } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { } + + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume() { } + #endif + + #if HAS_PID_HEATING + void onPidTuning(const result_t rst) { } + #endif +} + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp similarity index 95% rename from Marlin/src/lcd/extui_anycubic_tft.cpp rename to Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp index 6383ee7b5305..360ea75de8ea 100644 --- a/Marlin/src/lcd/extui_anycubic_tft.cpp +++ b/Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp @@ -21,14 +21,14 @@ */ /** - * extui_anycubic_tft.cpp + * extui_anycubic_i3mega_lcd.cpp */ #include "../inc/MarlinConfigPre.h" -#if BOTH(ANYCUBIC_TFT_MODEL, EXTENSIBLE_UI) +#if ENABLED(ANYCUBIC_LCD_I3MEGA) -#include "extui/lib/anycubic/anycubic_tft.h" +#include "extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h" #include "extui/ui_api.h" #include // for the ::tone() call @@ -101,4 +101,4 @@ namespace ExtUI { #endif } -#endif // ANYCUBIC_TFT_MODEL && EXTENSIBLE_UI +#endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index 6382d3af51ad..708f8fa26cd6 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -27,49 +27,8 @@ #define BOARD_INFO_NAME "Anycubic RAMPS 1.4" -// -// Servos -// -#if MB(TRIGORILLA_14_11) - #define SERVO0_PIN 5 - #define SERVO1_PIN 4 - #define SERVO2_PIN 11 - #define SERVO3_PIN 6 -#endif - -// -// Limit Switches -// -//#define ANYCUBIC_4_MAX_PRO_ENDSTOPS - -#define X_MIN_PIN 3 - -#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) - #define X_MAX_PIN 43 -#else - #define X_MAX_PIN 43 -#endif +// Board labeled pins: -#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) - #define Y_STOP_PIN 19 -#else - #define Y_STOP_PIN 42 -#endif - -#define Z_STOP_PIN 18 - -// -// Z Probe (when not Z_MIN_PIN) -// -#define Z_MIN_PROBE_PIN 2 - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 19 -#endif - -// -// Heaters / Fans -// #define TG_HEATER_BED_PIN 8 #define TG_HEATER_0_PIN 10 #define TG_HEATER_1_PIN 45 // Anycubic Kossel: Unused @@ -78,10 +37,15 @@ #define TG_FAN1_PIN 7 // Anycubic Kossel: Unused #define TG_FAN2_PIN 44 // Anycubic Kossel: Hotend fan -#define CONTROLLER_FAN_PIN TG_FAN1_PIN - -#define BEEPER_PIN 31 -#define SD_DETECT_PIN 49 +// +// Servos +// +#if MB(TRIGORILLA_14_11) + #define SERVO0_PIN 5 + #define SERVO1_PIN 4 + #define SERVO2_PIN 11 + #define SERVO3_PIN 6 +#endif // Remap MOSFET pins to common usages: @@ -100,7 +64,11 @@ #elif TEMP_SENSOR_BED // EFB (Anycubic Kossel default) #define RAMPS_D9_PIN TG_FAN0_PIN - #define RAMPS_D8_PIN TG_HEATER_BED_PIN + #if ENABLED(ANYCUBIC_CHIRON) + #define RAMPS_D8_PIN TG_HEATER_1_PIN // Heated bed is connected to HEATER1 output + #else + #define RAMPS_D8_PIN TG_HEATER_BED_PIN + #endif #else // EFF #define RAMPS_D9_PIN TG_FAN1_PIN @@ -116,6 +84,44 @@ #define E0_AUTO_FAN_PIN TG_FAN2_PIN // Used in Anycubic Kossel example config #endif +#if ENABLED(ANYCUBIC_I3MEGA) + #define CONTROLLER_FAN_PIN TG_FAN1_PIN +#endif + +// +// AnyCubic standard pin mappings +// +// On most printers, endstops are NOT all wired to the appropriate pins on the Trigorilla board. +// For instance, on a Chiron, Y axis goes to an aux connector. +// There are also other things that have been wired in creative ways. +// To enable PIN definitions for a specific printer model, #define the appropriate symbol after +// MOTHERBOARD in Configuration.h + +// +// Limit Switches +// +//#define ANYCUBIC_4_MAX_PRO_ENDSTOPS + +#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) + #define X_MAX_PIN 43 + #define Y_STOP_PIN 19 +#elif EITHER(ANYCUBIC_CHIRON, ANYCUBIC_I3MEGA) + #define Y_STOP_PIN 42 + #define Z2_MIN_PIN 43 + #ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 2 + #endif + #ifndef FIL_RUNOUT_PIN + #if ENABLED(ANYCUBIC_CHIRON) + #define FIL_RUNOUT_PIN 33 + #else + #define FIL_RUNOUT_PIN 19 + #endif + #endif + #define BEEPER_PIN 31 + #define SD_DETECT_PIN 49 +#endif + #include "pins_RAMPS.h" // diff --git a/platformio.ini b/platformio.ini index 450fffcc005f..029ce658819b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -66,7 +66,7 @@ HAS_GRAPHICAL_TFT = src_filter=+ HAS_LCD_MENU = src_filter=+ HAS_DGUS_LCD = src_filter=+ TOUCH_UI_FTDI_EVE = src_filter=+ -ANYCUBIC_TFT_MODEL = src_filter=+ +ANYCUBIC_LCD_I3MEGA = src_filter=+ USB_FLASH_DRIVE_SUPPORT = src_filter=+ AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ + MESH_BED_LEVELING = src_filter=+ + From 99ba866d8d3c9abc16558ca12ba34efb9a7922e5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 6 Aug 2020 08:14:00 -0500 Subject: [PATCH 293/483] Optimize G-code / feature dependencies (#18919) --- Marlin/src/MarlinCore.cpp | 6 +- ...{binary_protocol.cpp => binary_stream.cpp} | 4 +- .../{binary_protocol.h => binary_stream.h} | 0 Marlin/src/feature/caselight.cpp | 48 +-- Marlin/src/feature/caselight.h | 26 +- Marlin/src/feature/e_parser.cpp | 2 +- Marlin/src/feature/e_parser.h | 2 +- Marlin/src/gcode/feature/caselight/M355.cpp | 76 +++-- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 +- Marlin/src/gcode/host/M115.cpp | 4 +- Marlin/src/gcode/queue.cpp | 5 +- Marlin/src/inc/Conditionals_LCD.h | 15 - Marlin/src/inc/Conditionals_post.h | 5 +- .../screens/advanced_settings_menu.cpp | 8 +- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/screens.h | 4 +- Marlin/src/lcd/extui/ui_api.cpp | 14 +- Marlin/src/lcd/menu/menu_led.cpp | 8 +- .../libs/heatshrink/heatshrink_decoder.cpp | 31 +- .../src/libs/heatshrink/heatshrink_decoder.h | 27 +- Marlin/src/module/configuration_store.cpp | 12 +- .../PlatformIO/scripts/common-dependencies.h | 88 +++++ .../PlatformIO/scripts/common-dependencies.py | 110 +++--- platformio.ini | 316 ++++++++++++++++-- 26 files changed, 632 insertions(+), 189 deletions(-) rename Marlin/src/feature/{binary_protocol.cpp => binary_stream.cpp} (95%) rename Marlin/src/feature/{binary_protocol.h => binary_stream.h} (100%) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 74e15250e6ff..8c5966f7442c 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -189,7 +189,7 @@ #include "feature/leds/tempstat.h" #endif -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) #include "feature/caselight.h" #endif @@ -1082,11 +1082,11 @@ void setup() { OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // OFF #endif - #if HAS_CASE_LIGHT + #if ENABLED(CASE_LIGHT_ENABLE) #if DISABLED(CASE_LIGHT_USE_NEOPIXEL) if (PWM_PIN(CASE_LIGHT_PIN)) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN); #endif - SETUP_RUN(update_case_light()); + SETUP_RUN(caselight.update_brightness()); #endif #if ENABLED(MK2_MULTIPLEXER) diff --git a/Marlin/src/feature/binary_protocol.cpp b/Marlin/src/feature/binary_stream.cpp similarity index 95% rename from Marlin/src/feature/binary_protocol.cpp rename to Marlin/src/feature/binary_stream.cpp index 5884a05f427e..81e110339bda 100644 --- a/Marlin/src/feature/binary_protocol.cpp +++ b/Marlin/src/feature/binary_stream.cpp @@ -25,7 +25,7 @@ #if ENABLED(BINARY_FILE_TRANSFER) #include "../sd/cardreader.h" -#include "binary_protocol.h" +#include "binary_stream.h" char* SDFileTransferProtocol::Packet::Open::data = nullptr; size_t SDFileTransferProtocol::data_waiting, SDFileTransferProtocol::transfer_timeout, SDFileTransferProtocol::idle_timeout; @@ -33,4 +33,4 @@ bool SDFileTransferProtocol::transfer_active, SDFileTransferProtocol::dummy_tran BinaryStream binaryStream[NUM_SERIAL]; -#endif // BINARY_FILE_TRANSFER +#endif diff --git a/Marlin/src/feature/binary_protocol.h b/Marlin/src/feature/binary_stream.h similarity index 100% rename from Marlin/src/feature/binary_protocol.h rename to Marlin/src/feature/binary_stream.h diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index 4287a0f26242..8a128bb12def 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -22,14 +22,17 @@ #include "../inc/MarlinConfig.h" -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) -uint8_t case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; -bool case_light_on = CASE_LIGHT_DEFAULT_ON; +#include "caselight.h" + +CaseLight caselight; + +uint8_t CaseLight::brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; +bool CaseLight::on = CASE_LIGHT_DEFAULT_ON; #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - #include "leds/leds.h" - LEDColor case_light_color = + LEDColor CaseLight::color = #ifdef CASE_LIGHT_NEOPIXEL_COLOR CASE_LIGHT_NEOPIXEL_COLOR #else @@ -38,34 +41,33 @@ bool case_light_on = CASE_LIGHT_DEFAULT_ON; ; #endif -/** - * The following are needed because ARM chips ignore a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that - * are directly controlled by the PWM module. In order to turn them off the brightness level needs to be - * set to off. Since we can't use the pwm register to save the last brightness level we need a variable - * to save it. - */ -uint8_t case_light_brightness_sav; // saves brighness info so can restore when "M355 S1" received -bool case_light_arg_flag; // flag to notify if S or P argument type - #ifndef INVERT_CASE_LIGHT #define INVERT_CASE_LIGHT false #endif -void update_case_light() { +void CaseLight::update(const bool sflag) { + /** + * The brightness_sav (and sflag) is needed because ARM chips ignore + * a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that are directly + * controlled by the PWM module. In order to turn them off the brightness + * level needs to be set to OFF. Since we can't use the PWM register to + * save the last brightness level we need a variable to save it. + */ + static uint8_t brightness_sav; // Save brightness info for restore on "M355 S1" - if (!(case_light_arg_flag && !case_light_on)) - case_light_brightness_sav = case_light_brightness; // save brightness except if this is an S0 argument - if (case_light_arg_flag && case_light_on) - case_light_brightness = case_light_brightness_sav; // restore last brightens if this is an S1 argument + if (on || !sflag) + brightness_sav = brightness; // Save brightness except for M355 S0 + if (sflag && on) + brightness = brightness_sav; // Restore last brightness for M355 S1 #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) || DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - const uint8_t i = case_light_on ? case_light_brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; + const uint8_t i = on ? brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; #endif #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) leds.set_color( - MakeLEDColor(case_light_color.r, case_light_color.g, case_light_color.b, case_light_color.w, n10ct), + MakeLEDColor(color.r, color.g, color.b, color.w, n10ct), false ); @@ -83,11 +85,11 @@ void update_case_light() { else #endif { - const bool s = case_light_on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; + const bool s = on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); } #endif // !CASE_LIGHT_USE_NEOPIXEL } -#endif // HAS_CASE_LIGHT +#endif // CASE_LIGHT_ENABLE diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index ff01b1a67da3..9d1e76da26ba 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -21,9 +21,25 @@ */ #pragma once -extern uint8_t case_light_brightness; -extern bool case_light_on; -extern uint8_t case_light_brightness_sav; // saves brighness info when case_light_on is false -extern bool case_light_arg_flag; // flag to notify if S or P argument type +#include "../inc/MarlinConfigPre.h" -void update_case_light(); +#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #include "leds/leds.h" +#endif + +class CaseLight { +public: + static uint8_t brightness; + static bool on; + + static void update(const bool sflag); + static inline void update_brightness() { update(false); } + static inline void update_enabled() { update(true); } + +private: + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + static LEDColor color; + #endif +}; + +extern CaseLight caselight; diff --git a/Marlin/src/feature/e_parser.cpp b/Marlin/src/feature/e_parser.cpp index 85b1845a6451..a4c2d0dac92c 100644 --- a/Marlin/src/feature/e_parser.cpp +++ b/Marlin/src/feature/e_parser.cpp @@ -21,7 +21,7 @@ */ /** - * emergency_parser.cpp - Intercept special commands directly in the serial stream + * e_parser.cpp - Intercept special commands directly in the serial stream */ #include "../inc/MarlinConfigPre.h" diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index 73e459680edf..8d11463ecdc2 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -22,7 +22,7 @@ #pragma once /** - * emergency_parser.h - Intercept special commands directly in the serial stream + * e_parser.h - Intercept special commands directly in the serial stream */ #include "../inc/MarlinConfigPre.h" diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index 4d2acd189c6d..bb6b57f666e3 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -20,45 +20,47 @@ * */ -#include "../../gcode.h" - #include "../../../inc/MarlinConfig.h" -#if HAS_CASE_LIGHT - #include "../../../feature/caselight.h" +#if ENABLED(CASE_LIGHT_ENABLE) - /** - * M355: Turn case light on/off and set brightness - * - * P Set case light brightness (PWM pin required - ignored otherwise) - * - * S Set case light on/off - * - * When S turns on the light on a PWM pin then the current brightness level is used/restored - * - * M355 P200 S0 turns off the light & sets the brightness level - * M355 S1 turns on the light with a brightness of 200 (assuming a PWM pin) - */ - void GcodeSuite::M355() { - uint8_t args = 0; - if (parser.seenval('P')) { - ++args, case_light_brightness = parser.value_byte(); - case_light_arg_flag = false; - } - if (parser.seenval('S')) { - ++args, case_light_on = parser.value_bool(); - case_light_arg_flag = true; - } - if (args) update_case_light(); +#include "../../../feature/caselight.h" +#include "../../gcode.h" - // always report case light status - SERIAL_ECHO_START(); - if (!case_light_on) { - SERIAL_ECHOLNPGM("Case light: off"); - } - else { - if (!PWM_PIN(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM("Case light: on"); - else SERIAL_ECHOLNPAIR("Case light: ", case_light_brightness); - } +/** + * M355: Turn case light on/off and set brightness + * + * P Set case light brightness (PWM pin required - ignored otherwise) + * + * S Set case light on/off + * + * When S turns on the light on a PWM pin then the current brightness level is used/restored + * + * M355 P200 S0 turns off the light & sets the brightness level + * M355 S1 turns on the light with a brightness of 200 (assuming a PWM pin) + */ +void GcodeSuite::M355() { + bool didset = false; + if (parser.seenval('P')) { + didset = true; + caselight.brightness = parser.value_byte(); + } + const bool sflag = parser.seenval('S'); + if (sflag) { + didset = true; + caselight.on = parser.value_bool(); } -#endif // HAS_CASE_LIGHT + if (didset) caselight.update(sflag); + + // Always report case light status + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Case light: "); + if (!caselight.on) + SERIAL_ECHOLNPGM(STR_OFF); + else { + if (!PWM_PIN(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM(STR_ON); + else SERIAL_ECHOLN(int(caselight.brightness)); + } +} + +#endif // CASE_LIGHT_ENABLE diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 7c1083f7f70f..f1692ee807c6 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -842,7 +842,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 351: M351(); break; // M351: Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low. #endif - #if HAS_CASE_LIGHT + #if ENABLED(CASE_LIGHT_ENABLE) case 355: M355(); break; // M355: Set case light brightness #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7c469458cd3c..7e89e809d006 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -702,7 +702,7 @@ class GcodeSuite { static void M351(); #endif - TERN_(HAS_CASE_LIGHT, static void M355()); + TERN_(CASE_LIGHT_ENABLE, static void M355()); TERN_(REPETIER_GCODE_M360, static void M360()); @@ -845,7 +845,7 @@ class GcodeSuite { TERN_(MAGNETIC_PARKING_EXTRUDER, static void M951()); TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); - + TERN_(PLATFORM_M997_SUPPORT, static void M997()); static void M999(); diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index c3ff9c8c1a9c..cd64c563f9fb 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -93,8 +93,8 @@ void GcodeSuite::M115() { cap_line(PSTR("SOFTWARE_POWER"), ENABLED(PSU_CONTROL)); // TOGGLE_LIGHTS (M355) - cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(HAS_CASE_LIGHT)); - cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(HAS_CASE_LIGHT, PWM_PIN(CASE_LIGHT_PIN))); + cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(CASE_LIGHT_ENABLE)); + cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, PWM_PIN(CASE_LIGHT_PIN))); // EMERGENCY_PARSER (M108, M112, M410, M876) cap_line(PSTR("EMERGENCY_PARSER"), ENABLED(EMERGENCY_PARSER)); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index c77db0bf2a1f..b9169d90e1c7 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -40,7 +40,7 @@ GCodeQueue queue; #endif #if ENABLED(BINARY_FILE_TRANSFER) - #include "../feature/binary_protocol.h" + #include "../feature/binary_stream.h" #endif #if ENABLED(POWER_LOSS_RECOVERY) @@ -628,11 +628,10 @@ void GCodeQueue::advance() { #if ENABLED(SERIAL_STATS_DROPPED_RX) SERIAL_ECHOLNPAIR("Dropped bytes: ", MYSERIAL0.dropped()); #endif - #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) SERIAL_ECHOLNPAIR("Max RX Queue Size: ", MYSERIAL0.rxMaxEnqueued()); #endif - #endif // !defined(__AVR__) || !defined(USBCON) + #endif ok_to_send(); } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 4ffd6fddcc6f..cabca762aba4 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -430,14 +430,6 @@ #endif #endif -#if ENABLED(SR_LCD_3W_NL) - // Feature checks for SR_LCD_3W_NL -#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) - #define USES_LIQUIDTWI2 -#elif ANY(HAS_CHARACTER_LCD, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) - #define USES_LIQUIDCRYSTAL -#endif - #if ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS) #define HAS_LCD_MENU 1 #endif @@ -774,10 +766,3 @@ #ifndef EXTRUDE_MINTEMP #define EXTRUDE_MINTEMP 170 #endif - -/** - * To check if we need the folder src/features/leds - */ -#if ANY(TEMP_STAT_LEDS, HAS_COLOR_LEDS, HAS_CASE_LIGHT, PRINTER_EVENT_LEDS, LED_BACKLIGHT_TIMEOUT, PCA9632_BUZZER, LED_CONTROL_MENU, NEOPIXEL_LED) - #define HAS_LED_FEATURE 1 -#endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index a93e0527bf36..556d57b66966 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1944,9 +1944,6 @@ #if PIN_EXISTS(PHOTOGRAPH) #define HAS_PHOTOGRAPH 1 #endif -#if PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE) - #define HAS_CASE_LIGHT 1 -#endif // Digital control #if PIN_EXISTS(STEPPER_RESET) @@ -2223,7 +2220,7 @@ /** * MIN/MAX case light PWM scaling */ -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) #ifndef CASE_LIGHT_MAX_PWM #define CASE_LIGHT_MAX_PWM 255 #elif !WITHIN(CASE_LIGHT_MAX_PWM, 1, 255) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp index 12bfe5e68dbf..35040734b472 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -38,7 +38,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { } #ifdef TOUCH_UI_PORTRAIT - #if EITHER(HAS_CASE_LIGHT, SENSORLESS_HOMING) + #if EITHER(CASE_LIGHT_ENABLE, SENSORLESS_HOMING) #define GRID_ROWS 9 #else #define GRID_ROWS 8 @@ -59,7 +59,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { #define BACKLASH_POS BTN_POS(2,7), BTN_SIZE(1,1) #define CASE_LIGHT_POS BTN_POS(1,8), BTN_SIZE(1,1) #define TMC_HOMING_THRS_POS BTN_POS(2,8), BTN_SIZE(1,1) - #if EITHER(HAS_CASE_LIGHT, SENSORLESS_HOMING) + #if EITHER(CASE_LIGHT_ENABLE, SENSORLESS_HOMING) #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) #else #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) @@ -91,7 +91,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { .font(Theme::font_medium) .enabled(ENABLED(HAS_BED_PROBE)) .tag(2) .button( ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) - .enabled(ENABLED(HAS_CASE_LIGHT)) + .enabled(ENABLED(CASE_LIGHT_ENABLE)) .tag(16).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) .tag(3) .button( STEPS_PER_MM_POS, GET_TEXT_F(MSG_STEPS_PER_MM)) .enabled(ENABLED(HAS_TRINAMIC_CONFIG)) @@ -149,7 +149,7 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { case 14: GOTO_SCREEN(StepperBumpSensitivityScreen); break; #endif case 15: GOTO_SCREEN(DisplayTuningScreen); break; - #if HAS_CASE_LIGHT + #if ENABLED(CASE_LIGHT_ENABLE) case 16: GOTO_SCREEN(CaseLightScreen); break; #endif default: return false; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index 12cb8d0891bb..dfb23daa528f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -137,7 +137,7 @@ bool MainMenu::onTouchEnd(uint8_t tag) { case 4: GOTO_SCREEN(MoveAxisScreen); break; case 5: injectCommands_P(PSTR("M84")); break; case 6: GOTO_SCREEN(TemperatureScreen); break; - #if BOTH(TOUCH_UI_COCOA_PRESS, HAS_CASE_LIGHT) + #if BOTH(TOUCH_UI_COCOA_PRESS, CASE_LIGHT_ENABLE) case 7: GOTO_SCREEN(CaseLightScreen); break; #else case 7: GOTO_SCREEN(ChangeFilamentScreen); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 82d1831e62b1..01438aeb947f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -83,7 +83,7 @@ SCREEN_TABLE { #else DECL_SCREEN(JerkScreen), #endif -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) DECL_SCREEN(CaseLightScreen), #endif #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 276727fc466b..92e6b230f7ef 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -63,7 +63,7 @@ enum { #else JERK_SCREEN_CACHE, #endif -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) CASE_LIGHT_SCREEN_CACHE, #endif #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) @@ -579,7 +579,7 @@ class DefaultAccelerationScreen : public BaseNumericAdjustmentScreen, public Cac }; #endif -#if HAS_CASE_LIGHT +#if ENABLED(CASE_LIGHT_ENABLE) class CaseLightScreen : public BaseNumericAdjustmentScreen, public CachedScreen { public: static void onRedraw(draw_mode_t); diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 451aa1f12a9b..c19275449507 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -599,18 +599,18 @@ namespace ExtUI { #endif #endif - #if HAS_CASE_LIGHT - bool getCaseLightState() { return case_light_on; } + #if ENABLED(CASE_LIGHT_ENABLE) + bool getCaseLightState() { return caselight.on; } void setCaseLightState(const bool value) { - case_light_on = value; - update_case_light(); + caselight.on = value; + caselight.update_enabled(); } #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - float getCaseLightBrightness_percent() { return ui8_to_percent(case_light_brightness); } + float getCaseLightBrightness_percent() { return ui8_to_percent(caselight.brightness); } void setCaseLightBrightness_percent(const float value) { - case_light_brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); - update_case_light(); + caselight.brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); + caselight.update_brightness(); } #endif #endif diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 2719b3d8501c..ac56ca0e524c 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -76,8 +76,8 @@ void menu_case_light() { START_MENU(); BACK_ITEM(MSG_CONFIGURATION); - EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true); - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); + EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &caselight.brightness, 0, 255, caselight.update_brightness, true); + EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); END_MENU(); } #endif @@ -97,7 +97,7 @@ void menu_led() { #endif SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom); #endif - // + // // Set Case light on/off/brightness // #if ENABLED(CASE_LIGHT_MENU) @@ -106,7 +106,7 @@ void menu_led() { SUBMENU(MSG_CASE_LIGHT, menu_case_light); else #endif - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); + EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); #endif END_MENU(); } diff --git a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp index 4684af975e80..3f0f828cd78b 100644 --- a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp +++ b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp @@ -1,9 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(BINARY_FILE_TRANSFER) + /** * libs/heatshrink/heatshrink_decoder.cpp */ +#include "heatshrink_decoder.h" + #include #include -#include "heatshrink_decoder.h" #pragma GCC optimize ("O3") @@ -353,3 +380,5 @@ static void push_byte(heatshrink_decoder *hsd, output_info *oi, uint8_t byte) { oi->buf[(*oi->output_size)++] = byte; (void)hsd; } + +#endif // BINARY_FILE_TRANSFER diff --git a/Marlin/src/libs/heatshrink/heatshrink_decoder.h b/Marlin/src/libs/heatshrink/heatshrink_decoder.h index 11fafe617fff..eb113aa5e568 100644 --- a/Marlin/src/libs/heatshrink/heatshrink_decoder.h +++ b/Marlin/src/libs/heatshrink/heatshrink_decoder.h @@ -1,13 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + /** * libs/heatshrink/heatshrink_decoder.h */ #pragma once -#include -#include #include "heatshrink_common.h" #include "heatshrink_config.h" +#include +#include + typedef enum { HSDR_SINK_OK, /* data sunk, ready to poll */ HSDR_SINK_FULL, /* out of space in internal buffer */ diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp index b9f44eb6f817..28e15cfeb0d9 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/configuration_store.cpp @@ -404,7 +404,7 @@ typedef struct SettingsDataStruct { // HAS_CASE_LIGHT_BRIGHTNESS // #if HAS_CASE_LIGHT_BRIGHTNESS - uint8_t case_light_brightness; + uint8_t caselight_brightness; // M355 P #endif // @@ -465,7 +465,7 @@ void MarlinSettings::postprocess() { TERN_(HAS_LINEAR_E_JERK, planner.recalculate_max_e_jerk()); - TERN_(HAS_CASE_LIGHT_BRIGHTNESS, update_case_light()); + TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.update_brightness()); // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm // and init stepper.count[], planner.position[] with current_position @@ -1342,7 +1342,7 @@ void MarlinSettings::postprocess() { // Case Light Brightness // #if HAS_CASE_LIGHT_BRIGHTNESS - EEPROM_WRITE(case_light_brightness); + EEPROM_WRITE(caselight.brightness); #endif // @@ -2181,8 +2181,8 @@ void MarlinSettings::postprocess() { // Case Light Brightness // #if HAS_CASE_LIGHT_BRIGHTNESS - _FIELD_TEST(case_light_brightness); - EEPROM_READ(case_light_brightness); + _FIELD_TEST(caselight_brightness); + EEPROM_READ(caselight.brightness); #endif // @@ -2493,7 +2493,7 @@ void MarlinSettings::reset() { // // Case Light Brightness // - TERN_(HAS_CASE_LIGHT_BRIGHTNESS, case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); + TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); // // TOUCH_SCREEN_CALIBRATION diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index a1f8b095add7..d18cb8c28135 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -65,3 +65,91 @@ #ifdef HAL_PATH #include HAL_PATH(../../../../Marlin/src/HAL, inc/Conditionals_post.h) #endif + +// +// Conditionals only used for [features] +// +#if ENABLED(SR_LCD_3W_NL) + // Feature checks for SR_LCD_3W_NL +#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) + #define USES_LIQUIDTWI2 +#elif ANY(HAS_CHARACTER_LCD, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) + #define USES_LIQUIDCRYSTAL +#endif + +#if BOTH(ANYCUBIC_LCD_I3MEGA, EXTENSIBLE_UI) + #define HAS_ANYCUBIC_TFT_EXTUI +#endif + +#if SAVED_POSITIONS + #define HAS_SAVED_POSITIONS +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) && DISABLED(EMERGENCY_PARSER) + #define HAS_GCODE_M876 +#endif + +#if PREHEAT_COUNT + #define HAS_PREHEAT_COUNT +#endif + +#if EXTRUDERS + #define HAS_EXTRUDERS + #if EXTRUDERS > 1 + #define HAS_MULTI_EXTRUDER + #endif +#endif + +#if HAS_LCD_MENU + #if ENABLED(BACKLASH_GCODE) + #define HAS_MENU_BACKLASH + #endif + #if ENABLED(LEVEL_BED_CORNERS) + #define HAS_MENU_BED_CORNERS + #endif + #if ENABLED(CANCEL_OBJECTS) + #define HAS_MENU_CANCELOBJECT + #endif + #if ENABLED(CUSTOM_USER_MENUS) + #define HAS_MENU_CUSTOM + #endif + #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) + #define HAS_MENU_DELTA_CALIBRATE + #endif + #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) + #define HAS_MENU_LED + #endif + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #define HAS_MENU_FILAMENT + #endif + #if ENABLED(SDSUPPORT) + #define HAS_MENU_MEDIA + #endif + #if ENABLED(MIXING_EXTRUDER) + #define HAS_MENU_MIXER + #endif + #if ENABLED(POWER_LOSS_RECOVERY) + #define HAS_MENU_JOB_RECOVERY + #endif + #if HAS_POWER_MONITOR + #define HAS_MENU_POWER_MONITOR + #endif + #if HAS_CUTTER + #define HAS_MENU_CUTTER + #endif + #if HAS_TEMPERATURE + #define HAS_MENU_TEMPERATURE + #endif + #if ENABLED(MMU2_MENUS) + #define HAS_MENU_MMU2 + #endif + #if HAS_TRINAMIC_CONFIG + #define HAS_MENU_TMC + #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + #define HAS_MENU_TOUCH_SCREEN + #endif + #if ENABLED(AUTO_BED_LEVELING_UBL) + #define HAS_MENU_UBL + #endif +#endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 37efaa37436f..ec708b116a89 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -6,41 +6,56 @@ import os import re try: - import configparser + import configparser except ImportError: - import ConfigParser as configparser + import ConfigParser as configparser from platformio.managers.package import PackageManager Import("env") -FEATURE_DEPENDENCIES = {} +FEATURE_CONFIG = {} + +def add_to_feat_cnf(feature, flines): + feat = FEATURE_CONFIG[feature] + atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') + for dep in atoms: + parts = dep.split('=') + name = parts.pop(0) + rest = '='.join(parts) + if name in ['extra_scripts', 'src_filter', 'lib_ignore']: + feat[name] = rest + else: + feat['lib_deps'] += [dep] def load_config(): config = configparser.ConfigParser() config.read("platformio.ini") items = config.items('features') for key in items: - ukey = key[0].upper() - if not ukey in FEATURE_DEPENDENCIES: - FEATURE_DEPENDENCIES[ukey] = { - 'lib_deps': [] - } - deps = re.sub(',\\s*', '\n', key[1]).strip().split('\n') - for dep in deps: - parts = dep.split('=') - name = parts.pop(0) - rest = '='.join(parts) - if name in ['extra_scripts', 'src_filter', 'lib_ignore']: - FEATURE_DEPENDENCIES[ukey][name] = rest - else: - FEATURE_DEPENDENCIES[ukey]['lib_deps'] += [dep] + feature = key[0].upper() + if not feature in FEATURE_CONFIG: + FEATURE_CONFIG[feature] = { 'lib_deps': [] } + add_to_feat_cnf(feature, key[1]) + + # Add options matching marlin.MY_OPTION to the pile + all_opts = env.GetProjectOptions() + for n in all_opts: + mat = re.match(r'marlin\.(.+)', n[0]) + if mat: + try: + val = env.GetProjectOption(n[0]) + except: + val = None + if val: + add_to_feat_cnf(mat.group(1).upper(), val) def get_all_known_libs(): known_libs = [] - for feature in FEATURE_DEPENDENCIES: - if not 'lib_deps' in FEATURE_DEPENDENCIES[feature]: + for feature in FEATURE_CONFIG: + feat = FEATURE_CONFIG[feature] + if not 'lib_deps' in feat: continue - for dep in FEATURE_DEPENDENCIES[feature]['lib_deps']: + for dep in feat['lib_deps']: name, _, _ = PackageManager.parse_pkg_uri(dep) known_libs.append(name) return known_libs @@ -64,21 +79,23 @@ def force_ignore_unused_libs(): known_libs = get_all_known_libs() diff = (list(set(known_libs) - set(env_libs))) lib_ignore = env.GetProjectOption('lib_ignore') + diff - print("Ignoring libs:", lib_ignore) + print("Ignore libraries:", lib_ignore) set_env_field('lib_ignore', lib_ignore) -def install_features_dependencies(): +def apply_features_config(): load_config() - for feature in FEATURE_DEPENDENCIES: + for feature in FEATURE_CONFIG: if not env.MarlinFeatureIsEnabled(feature): continue - if 'lib_deps' in FEATURE_DEPENDENCIES[feature]: + feat = FEATURE_CONFIG[feature] + + if 'lib_deps' in feat and len(feat['lib_deps']): print("Adding lib_deps for %s... " % feature) - # deps to add + # feat to add deps_to_add = {} - for dep in FEATURE_DEPENDENCIES[feature]['lib_deps']: + for dep in feat['lib_deps']: name, _, _ = PackageManager.parse_pkg_uri(dep) deps_to_add[name] = dep @@ -101,27 +118,27 @@ def install_features_dependencies(): # Only add the missing dependencies set_env_field('lib_deps', deps + list(deps_to_add.values())) - if 'extra_scripts' in FEATURE_DEPENDENCIES[feature]: - print("Executing extra_scripts for %s... " % feature) - env.SConscript(FEATURE_DEPENDENCIES[feature]['extra_scripts'], exports="env") + if 'extra_scripts' in feat: + print("Running extra_scripts for %s... " % feature) + env.SConscript(feat['extra_scripts'], exports="env") - if 'src_filter' in FEATURE_DEPENDENCIES[feature]: + if 'src_filter' in feat: print("Adding src_filter for %s... " % feature) src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder - my_srcs = re.findall( r'[+-](<.*?>)', FEATURE_DEPENDENCIES[feature]['src_filter']) + my_srcs = re.findall( r'[+-](<.*?>)', feat['src_filter']) cur_srcs = re.findall( r'[+-](<.*?>)', src_filter) for d in my_srcs: if d in cur_srcs: src_filter = re.sub(r'[+-]' + d, '', src_filter) - src_filter = FEATURE_DEPENDENCIES[feature]['src_filter'] + ' ' + src_filter + src_filter = feat['src_filter'] + ' ' + src_filter set_env_field('src_filter', [src_filter]) env.Replace(SRC_FILTER=src_filter) - if 'lib_ignore' in FEATURE_DEPENDENCIES[feature]: - print("Ignoring libs for %s... " % feature) - lib_ignore = env.GetProjectOption('lib_ignore') + [FEATURE_DEPENDENCIES[feature]['lib_ignore']] + if 'lib_ignore' in feat: + print("Adding lib_ignore for %s... " % feature) + lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] set_env_field('lib_ignore', lib_ignore) # @@ -170,7 +187,7 @@ def search_compiler(): # Use the compiler to get a list of all enabled features # def load_marlin_features(): - if "MARLIN_FEATURES" in env: + if 'MARLIN_FEATURES' in env: return # Process defines @@ -199,16 +216,27 @@ def load_marlin_features(): feature = define[8:].strip().decode().split(' ') feature, definition = feature[0], ' '.join(feature[1:]) marlin_features[feature] = definition - env["MARLIN_FEATURES"] = marlin_features + env['MARLIN_FEATURES'] = marlin_features # # Return True if a matching feature is enabled # def MarlinFeatureIsEnabled(env, feature): load_marlin_features() - r = re.compile(feature) - matches = list(filter(r.match, env["MARLIN_FEATURES"])) - return len(matches) > 0 + r = re.compile('^' + feature + '$') + found = list(filter(r.match, env['MARLIN_FEATURES'])) + + # Defines could still be 'false' or '0', so check + some_on = False + if len(found): + for f in found: + val = env['MARLIN_FEATURES'][f] + if val in [ '', '1', 'true' ]: + some_on = True + elif val in env['MARLIN_FEATURES']: + some_on = env.MarlinFeatureIsEnabled(val) + + return some_on # # Add a method for other PIO scripts to query enabled features @@ -218,5 +246,5 @@ def MarlinFeatureIsEnabled(env, feature): # # Add dependencies for enabled Marlin features # -install_features_dependencies() +apply_features_config() force_ignore_unused_libs() diff --git a/platformio.ini b/platformio.ini index 029ce658819b..6c3214d5448e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -26,15 +26,160 @@ include_dir = Marlin # [common] default_src_filter = + - - + - - - - - - - - - - - + - - - - + - + - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - + - + - + - - - - + - + - - - - - - - - + - - + - + - - + - - + - + - - - - - - + - - + - + - + - + - - + - - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - - + - - + - + - - + - + - + - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - - + - + - + - + - + - - + - extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -49,12 +194,17 @@ HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/MKS-LittlevGL/ar src_filter=+ extra_scripts=download_mks_assets.py HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 - src_filter=+ + src_filter=+ + + + + +HAS_STEALTHCHOP = src_filter=+ SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -DIGIPOT_MCP4... = SlowSoftI2CMaster +HAS_I2C_DIGIPOT = SlowSoftI2CMaster + src_filter=+ HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip + src_filter=+ HAS_L64XX = Arduino-L6470@0.8.0 + src_filter=+ + + NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 + src_filter=+ MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 HAS_GRAPHICAL_LCD = U8glib-HAL@0.4.1 src_filter=+ @@ -64,17 +214,143 @@ DWIN_CREALITY_LCD = src_filter=+ HAS_CHARACTER_LCD = src_filter=+ HAS_GRAPHICAL_TFT = src_filter=+ HAS_LCD_MENU = src_filter=+ -HAS_DGUS_LCD = src_filter=+ -TOUCH_UI_FTDI_EVE = src_filter=+ +HAS_GAMES = src_filter=+ +MARLIN_BRICKOUT = src_filter=+ +MARLIN_INVADERS = src_filter=+ +MARLIN_MAZE = src_filter=+ +MARLIN_SNAKE = src_filter=+ +HAS_MENU_BACKLASH = src_filter=+ +HAS_MENU_BED_CORNERS = src_filter=+ +LCD_BED_LEVELING = src_filter=+ +HAS_MENU_CANCELOBJECT = src_filter=+ +HAS_MENU_DELTA_CALIBRATE = src_filter=+ +HAS_MENU_FILAMENT = src_filter=+ +LCD_INFO_MENU = src_filter=+ +HAS_MENU_JOB_RECOVERY = src_filter=+ +HAS_MENU_LED = src_filter=+ +HAS_MENU_MEDIA = src_filter=+ +HAS_MENU_MIXER = src_filter=+ +HAS_MENU_MMU2 = src_filter=+ +HAS_MENU_POWER_MONITOR = src_filter=+ +HAS_MENU_CUTTER = src_filter=+ +HAS_MENU_TEMPERATURE = src_filter=+ +HAS_MENU_TMC = src_filter=+ +HAS_MENU_TOUCH_SCREEN = src_filter=+ +HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_I3MEGA = src_filter=+ +HAS_DGUS_LCD = src_filter=+ + +TOUCH_UI_FTDI_EVE = src_filter=+ +HAS_ANYCUBIC_TFT_EXTUI = src_filter=+ +EXTUI_EXAMPLE = src_filter=+ +MALYAN_LCD = src_filter=+ +HAS_SPI_LCD = src_filter=+ USB_FLASH_DRIVE_SUPPORT = src_filter=+ -AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ + +AUTO_BED_LEVELING_BILINEAR = src_filter=+ +AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ MESH_BED_LEVELING = src_filter=+ + AUTO_BED_LEVELING_UBL = src_filter=+ + +BACKLASH_COMPENSATION = src_filter=+ +BARICUDA = src_filter=+ + +BINARY_FILE_TRANSFER = src_filter=+ + +BLTOUCH = src_filter=+ +CANCEL_OBJECTS = src_filter=+ + +CASE_LIGHT_ENABLE = src_filter=+ + +EXTERNAL_CLOSED_LOOP_CONTROLLER = src_filter=+ + +USE_CONTROLLER_FAN = src_filter=+ DAC_STEPPER_CURRENT = src_filter=+ -HAS_I2C_DIGIPOT = src_filter=+ -HAS_LED_FEATURE = src_filter=+ -(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer +DIRECT_STEPPING = src_filter=+ + +EMERGENCY_PARSER = src_filter=+ - +I2C_POSITION_ENCODERS = src_filter=+ +HAS_FANMUX = src_filter=+ +FILAMENT_WIDTH_SENSOR = src_filter=+ + +FWRETRACT = src_filter=+ + +HOST_ACTION_COMMANDS = src_filter=+ +HOTEND_IDLE_TIMEOUT = src_filter=+ +JOYSTICK = src_filter=+ +BLINKM = src_filter=+ +HAS_COLOR_LEDS = src_filter=+ + +PCA9533 = src_filter=+ +PCA9632 = src_filter=+ +PRINTER_EVENT_LEDS = src_filter=+ +TEMP_STAT_LEDS = src_filter=+ +MAX7219_DEBUG = src_filter=+ + +MIXING_EXTRUDER = src_filter=+ + +PRUSA_MMU2 = src_filter=+ + +ADVANCED_PAUSE_FEATURE = src_filter=+ + + +AUTO_POWER_CONTROL = src_filter=+ +HAS_POWER_MONITOR = src_filter=+ + +POWER_LOSS_RECOVERY = src_filter=+ + +PROBE_TEMP_COMPENSATION = src_filter=+ + +HAS_FILAMENT_SENSOR = src_filter=+ + +MK2_MULTIPLEXER = src_filter=+ +EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+ +HAS_CUTTER = src_filter=+ + +EXPERIMENTAL_I2CBUS = src_filter=+ + +Z_STEPPER_AUTO_ALIGN = src_filter=+ + +G26_MESH_VALIDATION = src_filter=+ +ASSISTED_TRAMMING = src_filter=+ +HAS_MESH = src_filter=+ +HAS_LEVELING = src_filter=+ +DELTA_AUTO_CALIBRATION = src_filter=+ +CALIBRATION_GCODE = src_filter=+ +Z_MIN_PROBE_REPEATABILITY_TEST = src_filter=+ +M100_FREE_MEMORY_WATCHER = src_filter=+ +BACKLASH_GCODE = src_filter=+ +IS_KINEMATIC = src_filter=+ +HAS_EXTRA_ENDSTOPS = src_filter=+ +SKEW_CORRECTION_GCODE = src_filter=+ +PINS_DEBUGGING = src_filter=- +NO_VOLUMETRICS = src_filter=- +HAS_MULTI_EXTRUDER = src_filter=+ +HAS_HOTEND_OFFSET = src_filter=+ +EDITABLE_SERVO_ANGLES = src_filter=+ +PREVENT_COLD_EXTRUSION = src_filter=+ +HAS_USER_THERMISTORS = src_filter=+ +SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ +COOLANT_CONTROL = src_filter=+ +HAS_SOFTWARE_ENDSTOPS = src_filter=+ +HAS_DUPLICATION_MODE = src_filter=+ +LIN_ADVANCE = src_filter=+ +PHOTO_GCODE = src_filter=+ +CONTROLLER_FAN_EDITABLE = src_filter=+ +GCODE_MACROS = src_filter=+ +GRADIENT_MIX = src_filter=+ +HAS_SAVED_POSITIONS = src_filter=+ + +PARK_HEAD_ON_PAUSE = src_filter=+ +FILAMENT_LOAD_UNLOAD_GCODES = src_filter=+ +CNC_WORKSPACE_PLANES = src_filter=+ +CNC_COORDINATE_SYSTEMS = src_filter=+ +HAS_M206_COMMAND = src_filter=+ +EXPECTED_PRINTER_CHECK = src_filter=+ +HOST_KEEPALIVE_FEATURE = src_filter=+ +REPETIER_GCODE_M360 = src_filter=+ +HAS_GCODE_M876 = src_filter=+ +HAS_RESUME_CONTINUE = src_filter=+ +HAS_PREHEAT_COUNT = src_filter=+ +HAS_LCD_CONTRAST = src_filter=+ +LCD_SET_PROGRESS_MANUALLY = src_filter=+ +TOUCH_SCREEN_CALIBRATION = src_filter=+ +ARC_SUPPORT = src_filter=+ +GCODE_MOTION_MODES = src_filter=+ +BABYSTEPPING = src_filter=+ +Z_PROBE_SLED = src_filter=+ +G38_PROBE_TARGET = src_filter=+ +MAGNETIC_PARKING_EXTRUDER = src_filter=+ +SDSUPPORT = src_filter=+ +HAS_EXTRUDERS = src_filter=+ + +INCH_MODE_SUPPORT = src_filter=+ +TEMPERATURE_UNITS_SUPPORT = src_filter=+ +NEED_HEX_PRINT = src_filter=+ +NEED_LSF = src_filter=+ +NOZZLE_PARK_FEATURE = src_filter=+ + +NOZZLE_CLEAN_FEATURE = src_filter=+ + +DELTA = src_filter=+ + +BEZIER_CURVE_SUPPORT = src_filter=+ + +PRINTCOUNTER = src_filter=+ +HAS_BED_PROBE = src_filter=+ + + + +IS_SCARA = src_filter=+ +MORGAN_SCARA = src_filter=+ +(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer ESP3DLib=https://github.com/luc-github/ESP3DLib.git arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git ESP32SSDP=https://github.com/luc-github/ESP32SSDP.git @@ -268,14 +544,13 @@ src_filter = ${common.default_src_filter} + [env:DUE_USB] platform = atmelsam +extends = env:DUE board = dueUSB -src_filter = ${common.default_src_filter} + [env:DUE_debug] # Used when WATCHDOG_RESET_MANUAL is enabled platform = atmelsam -board = due -src_filter = ${common.default_src_filter} + +extends = env:DUE build_flags = ${common.build_flags} -funwind-tables -mpoke-function-name @@ -285,8 +560,7 @@ build_flags = ${common.build_flags} # [common_DUE_archim] platform = atmelsam -board = due -src_filter = ${common.default_src_filter} + +extends = env:DUE build_flags = ${common.build_flags} -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON extra_scripts = ${common.extra_scripts} @@ -320,7 +594,7 @@ src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} SoftwareSerialM Adafruit SPIFlash - SdFat - Adafruit Fork +marlin.SDSUPPORT = SdFat - Adafruit Fork debug_tool = jlink ################################# @@ -342,8 +616,8 @@ extra_scripts = ${common.extra_scripts} src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} Servo - LiquidCrystal@1.0.0 - Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip +marlin.USES_LIQUIDCRYSTAL = LiquidCrystal@1.0.0 +marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace #-funwind-tables @@ -426,9 +700,9 @@ extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py lib_deps = ${common.lib_deps} - Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use SoftwareSerialM USBComposite for STM32F1@0.91 +marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use debug_tool = stlink upload_protocol = dfu From b2abeff9ad9fe5182afd0fd7d3e730c0894ff361 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 10:15:19 -0300 Subject: [PATCH 294/483] MKS Robin Nano CI Tests (#18927) --- .github/workflows/test-builds.yml | 2 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 3 +- buildroot/tests/mks_robin_nano-tests | 15 ------- buildroot/tests/mks_robin_nano35-tests | 39 +++++++++++++++++++ 4 files changed, 41 insertions(+), 18 deletions(-) delete mode 100644 buildroot/tests/mks_robin_nano-tests create mode 100644 buildroot/tests/mks_robin_nano35-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index bcc42fbd6001..fdb81fbdc9d2 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -78,6 +78,7 @@ jobs: - mks_robin_pro - STM32F103RET6_creality - LERDGEX + - mks_robin_nano35 # Put lengthy tests last @@ -94,7 +95,6 @@ jobs: #- at90usb1286_dfu #- STM32F103CB_malyan #- mks_robin_mini - #- mks_robin_nano steps: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 3f87c5183f37..072213e499ac 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -510,9 +510,8 @@ uint8_t public_buf[512]; uint8_t pic_counter = 0; W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter); + SERIAL_ECHOLNPAIR("Total Uncompressed: ", totalSizes, ", Compressed: ", totalCompressed); #endif - - SERIAL_ECHOLNPAIR("Total Uncompressed: ", totalSizes, ", Compressed: ", totalCompressed); } #if HAS_SPI_FLASH_FONT diff --git a/buildroot/tests/mks_robin_nano-tests b/buildroot/tests/mks_robin_nano-tests deleted file mode 100644 index d3df7e2e5a57..000000000000 --- a/buildroot/tests/mks_robin_nano-tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for MKS Robin nano -# (STM32F1 genericSTM32F103VE) -# - -# exit on first failure -set -e - -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -exec_test $1 $2 "MKS Robin nano" - -# cleanup -restore_configs diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests new file mode 100644 index 000000000000..ac72050875ab --- /dev/null +++ b/buildroot/tests/mks_robin_nano35-tests @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# +# Build tests for MKS Robin nano +# (STM32F1 genericSTM32F103VE) +# + +# exit on first failure +set -e + +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO +opt_disable TFT_320x240 +opt_enable TOUCH_SCREEN +opt_enable FSMC_GRAPHICAL_TFT +exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" + +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_320x240 +opt_enable TOUCH_SCREEN +opt_enable SPI_GRAPHICAL_TFT +exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" + +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO +opt_disable TFT_320x240 +opt_disable TOUCH_SCREEN +opt_enable TFT_LVGL_UI_FSMC +exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" + +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_320x240 +opt_disable TOUCH_SCREEN +opt_enable TFT_LVGL_UI_SPI +exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" + +# cleanup +restore_configs From 4c8bb99059ae1e06319b4b9e9f5bb6914b5c8c1d Mon Sep 17 00:00:00 2001 From: Radek <46979052+radek8@users.noreply.github.com> Date: Fri, 7 Aug 2020 00:21:55 +0200 Subject: [PATCH 295/483] Increase Manual E Move Feedrate to 2mm/s (#18937) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index de50995ffe14..a3013611cba6 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1025,7 +1025,7 @@ // @section lcd #if EITHER(ULTIPANEL, EXTENSIBLE_UI) - #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // Feedrates for manual moves along X, Y, Z, E from panel #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) #if ENABLED(ULTIPANEL) #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" From c3fdc7f81ec015fff664c4cddb61077e503e6a3f Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 19:33:42 -0300 Subject: [PATCH 296/483] Apply PIO-supported custom_option for deps (#18935) --- buildroot/share/PlatformIO/scripts/common-dependencies.py | 4 ++-- platformio.ini | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index ec708b116a89..e09c639ad781 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -37,10 +37,10 @@ def load_config(): FEATURE_CONFIG[feature] = { 'lib_deps': [] } add_to_feat_cnf(feature, key[1]) - # Add options matching marlin.MY_OPTION to the pile + # Add options matching custom_marlin.MY_OPTION to the pile all_opts = env.GetProjectOptions() for n in all_opts: - mat = re.match(r'marlin\.(.+)', n[0]) + mat = re.match(r'custom_marlin\.(.+)', n[0]) if mat: try: val = env.GetProjectOption(n[0]) diff --git a/platformio.ini b/platformio.ini index 6c3214d5448e..ee4d4e12f83f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -594,7 +594,7 @@ src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} SoftwareSerialM Adafruit SPIFlash -marlin.SDSUPPORT = SdFat - Adafruit Fork +custom_marlin.SDSUPPORT = SdFat - Adafruit Fork debug_tool = jlink ################################# @@ -616,8 +616,8 @@ extra_scripts = ${common.extra_scripts} src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} Servo -marlin.USES_LIQUIDCRYSTAL = LiquidCrystal@1.0.0 -marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip +custom_marlin.USES_LIQUIDCRYSTAL = LiquidCrystal@1.0.0 +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace #-funwind-tables @@ -702,7 +702,7 @@ extra_scripts = ${common.extra_scripts} lib_deps = ${common.lib_deps} SoftwareSerialM USBComposite for STM32F1@0.91 -marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use debug_tool = stlink upload_protocol = dfu From 821d9e374eec799979363fd38f7a8ce3bd90a8fe Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 7 Aug 2020 00:10:58 +0000 Subject: [PATCH 297/483] [cron] Bump distribution date (2020-08-07) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 5b63f312966b..2a6e9a3c423d 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-06" + #define STRING_DISTRIBUTION_DATE "2020-08-07" #endif /** From 35e11e5f8bf873a399e722d048669e72cc492a29 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 6 Aug 2020 22:52:01 -0300 Subject: [PATCH 298/483] Followup fixes to LVGL for Chitu (#18940) --- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 29 ++++++++++--------- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 29 ++++++++++--------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index d97b54a658f9..c71bdbd737e1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -#include "../../inc/MarlinConfigPre.h" +#include "../../../../inc/MarlinConfig.h" #include diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index b6863d252b66..6a3936588773 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -147,21 +147,24 @@ #endif #endif -#define SPI_FLASH_SIZE 0x200000 // 2MB +// SPI Flash +#define SPI_FLASH_SIZE 0x200000 // 2MB +#define HAS_SPI_FLASH 1 + +// SPI 2 +#define W25QXX_CS_PIN PB12 +#define W25QXX_MOSI_PIN PB15 +#define W25QXX_MISO_PIN PB14 +#define W25QXX_SCK_PIN PB13 #if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 1 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 1 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 - - // SPI 2 - #define W25QXX_CS_PIN PB12 - #define W25QXX_MOSI_PIN PB15 - #define W25QXX_MISO_PIN PB14 - #define W25QXX_SCK_PIN PB13 + #define HAS_SPI_FLASH_FONT 1 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 1 + #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 + #define HAS_TOUCH_XPT2046 1 #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 7a3777da46e2..be64512b5018 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -158,21 +158,24 @@ #endif #endif -#define SPI_FLASH_SIZE 0x200000 // 2MB +// SPI Flash +#define SPI_FLASH_SIZE 0x200000 // 2MB +#define HAS_SPI_FLASH 1 + +// SPI 2 +#define W25QXX_CS_PIN PB12 +#define W25QXX_MOSI_PIN PB15 +#define W25QXX_MISO_PIN PB14 +#define W25QXX_SCK_PIN PB13 #if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 0 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 0 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 - - // SPI 2 - #define W25QXX_CS_PIN PB12 - #define W25QXX_MOSI_PIN PB15 - #define W25QXX_MISO_PIN PB14 - #define W25QXX_SCK_PIN PB13 + #define HAS_SPI_FLASH_FONT 0 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 0 + #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 + #define HAS_TOUCH_XPT2046 1 #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK From 5e08efb0fc0e5991f70c19f55112025145128b59 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 7 Aug 2020 03:53:43 -0300 Subject: [PATCH 299/483] Fix LVGL "C" brace (#18942) --- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index c71bdbd737e1..354e11a540d4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -21,10 +21,6 @@ */ #pragma once -#ifdef __cplusplus -extern "C" { /* C-declarations for C++ */ -#endif - #include "../../../../inc/MarlinConfig.h" #include @@ -125,6 +121,10 @@ extern "C" { /* C-declarations for C++ */ // SD card information first addr #define VAR_INF_ADDR 0x000000 +#ifdef __cplusplus +extern "C" { /* C-declarations for C++ */ +#endif + union union32 { uint8_t bytes[4]; uint32_t dwords; From cec035688df8e3c072476404f7b4cdb6fafce087 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 7 Aug 2020 03:55:15 -0300 Subject: [PATCH 300/483] Fix / optimize FSMC init (#18941) --- .../STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp | 18 +++++++----------- Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 18 +++++++----------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp index 0f3887d29afb..445e53b67f54 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp @@ -171,16 +171,17 @@ LCD_CONTROLLER_TypeDef *LCD; void LCD_IO_Init(uint8_t cs, uint8_t rs) { uint32_t controllerAddress; + struct fsmc_nor_psram_reg_map* fsmcPsramRegion; if (fsmcInit) return; fsmcInit = 1; switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break; + case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; break; + case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; + case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; + case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; #endif default: return; } @@ -246,13 +247,8 @@ void LCD_IO_Init(uint8_t cs, uint8_t rs) { gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - #if ENABLED(STM32_XL_DENSITY) - FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #else // PSRAM1 for STM32F103V (high density) - FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #endif + fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; afio_remap(AFIO_REMAP_FSMC_NADV); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index a039cbe0cb1c..a257d03489cd 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -104,16 +104,17 @@ void LCD_IO_Init(uint8_t cs, uint8_t rs) { uint32_t controllerAddress; + struct fsmc_nor_psram_reg_map* fsmcPsramRegion; if (fsmcInit) return; fsmcInit = 1; switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break; + case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; break; + case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; + case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; + case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; #endif default: return; } @@ -179,13 +180,8 @@ gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - #if ENABLED(STM32_XL_DENSITY) - FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #else // PSRAM1 for STM32F103V (high density) - FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - #endif + fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; afio_remap(AFIO_REMAP_FSMC_NADV); From da4eaebdc9c1adc7387e302fe6516ed009974edd Mon Sep 17 00:00:00 2001 From: wmariz <11435639+wmariz@users.noreply.github.com> Date: Fri, 7 Aug 2020 19:03:59 -0300 Subject: [PATCH 301/483] ZoneStar Z6FB (#18918) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 11 +- Marlin/src/core/boards.h | 1 + Marlin/src/inc/Conditionals_LCD.h | 13 ++ Marlin/src/inc/Conditionals_post.h | 4 + Marlin/src/inc/SanityCheck.h | 5 +- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 2 +- Marlin/src/lcd/dogm/ultralcd_DOGM.h | 82 +++---- Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp | 6 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 234 +++++++++++++++++++ Marlin/src/sd/Sd2Card.cpp | 11 +- platformio.ini | 1 - 12 files changed, 322 insertions(+), 50 deletions(-) create mode 100644 Marlin/src/pins/sanguino/pins_ZMIB_V2.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 75ee1eb99014..3ad7dfdab339 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2089,7 +2089,7 @@ //#define OLED_PANEL_TINYBOY2 // -// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// MKS OLED 1.3" 128×64 FULL GRAPHICS CONTROLLER // https://reprap.org/wiki/MKS_12864OLED // // Tiny, but very sharp OLED display @@ -2097,6 +2097,13 @@ //#define MKS_12864OLED // Uses the SH1106 controller (default) //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller +// +// Zonestar OLED 128×64 FULL GRAPHICS CONTROLLER +// +//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller +//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default) +//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller + // // Einstart S OLED SSD1306 // @@ -2108,7 +2115,7 @@ //#define OVERLORD_OLED // -// FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER with WS2812 RGB +// FYSETC OLED 2.42" 128×64 FULL GRAPHICS CONTROLLER with WS2812 RGB // Where to find : https://www.aliexpress.com/item/4000345255731.html //#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index eb33258e26b8..32b9168a6229 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -171,6 +171,7 @@ #define BOARD_STB_11 1508 // STB V1.1 #define BOARD_AZTEEG_X1 1509 // Azteeg X1 #define BOARD_ANET_10 1510 // Anet 1.0 (Melzi clone) +#define BOARD_ZMIB_V2 1511 // ZoneStar ZMIB V2 // // Other ATmega644P, ATmega644, ATmega1284P diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index cabca762aba4..d8c8103a4214 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -62,6 +62,19 @@ #define ENCODER_STEPS_PER_MENU_ITEM 1 #define ENCODER_FEEDRATE_DEADZONE 2 +#elif ENABLED(ZONESTAR_12864LCD) + #define DOGLCD + #define IS_RRD_SC + #define U8GLIB_ST7920 + +#elif ENABLED(ZONESTAR_12864OLED) + #define IS_RRD_SC + #define U8GLIB_SH1106 + +#elif ENABLED(ZONESTAR_12864OLED_SSD1306) + #define IS_RRD_SC + #define IS_U8GLIB_SSD1306 + #elif ENABLED(RADDS_DISPLAY) #define IS_ULTIPANEL #define ENCODER_PULSES_PER_STEP 2 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 556d57b66966..6243d82aa8c8 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -312,6 +312,10 @@ #define _LCD_CONTRAST_INIT 17 #elif ENABLED(MINIPANEL) #define _LCD_CONTRAST_INIT 150 +#elif ENABLED(ZONESTAR_12864OLED) + #define _LCD_CONTRAST_MIN 64 + #define _LCD_CONTRAST_INIT 128 + #define _LCD_CONTRAST_MAX 255 #endif #ifdef _LCD_CONTRAST_INIT diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d296eb2f1593..7fbfda4fe109 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2227,6 +2227,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(OLED_PANEL_TINYBOY2) \ + ENABLED(MKS_12864OLED) \ + ENABLED(MKS_12864OLED_SSD1306) \ + + ENABLED(ZONESTAR_12864LCD) \ + + ENABLED(ZONESTAR_12864OLED) \ + + ENABLED(ZONESTAR_12864OLED_SSD1306) \ + ENABLED(U8GLIB_SH1106_EINSTART) \ + ENABLED(OVERLORD_OLED) \ + ENABLED(FYSETC_242_OLED_12864) \ @@ -2242,7 +2245,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(TFT_LVGL_UI_SPI) \ + ENABLED(ANYCUBIC_LCD_I3MEGA) \ + ENABLED(ANYCUBIC_LCD_CHIRON) - #error "Please select no more than one LCD controller option." + #error "Please select only one LCD controller option." #endif #undef IS_RRD_SC diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index 22f460afe701..c6c67bf97e6e 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -246,7 +246,7 @@ void MarlinUI::init_lcd() { OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away #endif - #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) SET_OUTPUT(LCD_PINS_DC); #ifndef LCD_RESET_PIN #define LCD_RESET_PIN LCD_PINS_RS diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h index 40402fe5acb2..228cee6848b4 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -33,6 +33,9 @@ //#define ALTERNATIVE_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + // RepRapWorld Graphical LCD + #define U8G_CLASS U8GLIB_ST7920_128X64_4X #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) #define U8G_PARAM LCD_PINS_RS @@ -43,6 +46,7 @@ #elif ENABLED(U8GLIB_ST7920) // RepRap Discount Full Graphics Smart Controller + // and other variant LCDs using ST7920 #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) @@ -88,9 +92,29 @@ #define FORCE_SOFT_SPI // SW-SPI #endif -#elif ENABLED(MKS_12864OLED_SSD1306) +#elif ANY(FYSETC_MINI_12864, MKS_MINI_12864, ENDER2_STOCKDISPLAY) + + // The FYSETC Mini 12864 display // "4 stripes" + + // The MKS_MINI_12864 V1/V2 aren't exact copies of the MiniPanel. + // Panel management is in u8g_dev_uc1701_mini12864_HAL.cpp with + // extra delays added to remove glitches seen with fast MCUs. + + #define U8G_CLASS U8GLIB_MINI12864_2X_HAL // 8 stripes (HW-SPI) + +#elif ENABLED(MINIPANEL) + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_MINI12864 + #else + #define U8G_CLASS U8GLIB_MINI12864_2X // 8 stripes (HW-SPI) + #endif + +#elif EITHER(MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) // MKS 128x64 (SSD1306) OLED I2C LCD + // - or - + // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER #define FORCE_SOFT_SPI // SW-SPI @@ -100,40 +124,36 @@ #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes #endif -#elif ENABLED(U8GLIB_SSD1306) +#elif ENABLED(ZONESTAR_12864OLED_SSD1306) - // Generic SSD1306 OLED I2C LCD + // Zonestar SSD1306 OLED SPI LCD + #define FORCE_SOFT_SPI // SW-SPI #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE // 4 stripes + #define U8G_CLASS U8GLIB_SH1306_128X64_2X // 4 stripes #else - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes + #define U8G_CLASS U8GLIB_SH1306_128X64 // 8 stripes #endif - #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) -#elif ENABLED(MKS_12864OLED) +#elif EITHER(MKS_12864OLED, ZONESTAR_12864OLED) // MKS 128x64 (SH1106) OLED I2C LCD + // - or - + // Zonestar SH1106 OLED SPI LCD #define FORCE_SOFT_SPI // SW-SPI - #if ENABLED(ALTERNATIVE_LCD) #define U8G_CLASS U8GLIB_SH1106_128X64_2X // 4 stripes #else #define U8G_CLASS U8GLIB_SH1106_128X64 // 8 stripes #endif -#elif ENABLED(FYSETC_242_OLED_12864) - - // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER +#elif ENABLED(U8GLIB_SH1106_EINSTART) - #define FORCE_SOFT_SPI // SW-SPI + // Connected via motherboard header - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes - #else - #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes - #endif + #define U8G_CLASS U8GLIB_SH1106_128X64 + #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS #elif ENABLED(U8GLIB_SH1106) @@ -153,34 +173,16 @@ #define U8G_CLASS U8GLIB_SSD1309_128X64 #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) // I2C -#elif ENABLED(FYSETC_MINI_12864) - - // The FYSETC Mini 12864 display - - #define U8G_CLASS U8GLIB_MINI12864_2X_HAL // 4 stripes - -#elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - - // The MKS_MINI_12864 V1/V2 aren't exact copies of the MiniPanel. - // Panel management is in u8g_dev_uc1701_mini12864_HAL.cpp with - // extra delays added to remove glitches seen with fast MCUs. - - #define U8G_CLASS U8GLIB_MINI12864_2X_HAL // 8 stripes (HW-SPI) +#elif ENABLED(U8GLIB_SSD1306) -#elif ENABLED(MINIPANEL) + // Generic SSD1306 OLED I2C LCD #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_MINI12864 + #define U8G_CLASS U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE // 4 stripes #else - #define U8G_CLASS U8GLIB_MINI12864_2X // 8 stripes (HW-SPI) + #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes #endif - -#elif ENABLED(U8GLIB_SH1106_EINSTART) - - // Connected via motherboard header - - #define U8G_CLASS U8GLIB_SH1106_128X64 - #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS + #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) #elif TFT_SCALED_DOGLCD diff --git a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp index 9d00db3353f2..15cc96711c73 100644 --- a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -145,7 +145,7 @@ namespace ExtUI { if (rx[0] != 'A') { SERIAL_ECHOPGM("Unexpected RX: "); SERIAL_ECHOLN(rx); - + return; } @@ -490,7 +490,7 @@ namespace ExtUI { void onMediaRemoved() { SENDLINE_PGM("J01"); // SD Removed } - + void onPlayTone(const uint16_t frequency, const uint16_t duration) { tone(BEEPER_PIN, frequency, duration); } diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 1f120e0c12d1..9b6be5a6e106 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -300,6 +300,8 @@ #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p #elif MB(AZTEEG_X1) #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(ZMIB_V2) + #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p // // Other ATmega644P, ATmega644, ATmega1284P diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h new file mode 100644 index 000000000000..262199e310cf --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -0,0 +1,234 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#define BOARD_INFO_NAME "Zonestar ZMIB_V2" +#define BOARD_WEBSITE_URL "https://www.aliexpress.com/item/32957490744.html" + +#define IS_ZMIB_V2 + +/** + * ZMIB pin assignments + * + * The ZMIB board needs a bootloader installed before Marlin can be uploaded. + * If you don't have a chip programmer you can use a spare Arduino plus a few + * electronic components to write the bootloader. + * + * See http://www.instructables.com/id/Burn-Arduino-Bootloader-with-Arduino-MEGA/ + */ + +/** + * PIN: 0 Port: B0 HEATER_0_PIN + * PIN: 1 Port: B1 HEATER_BED_PIN + * PIN: 2 Port: B2 EXP1_4(BTN_EN2) + * PIN: 3 Port: B3 V1: SD_DETECT_PIN + * PIN: 3 Port: B3 V2: EXP1_6 + * PIN: 4 Port: B4 SDSS + * PIN: 4 Port: B4 V1: EXP1_6 + * PIN: 5 Port: B5 AVR_MOSI_PIN + * . MOSI_PIN + * PIN: 6 Port: B6 AVR_MISO_PIN + * . EXP1_9(MISO_PIN) + * PIN: 7 Port: B7 AVR_SCK_PIN + * . EXP1_10(SCK_PIN) + * PIN: 8 Port: D0 RXD + * PIN: 9 Port: D1 TXD + * PIN: 10 Port: D2 EXP1_8 + * PIN: 11 Port: D3 EXP1_7 + * PIN: 12 Port: D4 EXP1_5(BTN_EN1) + * PIN: 13 Port: D5 Z_MIN_PIN + * PIN: 14 Port: D6 E1_DIR_PIN + * PIN: 15 Port: D7 E1_STEP_PIN + * PIN: 16 Port: C0 Z_DIR_PIN + * PIN: 17 Port: C1 Z_STEP_PIN + * PIN: 18 Port: C2 Y_MIN_PIN + * PIN: 19 Port: C3 Y_DIR_PIN + * PIN: 20 Port: C4 Y_STEP_PIN + * PIN: 21 Port: C5 X_MIN_PIN + * PIN: 22 Port: C6 X_DIR_PIN + * PIN: 23 Port: C7 X_STEP_PIN + * PIN: 24 Port: A7 X_ENABLE_PIN + * Y_ENABLE_PIN + * Z_ENABLE_PIN + * E0_ENABLE_PIN + * E1_ENABLE_PIN + * PIN: 25 Port: A6 FIL_RUNOUT_PIN + * PIN: 26 Port: A5 E0_DIR_PIN + * PIN: 27 Port: A4 E0_STEP_PIN + * PIN: 28 Port: A3 FAN_PIN + * PIN: 29 Port: A2 EXP1_3(BTN_ENC) + * ADC_KEY_PIN + * PIN: 30 Port: A1 TEMP_0_PIN + * PIN: 31 Port: A0 TEMP_BED_PIN + */ + +// +// Limit Switches +// +#define X_MIN_PIN 21 +#define Y_MIN_PIN 18 + +#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) + #define Z_MIN_PIN 25 +#else + #define Z_MIN_PIN 13 +#endif + +// +// Steppers +// +#define X_STEP_PIN 23 +#define X_DIR_PIN 22 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 20 +#define Y_DIR_PIN 19 +#define Y_ENABLE_PIN 24 + +#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) + #define Z_STEP_PIN 27 + #define Z_DIR_PIN 26 +#else + #define Z_STEP_PIN 17 + #define Z_DIR_PIN 16 +#endif + +#define Z_ENABLE_PIN 24 + +#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) + #define E0_STEP_PIN 15 + #define E0_DIR_PIN 14 +#else + #define E0_STEP_PIN 27 + #define E0_DIR_PIN 26 +#endif + +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN 15 +#define E1_DIR_PIN 14 +#define E1_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 0 +#define HEATER_BED_PIN 1 +#define FAN_PIN 28 +#define FAN1_PIN -1 + +// +//filament run out sensor +// +#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) + #define FIL_RUNOUT_PIN 13 +#else + #define FIL_RUNOUT_PIN 25 // Z-MIN +#endif + +// +// SD card +// +#if ENABLED(SDSUPPORT) + #define SDSS 4 +#endif +#define SD_DETECT_PIN -1 + +/*=================================================== + * ZMIB Version 1 - EXP1 Connector + * MOSI(D5) TX1(D11) ENA(D12) ENC(D29/A2) 5V + * SCK(D7) RX1(D10) SCS(D4) ENB(D2) GND + *=================================================== + * ZMIB Version 2 - EXP1 Connector + * MOSI(D5) TX1(D11) ENA(D12) ENC(D29/A2) 5V + * SCK(D7) RX1(D10) SCS(D3) ENB(D2) GND + *=================================================== + * LCD 128x64 + *==================================================*/ + +#if ENABLED(ZONESTAR_12864LCD) + // + // LCD 128x64 + // + #define LCDSCREEN_NAME "ZONESTAR_12864LCD" + #define FORCE_SOFT_SPI + //#define LCD_SDSS 11 + #define LCD_PINS_RS 11 // ST7920_CS_PIN LCD_PIN_RS (PIN4 of LCD module) + #ifdef IS_ZMIB_V2 + #define LCD_PINS_ENABLE 3 // ST7920_DAT_PIN LCD_PIN_R/W (PIN5 of LCD module) + #else + #define LCD_PINS_ENABLE 4 // ST7920_DAT_PIN LCD_PIN_R/W (PIN5 of LCD module) + #endif + #define LCD_PINS_D4 10 // ST7920_CLK_PIN LCD_PIN_ENABLE (PIN6 of LCD module) + + // Alter timing for graphical display + #define ST7920_DELAY_1 DELAY_2_NOP + #define ST7920_DELAY_2 DELAY_2_NOP + #define ST7920_DELAY_3 DELAY_2_NOP + +#elif EITHER(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) + // + // OLED 128x64 + // + #define LCDSCREEN_NAME "ZONESTAR 12864OLED" + #define FORCE_SOFT_SPI + #ifdef IS_ZMIB_V2 + #define LCD_PINS_RS 3 // RESET + #else + #define LCD_PINS_RS 4 // RESET + #endif + #define LCD_PINS_DC 10 // DC + #define DOGLCD_CS 11 // CS + #if ENABLED(OLED_HW_IIC) + #error "Oops! can't choose HW IIC for ZMIB board!!" + #elif ENABLED(OLED_HW_SPI) + // HW SPI + #define DOGLCD_A0 LCD_PINS_DC // A0 = DC + #else + // SW SPI + #define DOGLCD_A0 LCD_PINS_DC // A0 = DC + #define DOGLCD_MOSI AVR_MOSI_PIN // SDA + #define DOGLCD_SCK AVR_SCK_PIN // SCK + #endif + +#endif + +// +// All the above are also RRDSC with rotary encoder +// +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define BTN_EN1 2 + #define BTN_EN2 12 + #define BTN_ENC 29 + #define BEEPER_PIN -1 + #define KILL_PIN -1 +#endif diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index c56d690b2ed2..6ff2793e93df 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -240,8 +240,15 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { watchdog_refresh(); // In case init takes too long // Set pin modes - extDigitalWrite(chipSelectPin_, HIGH); // For some CPUs pinMode can write the wrong data so init desired data value first - pinMode(chipSelectPin_, OUTPUT); // Solution for #8746 by @benlye + #if ENABLED(ZONESTAR_12864OLED) + if (chipSelectPin_ != DOGLCD_CS) { + SET_OUTPUT(DOGLCD_CS); + WRITE(DOGLCD_CS, HIGH); + } + #else + extDigitalWrite(chipSelectPin_, HIGH); // For some CPUs pinMode can write the wrong data so init desired data value first + pinMode(chipSelectPin_, OUTPUT); // Solution for #8746 by @benlye + #endif spiBegin(); // Set SCK rate for initialization commands diff --git a/platformio.ini b/platformio.ini index ee4d4e12f83f..fdb120ae88bd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -869,7 +869,6 @@ board = genericSTM32F103VE platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_nano35.py -lib_deps = ${common_stm32f1.lib_deps} build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 debug_tool = jlink From f2f1d8fa2113d077d6c3cb2feb10971122467f69 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 8 Aug 2020 10:59:09 +1200 Subject: [PATCH 302/483] HW PWM sanity checks for SPINDLE_LASER_FREQUENCY (#18947) --- Marlin/src/HAL/DUE/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/ESP32/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/LINUX/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/LPC1768/fast_pwm.cpp | 2 +- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 4 ++++ Marlin/src/HAL/SAMD51/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/STM32/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h | 4 ++-- Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h | 4 ++-- 11 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h index cdea34436e87..688069650630 100644 --- a/Marlin/src/HAL/DUE/inc/SanityCheck.h +++ b/Marlin/src/HAL/DUE/inc/SanityCheck.h @@ -52,8 +52,8 @@ #endif #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on DUE." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/ESP32/inc/SanityCheck.h b/Marlin/src/HAL/ESP32/inc/SanityCheck.h index 7653f6fe7ff1..f57a6c591028 100644 --- a/Marlin/src/HAL/ESP32/inc/SanityCheck.h +++ b/Marlin/src/HAL/ESP32/inc/SanityCheck.h @@ -25,8 +25,8 @@ #error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on ESP32." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/LINUX/inc/SanityCheck.h b/Marlin/src/HAL/LINUX/inc/SanityCheck.h index 8d23cdabbf8f..84167c97a144 100644 --- a/Marlin/src/HAL/LINUX/inc/SanityCheck.h +++ b/Marlin/src/HAL/LINUX/inc/SanityCheck.h @@ -30,8 +30,8 @@ #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on LINUX." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/LPC1768/fast_pwm.cpp b/Marlin/src/HAL/LPC1768/fast_pwm.cpp index 46507ac0dabc..dd440b5e7730 100644 --- a/Marlin/src/HAL/LPC1768/fast_pwm.cpp +++ b/Marlin/src/HAL/LPC1768/fast_pwm.cpp @@ -35,5 +35,5 @@ void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255 LPC176x::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size); } -#endif // FAST_PWM_FAN || SPINDLE_LASER_PWM +#endif // NEEDS_HARDWARE_PWM #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 964538962ce5..0a4e59c6c459 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -59,6 +59,10 @@ */ static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are incompatible with FAST_PWM_FAN on LPC176x boards."); +#if SPINDLE_LASER_FREQUENCY + static_assert(!NUM_SERVOS, "BLTOUCH and Servos are incompatible with SPINDLE_LASER_FREQUENCY on LPC176x boards."); +#endif + /** * Test LPC176x-specific configuration values for errors at compile-time. */ diff --git a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h index ee04e2e2e0c7..5d610acac85c 100644 --- a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h +++ b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h @@ -47,6 +47,6 @@ #error "SDIO_SUPPORT is not supported on SAMD51." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on SAMD51." #endif diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 37ca3d5a30ab..30d0750d90e0 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -28,8 +28,8 @@ // #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" //#endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32." #endif #if ENABLED(SDCARD_EEPROM_EMULATION) && DISABLED(SDSUPPORT) diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index ec7e8cf176e1..c0cb48695253 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -29,8 +29,8 @@ #error "EMERGENCY_PARSER is not yet implemented for STM32F1. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F1." #endif #if !defined(HAVE_SW_SERIAL) && HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h index 53b15ba1909a..9bb36f3bbbca 100644 --- a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h @@ -32,8 +32,8 @@ #error "EMERGENCY_PARSER is not yet implemented for STM32F4/7. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F4/F7." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h index 0b731a61d3b6..3932ee6a76c1 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h @@ -29,8 +29,8 @@ #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.1/3.2. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on Teensy 3.1/3.2." #endif #if HAS_TMC_SW_SERIAL diff --git a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h index 36b8018085c4..ee80e42696fa 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h @@ -29,8 +29,8 @@ #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.5/3.6. Disable EMERGENCY_PARSER to continue." #endif -#if ENABLED(FAST_PWM_FAN) - #error "FAST_PWM_FAN is not yet implemented for this platform." +#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY + #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on Teensy 3.5/3.6." #endif #if HAS_TMC_SW_SERIAL From 7b2f7a94fa596e4fd24e6f7b318c68514fcf1806 Mon Sep 17 00:00:00 2001 From: cbaugher Date: Fri, 7 Aug 2020 18:06:25 -0500 Subject: [PATCH 303/483] Fix Z height after tool change (#18951) --- Marlin/src/module/tool_change.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 225f4cbb916b..5d2dc7d3be3f 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1132,7 +1132,8 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if ENABLED(TOOLCHANGE_PARK) if (toolchange_settings.enable_park) do_blocking_move_to_xy_z(destination, destination.z, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); #else - do_blocking_move_to_xy(destination); + do_blocking_move_to_xy(destination, planner.settings.max_feedrate_mm_s[X_AXIS]); + do_blocking_move_to_z(destination, planner.settings.max_feedrate_mm_s[Z_AXIS]); #endif #endif From b68e591e58ee196f52760e654a9d97fe973cbd95 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 8 Aug 2020 00:10:15 +0000 Subject: [PATCH 304/483] [cron] Bump distribution date (2020-08-08) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 2a6e9a3c423d..a2bc2337f47c 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-07" + #define STRING_DISTRIBUTION_DATE "2020-08-08" #endif /** From b3ca43fe7840cc37e80eff37e34a64992588107e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 7 Aug 2020 19:30:35 -0500 Subject: [PATCH 305/483] Use uintptr_t for pointer-to-int --- Marlin/src/gcode/calibrate/M100.cpp | 8 ++++---- Marlin/src/libs/hex_print.cpp | 12 ++++++------ Marlin/src/libs/hex_print.h | 6 ------ 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index f03b13e233db..5ec709fb4002 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -156,8 +156,8 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { // Start and end the dump on a nice 16 byte boundary // (even though the values are not 16-byte aligned). // - start_free_memory = (char*)(ptr_int_t(uint32_t(start_free_memory) & ~0xFUL)); // Align to 16-byte boundary - end_free_memory = (char*)(ptr_int_t(uint32_t(end_free_memory) | 0xFUL)); // Align end_free_memory to the 15th byte (at or above end_free_memory) + start_free_memory = (char*)(uintptr_t(uint32_t(start_free_memory) & ~0xFUL)); // Align to 16-byte boundary + end_free_memory = (char*)(uintptr_t(uint32_t(end_free_memory) | 0xFUL)); // Align end_free_memory to the 15th byte (at or above end_free_memory) // Dump command main loop while (start_free_memory < end_free_memory) { @@ -189,8 +189,8 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { // Round the start and end locations to produce full lines of output // dump_free_memory( - (char*)(ptr_int_t(uint32_t(start) & ~0xFUL)), // Align to 16-byte boundary - (char*)(ptr_int_t(uint32_t(end) | 0xFUL)) // Align end_free_memory to the 15th byte (at or above end_free_memory) + (char*)(uintptr_t(uint32_t(start) & ~0xFUL)), // Align to 16-byte boundary + (char*)(uintptr_t(uint32_t(end) | 0xFUL)) // Align end_free_memory to the 15th byte (at or above end_free_memory) ); } diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp index 6bcc00e420a9..360b50e5e33a 100644 --- a/Marlin/src/libs/hex_print.cpp +++ b/Marlin/src/libs/hex_print.cpp @@ -20,12 +20,12 @@ * */ -#include "../inc/MarlinConfig.h" -#include "../gcode/parser.h" +#include "../inc/MarlinConfigPre.h" #if NEED_HEX_PRINT #include "hex_print.h" +#include "../core/serial.h" #ifdef CPU_32_BIT constexpr int byte_start = 4; @@ -54,7 +54,7 @@ char* hex_word(const uint16_t w) { } #ifdef CPU_32_BIT - char* hex_long(const uint32_t l) { + char* hex_long(const uintptr_t l) { _hex[2] = hex_nybble(l >> 28); _hex[3] = hex_nybble(l >> 24); _hex[4] = hex_nybble(l >> 20); @@ -66,9 +66,9 @@ char* hex_word(const uint16_t w) { char* hex_address(const void * const w) { #ifdef CPU_32_BIT - (void)hex_long((ptr_int_t)w); + (void)hex_long((uintptr_t)w); #else - (void)hex_word((ptr_int_t)w); + (void)hex_word((uintptr_t)w); #endif return _hex; } @@ -78,7 +78,7 @@ void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } -void print_hex_long(const uint32_t w, const char delimiter) { +void print_hex_long(const uintptr_t w, const char delimiter) { SERIAL_ECHOPGM("0x"); for (int B = 24; B >= 8; B -= 8){ print_hex_byte(w >> B); diff --git a/Marlin/src/libs/hex_print.h b/Marlin/src/libs/hex_print.h index 2fac6c989216..40baa15bcc11 100644 --- a/Marlin/src/libs/hex_print.h +++ b/Marlin/src/libs/hex_print.h @@ -39,9 +39,3 @@ void print_hex_byte(const uint8_t b); void print_hex_word(const uint16_t w); void print_hex_address(const void * const w); void print_hex_long(const uint32_t w, const char delimiter); - -#ifdef CPU_32_BIT - typedef uint32_t ptr_int_t; -#else - typedef uint16_t ptr_int_t; -#endif From 18adfe87bcd516436db001b53a0e09e58246c9e2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 7 Aug 2020 20:51:40 -0500 Subject: [PATCH 306/483] configuration_store => settings --- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/gcode/bedlevel/M420.cpp | 2 +- Marlin/src/gcode/eeprom/M500-M504.cpp | 2 +- Marlin/src/lcd/dwin/dwin.cpp | 2 +- .../lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp | 2 +- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/module/{configuration_store.cpp => settings.cpp} | 2 +- Marlin/src/module/{configuration_store.h => settings.h} | 0 Marlin/src/sd/cardreader.cpp | 2 +- 13 files changed, 12 insertions(+), 12 deletions(-) rename Marlin/src/module/{configuration_store.cpp => settings.cpp} (99%) rename Marlin/src/module/{configuration_store.h => settings.h} (100%) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8c5966f7442c..a8c4407be29a 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -43,7 +43,7 @@ #include "module/planner.h" #include "module/endstops.h" #include "module/temperature.h" -#include "module/configuration_store.h" +#include "module/settings.h" #include "module/printcounter.h" // PrintCounter or Stopwatch #include "module/stepper.h" diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 63b44823448b..809caecf49ea 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -31,7 +31,7 @@ #include "../../../MarlinCore.h" #include "../../../gcode/gcode.h" - #include "../../../module/configuration_store.h" + #include "../../../module/settings.h" #include "../../../module/planner.h" #include "../../../module/motion.h" #include "../../../module/probe.h" diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 760d2cdd1ea4..69a66420f898 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -29,7 +29,7 @@ #include "../../../MarlinCore.h" #include "../../../HAL/shared/eeprom_api.h" #include "../../../libs/hex_print.h" - #include "../../../module/configuration_store.h" + #include "../../../module/settings.h" #include "../../../lcd/ultralcd.h" #include "../../../module/stepper.h" #include "../../../module/planner.h" diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index d51543417165..96122c18f882 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -30,7 +30,7 @@ #include "../../module/probe.h" #if ENABLED(EEPROM_SETTINGS) - #include "../../module/configuration_store.h" + #include "../../module/settings.h" #endif #if ENABLED(EXTENSIBLE_UI) diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp index 30fa2b6e250c..26c50a6129a0 100644 --- a/Marlin/src/gcode/eeprom/M500-M504.cpp +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -21,7 +21,7 @@ */ #include "../gcode.h" -#include "../../module/configuration_store.h" +#include "../../module/settings.h" #include "../../core/serial.h" #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 0daaf3982ae4..74a0e6d8ff63 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -47,7 +47,7 @@ #include "../../feature/powerloss.h" #include "../../feature/babystep.h" -#include "../../module/configuration_store.h" +#include "../../module/settings.h" #include "../../module/temperature.h" #include "../../module/printcounter.h" #include "../../module/motion.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp index b52096a13b9a..def31e4a403f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -29,7 +29,7 @@ #include "../archim2-flash/flash_storage.h" -#include "../../../../../module/configuration_store.h" +#include "../../../../../module/settings.h" #if ENABLED(LULZBOT_PRINTCOUNTER) #include "../../../../../module/printcounter.h" diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 1c37b2f2d331..34def4d3bd7f 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -48,7 +48,7 @@ #endif #if ENABLED(SD_FIRMWARE_UPDATE) - #include "../../module/configuration_store.h" + #include "../../module/settings.h" #endif void menu_tmc(); diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 997130a91a7c..d1c1e6dd0a5f 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -33,7 +33,7 @@ #include "../../gcode/queue.h" #include "../../module/motion.h" #include "../../module/planner.h" -#include "../../module/configuration_store.h" +#include "../../module/settings.h" #include "../../feature/bedlevel/bedlevel.h" static int16_t ubl_storage_slot = 0, diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 6482cf33d068..670c916dd766 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -123,7 +123,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #include "lcdprint.h" #include "../sd/cardreader.h" -#include "../module/configuration_store.h" +#include "../module/settings.h" #include "../module/temperature.h" #include "../module/planner.h" #include "../module/motion.h" diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/settings.cpp similarity index 99% rename from Marlin/src/module/configuration_store.cpp rename to Marlin/src/module/settings.cpp index 28e15cfeb0d9..3df2067f5f55 100644 --- a/Marlin/src/module/configuration_store.cpp +++ b/Marlin/src/module/settings.cpp @@ -44,7 +44,7 @@ // Can be disabled for production build. //#define DEBUG_EEPROM_READWRITE -#include "configuration_store.h" +#include "settings.h" #include "endstops.h" #include "planner.h" diff --git a/Marlin/src/module/configuration_store.h b/Marlin/src/module/settings.h similarity index 100% rename from Marlin/src/module/configuration_store.h rename to Marlin/src/module/settings.h diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index bc1f88083a53..864552516bcc 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -36,7 +36,7 @@ #include "../module/planner.h" // for synchronize #include "../module/printcounter.h" #include "../gcode/queue.h" -#include "../module/configuration_store.h" +#include "../module/settings.h" #include "../module/stepper/indirection.h" #if ENABLED(EMERGENCY_PARSER) From fd646d0d66f8e89972db83d2c1f8e79cea573c21 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 7 Aug 2020 20:37:55 -0500 Subject: [PATCH 307/483] Clean up whitespace --- .../PlatformIO/variants/FLY_F407ZG/PeripheralPins.c | 12 ------------ .../PlatformIO/variants/MARLIN_F103Zx/ldscript.ld | 9 +++------ 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c index 0ac1d25ce9f5..bd2a47062c19 100644 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c @@ -151,9 +151,7 @@ WEAK const PinMap PinMap_PWM[] = { {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 @@ -167,7 +165,6 @@ WEAK const PinMap PinMap_PWM[] = { //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 @@ -183,12 +180,9 @@ WEAK const PinMap PinMap_PWM[] = { //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N @@ -196,23 +190,17 @@ WEAK const PinMap PinMap_PWM[] = { //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld index 098e83b060d9..09088b622c87 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld @@ -102,7 +102,7 @@ SECTIONS . = ALIGN(4); } >FLASH - .ARM.extab : { + .ARM.extab : { . = ALIGN(4); *(.ARM.extab* .gnu.linkonce.armextab.*) . = ALIGN(4); @@ -146,7 +146,7 @@ SECTIONS _sidata = LOADADDR(.data); /* Initialized data sections into "RAM" Ram type memory */ - .data : + .data : { . = ALIGN(4); _sdata = .; /* create a global symbol at data start */ @@ -157,7 +157,7 @@ SECTIONS _edata = .; /* define a global symbol at data end */ } >RAM AT> FLASH - + /* Uninitialized data section into "RAM" Ram type memory */ . = ALIGN(4); .bss : @@ -185,8 +185,6 @@ SECTIONS . = ALIGN(8); } >RAM - - /* Remove information from the compiler libraries */ /DISCARD/ : { @@ -197,4 +195,3 @@ SECTIONS .ARM.attributes 0 : { *(.ARM.attributes) } } - From 97cb0a8c3e3dbaeac07935938b145237a7285d8c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 27 Jul 2020 18:09:52 -0500 Subject: [PATCH 308/483] General cleanup --- Marlin/src/gcode/control/M997.cpp | 2 ++ Marlin/src/module/settings.cpp | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/control/M997.cpp b/Marlin/src/gcode/control/M997.cpp index 6c28d42f41ee..cdff96f1acd8 100644 --- a/Marlin/src/gcode/control/M997.cpp +++ b/Marlin/src/gcode/control/M997.cpp @@ -28,7 +28,9 @@ * M997: Perform in-application firmware update */ void GcodeSuite::M997() { + flashFirmware(parser.intval('S')); + } #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 3df2067f5f55..34af8f2ea398 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2517,8 +2517,7 @@ void MarlinSettings::reset() { #if HAS_PROBE_XY_OFFSET LOOP_XYZ(a) probe.offset[a] = dpo[a]; #else - probe.offset.x = probe.offset.y = 0; - probe.offset.z = dpo[Z_AXIS]; + probe.offset.set(0, 0, dpo[Z_AXIS]); #endif #endif From b84c69072efb6bf00ce17ecf99196c73f5f6508f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 8 Aug 2020 00:14:02 -0500 Subject: [PATCH 309/483] Patch hex_print --- Marlin/src/libs/hex_print.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp index 360b50e5e33a..0f746d628470 100644 --- a/Marlin/src/libs/hex_print.cpp +++ b/Marlin/src/libs/hex_print.cpp @@ -78,7 +78,7 @@ void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } -void print_hex_long(const uintptr_t w, const char delimiter) { +void print_hex_long(const uint32_t w, const char delimiter) { SERIAL_ECHOPGM("0x"); for (int B = 24; B >= 8; B -= 8){ print_hex_byte(w >> B); From ee69fb00a6d9aee92074510de7f34f81d9ae83af Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 8 Aug 2020 02:32:30 -0300 Subject: [PATCH 310/483] Marlin Color UI (FSMC) for STM32F1 (#18952) --- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 6 +- Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 236 ++++++++++++++++++ Marlin/src/HAL/STM32F1/tft/tft_fsmc.h | 64 +++++ Marlin/src/HAL/STM32F1/tft/xpt2046.cpp | 143 +++++++++++ Marlin/src/HAL/STM32F1/tft/xpt2046.h | 78 ++++++ Marlin/src/lcd/tft/touch.cpp | 1 - Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 47 +++- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 23 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 22 ++ 9 files changed, 604 insertions(+), 16 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp create mode 100644 Marlin/src/HAL/STM32F1/tft/tft_fsmc.h create mode 100644 Marlin/src/HAL/STM32F1/tft/xpt2046.cpp create mode 100644 Marlin/src/HAL/STM32F1/tft/xpt2046.h diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index 14977381e16b..0a1d6c820208 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -26,12 +26,12 @@ #undef SD_CHECK_AND_RETRY #endif -#if HAS_GRAPHICAL_TFT - #error "Sorry! TFT displays are not available for HAL/STM32F1." +#if HAS_SPI_TFT + #error "Sorry! SPI TFT displays are not available for HAL/STM32F1 (yet)." #endif // This platform has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) +#if ENABLED(TOUCH_SCREEN) && !HAS_FSMC_TFT #undef TOUCH_SCREEN #undef TOUCH_SCREEN_CALIBRATION #define HAS_TOUCH_XPT2046 1 diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp new file mode 100644 index 000000000000..33cddd1e05e1 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -0,0 +1,236 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_FSMC_TFT + +#include "tft_fsmc.h" +#include +#include +#include + +LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD; + +/** + * FSMC LCD IO + */ +#define __ASM __asm +#define __STATIC_INLINE static inline + +__attribute__((always_inline)) __STATIC_INLINE void __DSB() { + __ASM volatile ("dsb 0xF":::"memory"); +} + +#define FSMC_CS_NE1 PD7 + +#if ENABLED(STM32_XL_DENSITY) + #define FSMC_CS_NE2 PG9 + #define FSMC_CS_NE3 PG10 + #define FSMC_CS_NE4 PG12 + + #define FSMC_RS_A0 PF0 + #define FSMC_RS_A1 PF1 + #define FSMC_RS_A2 PF2 + #define FSMC_RS_A3 PF3 + #define FSMC_RS_A4 PF4 + #define FSMC_RS_A5 PF5 + #define FSMC_RS_A6 PF12 + #define FSMC_RS_A7 PF13 + #define FSMC_RS_A8 PF14 + #define FSMC_RS_A9 PF15 + #define FSMC_RS_A10 PG0 + #define FSMC_RS_A11 PG1 + #define FSMC_RS_A12 PG2 + #define FSMC_RS_A13 PG3 + #define FSMC_RS_A14 PG4 + #define FSMC_RS_A15 PG5 +#endif + +#define FSMC_RS_A16 PD11 +#define FSMC_RS_A17 PD12 +#define FSMC_RS_A18 PD13 +#define FSMC_RS_A19 PE3 +#define FSMC_RS_A20 PE4 +#define FSMC_RS_A21 PE5 +#define FSMC_RS_A22 PE6 +#define FSMC_RS_A23 PE2 + +#if ENABLED(STM32_XL_DENSITY) + #define FSMC_RS_A24 PG13 + #define FSMC_RS_A25 PG14 +#endif + +/* Timing configuration */ +#define FSMC_ADDRESS_SETUP_TIME 15 // AddressSetupTime +#define FSMC_DATA_SETUP_TIME 15 // DataSetupTime + +static uint8_t fsmcInit = 0; +void TFT_FSMC::Init() { + uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN; + uint32_t controllerAddress; + + #if PIN_EXISTS(TFT_RESET) + OUT_WRITE(TFT_RESET_PIN, HIGH); + delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif + + struct fsmc_nor_psram_reg_map* fsmcPsramRegion; + + if (fsmcInit) return; + fsmcInit = 1; + + switch (cs) { + case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; + #if ENABLED(STM32_XL_DENSITY) + case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; + case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; + case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; + #endif + default: return; + } + + #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) + + switch (rs) { + #if ENABLED(STM32_XL_DENSITY) + case FSMC_RS_A0: _ORADDR( 1); break; + case FSMC_RS_A1: _ORADDR( 2); break; + case FSMC_RS_A2: _ORADDR( 3); break; + case FSMC_RS_A3: _ORADDR( 4); break; + case FSMC_RS_A4: _ORADDR( 5); break; + case FSMC_RS_A5: _ORADDR( 6); break; + case FSMC_RS_A6: _ORADDR( 7); break; + case FSMC_RS_A7: _ORADDR( 8); break; + case FSMC_RS_A8: _ORADDR( 9); break; + case FSMC_RS_A9: _ORADDR(10); break; + case FSMC_RS_A10: _ORADDR(11); break; + case FSMC_RS_A11: _ORADDR(12); break; + case FSMC_RS_A12: _ORADDR(13); break; + case FSMC_RS_A13: _ORADDR(14); break; + case FSMC_RS_A14: _ORADDR(15); break; + case FSMC_RS_A15: _ORADDR(16); break; + #endif + case FSMC_RS_A16: _ORADDR(17); break; + case FSMC_RS_A17: _ORADDR(18); break; + case FSMC_RS_A18: _ORADDR(19); break; + case FSMC_RS_A19: _ORADDR(20); break; + case FSMC_RS_A20: _ORADDR(21); break; + case FSMC_RS_A21: _ORADDR(22); break; + case FSMC_RS_A22: _ORADDR(23); break; + case FSMC_RS_A23: _ORADDR(24); break; + #if ENABLED(STM32_XL_DENSITY) + case FSMC_RS_A24: _ORADDR(25); break; + case FSMC_RS_A25: _ORADDR(26); break; + #endif + default: return; + } + + rcc_clk_enable(RCC_FSMC); + + gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 + gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 + gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); // FSMC_D02 + gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); // FSMC_D03 + gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); // FSMC_D04 + gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); // FSMC_D05 + gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); // FSMC_D06 + gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 + gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 + gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 + gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 + gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 + gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 + gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); // FSMC_D13 + gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); // FSMC_D14 + gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 + + gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // FSMC_NOE + gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // FSMC_NWE + + gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx + gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax + + fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; + fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; + + afio_remap(AFIO_REMAP_FSMC_NADV); + + LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; +} + +void TFT_FSMC::Transmit(uint16_t Data) { + LCD->RAM = Data; + __DSB(); +} + +void TFT_FSMC::WriteReg(uint16_t Reg) { + LCD->REG = Reg; + __DSB(); +} + +uint32_t TFT_FSMC::GetID() { + uint32_t id; + WriteReg(0x0000); + id = LCD->RAM; + + if (id == 0) + id = ReadID(LCD_READ_ID); + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + + uint32_t TFT_FSMC::ReadID(uint16_t Reg) { + uint32_t id; + WriteReg(Reg); + id = LCD->RAM; // dummy read + id = Reg << 24; + id |= (LCD->RAM & 0x00FF) << 16; + id |= (LCD->RAM & 0x00FF) << 8; + id |= LCD->RAM & 0x00FF; + return id; + } + +bool TFT_FSMC::isBusy() { + return false; +} + +void TFT_FSMC::Abort() { + +} + +void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); + dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); + dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + + while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; + dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); +} + +#endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h new file mode 100644 index 000000000000..5c43361c0cab --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h @@ -0,0 +1,64 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#include + +#define DATASIZE_8BIT DMA_SIZE_8BITS +#define DATASIZE_16BIT DMA_SIZE_16BITS +#define TFT_IO TFT_FSMC + +typedef struct { + __IO uint16_t REG; + __IO uint16_t RAM; +} LCD_CONTROLLER_TypeDef; + +class TFT_FSMC { + private: + static LCD_CONTROLLER_TypeDef *LCD; + + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + + public: + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort(); + + static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {}; + static void DataTransferEnd() {}; + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg); + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_MODE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_CIRC_MODE, &Data, Count); } +}; diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp new file mode 100644 index 000000000000..dc34b0d5b506 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -0,0 +1,143 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TFT_XPT2046 + +#include "xpt2046.h" +#include + +uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include + + SPIClass XPT2046::SPIx(TOUCH_BUTTONS_HW_SPI_DEVICE); + + static void touch_spi_init(uint8_t spiRate) { + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + XPT2046::SPIx.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); + XPT2046::SPIx.setClockDivider(clock); + XPT2046::SPIx.setBitOrder(MSBFIRST); + XPT2046::SPIx.setDataMode(SPI_MODE0); + } +#endif // TOUCH_BUTTONS_HW_SPI + +void XPT2046::Init() { + SET_INPUT(TOUCH_MISO_PIN); + SET_OUTPUT(TOUCH_MOSI_PIN); + SET_OUTPUT(TOUCH_SCK_PIN); + OUT_WRITE(TOUCH_CS_PIN, HIGH); + + #if PIN_EXISTS(TOUCH_INT) + // Optional Pendrive interrupt pin + SET_INPUT(TOUCH_INT_PIN); + #endif + + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + touch_spi_init(SPI_SPEED_6); + #endif + + // Read once to enable pendrive status pin + getRawData(XPT2046_X); +} + +bool XPT2046::isTouched() { + return isBusy() ? false : ( + #if PIN_EXISTS(TOUCH_INT) + READ(TOUCH_INT_PIN) != HIGH + #else + getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD + #endif + ); +} + +bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { + if (isBusy()) return false; + if (!isTouched()) return false; + *x = getRawData(XPT2046_X); + *y = getRawData(XPT2046_Y); + return isTouched(); +} + +uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { + uint16_t data[3]; + + DataTransferBegin(); + + for (uint16_t i = 0; i < 3 ; i++) { + IO(coordinate); + data[i] = (IO() << 4) | (IO() >> 4); + } + + DataTransferEnd(); + + uint16_t delta01 = delta(data[0], data[1]), + delta02 = delta(data[0], data[2]), + delta12 = delta(data[1], data[2]); + + if (delta01 > delta02 || delta01 > delta12) + data[delta02 > delta12 ? 0 : 1] = data[2]; + + return (data[0] + data[1]) >> 1; +} + +uint16_t XPT2046::IO(uint16_t data) { + TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); +} + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + uint16_t XPT2046::HardwareIO(uint16_t data) { + SPIx.begin(); + uint16_t result = SPIx.transfer(data); + SPIx.end(); + return result; + } +#endif + +uint16_t XPT2046::SoftwareIO(uint16_t data) { + uint16_t result = 0; + + for (uint8_t j = 0x80; j; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); + if (READ(TOUCH_MISO_PIN)) result |= j; + WRITE(TOUCH_SCK_PIN, HIGH); + } + WRITE(TOUCH_SCK_PIN, LOW); + + return result; +} + +#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h new file mode 100644 index 000000000000..d2b7ad29b03e --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h @@ -0,0 +1,78 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include +#endif + +#if !PIN_EXISTS(TOUCH_MISO) + #error "TOUCH_MISO_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_MOSI) + #error "TOUCH_MOSI_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_SCK) + #error "TOUCH_SCK_PIN is not defined." +#elif !PIN_EXISTS(TOUCH_CS) + #error "TOUCH_CS_PIN is not defined." +#endif + +#ifndef TOUCH_INT_PIN + #define TOUCH_INT_PIN -1 +#endif + +#define XPT2046_DFR_MODE 0x00 +#define XPT2046_SER_MODE 0x04 +#define XPT2046_CONTROL 0x80 + +enum XPTCoordinate : uint8_t { + XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, +}; + +#if !defined(XPT2046_Z1_THRESHOLD) + #define XPT2046_Z1_THRESHOLD 10 +#endif + +class XPT2046 { +private: + static bool isBusy() { return false; } + + static uint16_t getRawData(const XPTCoordinate coordinate); + static bool isTouched(); + + static inline void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; + static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + static uint16_t HardwareIO(uint16_t data); + #endif + static uint16_t SoftwareIO(uint16_t data); + static uint16_t IO(uint16_t data = 0); + +public: + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + static SPIClass SPIx; + #endif + + static void Init(); + static bool getRawPoint(int16_t *x, int16_t *y); +}; diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 3407389f27b6..69f4ada86f27 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -22,7 +22,6 @@ #if ENABLED(TOUCH_SCREEN) #include "touch.h" -#include "pinconfig.h" #include "../ultralcd.h" #include "../menu/menu.h" diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 6a3936588773..6be67fc1a263 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -148,8 +148,8 @@ #endif // SPI Flash -#define SPI_FLASH_SIZE 0x200000 // 2MB -#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x200000 // 2MB +#define HAS_SPI_FLASH 1 // SPI 2 #define W25QXX_CS_PIN PB12 @@ -197,24 +197,47 @@ #define LCD_PIXEL_OFFSET_X 48 #define LCD_PIXEL_OFFSET_Y 48 - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 + #define XPT2046_X_CALIBRATION -12316 + #define XPT2046_Y_CALIBRATION 8981 + #define XPT2046_X_OFFSET 340 + #define XPT2046_Y_OFFSET -20 #define USE_XPT2046 1 #define XPT2046_XY_SWAP 0 #define XPT2046_X_INV 1 #define XPT2046_Y_INV 0 - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 140 - #define XPT2046_Y_MIN 200 + #define XPT2046_HOR_RES 480 + #define XPT2046_VER_RES 320 + #define XPT2046_X_MIN 140 + #define XPT2046_Y_MIN 200 #define XPT2046_X_MAX 1900 #define XPT2046_Y_MAX 1900 - #define XPT2046_AVG 4 - #define XPT2046_INV 0 + #define XPT2046_AVG 4 + #define XPT2046_INV 0 + +#elif ENABLED(TFT_480x320) + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 + + #define TOUCH_CS_PIN PB7 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index be64512b5018..4633de40f2a5 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -156,6 +156,29 @@ #define XPT2046_Y_OFFSET -20 #endif #endif + +#elif ENABLED(TFT_480x320) + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 + + #define TOUCH_CS_PIN PB7 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #endif // SPI Flash diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index a68b4810717b..d314c30fcdf1 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -215,6 +215,28 @@ #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif +#elif ENABLED(TFT_480x320) + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 + + #define TOUCH_CS_PIN PA7 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #endif #define SPI_FLASH From c2d5b63a9882dc02f41017a5b2f24363a55fef8d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 8 Aug 2020 18:21:44 -0500 Subject: [PATCH 311/483] Fix up STATIC_ITEM (#18962) --- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/feature/powerloss.h | 2 +- Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp | 12 +++++++----- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 17 +++++++++-------- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/lcdprint.h | 1 + Marlin/src/lcd/menu/menu.h | 20 +++++++++++--------- Marlin/src/lcd/menu/menu_addon.h | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 4 ++-- Marlin/src/lcd/menu/menu_filament.cpp | 4 ++-- Marlin/src/lcd/menu/menu_info.cpp | 4 ++-- Marlin/src/lcd/menu/menu_led.cpp | 2 +- Marlin/src/lcd/menu/menu_mmu2.cpp | 4 ++-- Marlin/src/lcd/menu/menu_motion.cpp | 8 ++++---- Marlin/src/lcd/tft/ui_320x240.cpp | 6 +++--- Marlin/src/lcd/tft/ui_480x320.cpp | 6 +++--- 16 files changed, 51 insertions(+), 45 deletions(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 29a2cef97c4a..9a3eee31b55c 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -21,7 +21,7 @@ */ /** - * power_loss_recovery.cpp - Resume an SD print after power-loss + * feature/powerloss.cpp - Resume an SD print after power-loss */ #include "../inc/MarlinConfigPre.h" diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 30ea343424dd..10653493ab8f 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -22,7 +22,7 @@ #pragma once /** - * power_loss_recovery.h - Resume an SD print after power-loss + * feature/powerloss.h - Resume an SD print after power-loss */ #include "../sd/cardreader.h" diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp index a924528c3053..22dd63f68cb0 100644 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -997,15 +997,17 @@ void MarlinUI::draw_status_screen() { #endif // ADVANCED_PAUSE_FEATURE // Draw a static item with no left-right margin required. Centered by default. - void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { int8_t n = LCD_WIDTH; lcd_moveto(0, row); - if ((style & SS_CENTER) && !valstr) { - int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; + const int8_t plen = pstr ? utf8_strlen_P(pstr) : 0, + vlen = vstr ? utf8_strlen(vstr) : 0; + if (style & SS_CENTER) { + int8_t pad = (LCD_WIDTH - plen - vlen) / 2; while (--pad >= 0) { lcd_put_wchar(' '); n--; } } - n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); - if (valstr) n -= lcd_put_u8str_max(valstr, n); + if (plen) n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); + if (vlen) n -= lcd_put_u8str_max(vstr, n); for (; n > 0; --n) lcd_put_wchar(' '); } diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index c6c67bf97e6e..d17c336eec24 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -347,20 +347,21 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } // Draw a static line of text in the same idiom as a menu item - void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { + void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { if (mark_as_selected(row, style & SS_INVERT)) { pixel_len_t n = LCD_PIXEL_WIDTH; // pixel width of string allowed - if ((style & SS_CENTER) && !valstr) - for (int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; pad > 0; --pad) { - lcd_put_wchar(' '); - n -= MENU_FONT_WIDTH; - } + const int8_t plen = pstr ? utf8_strlen_P(pstr) : 0, + vlen = vstr ? utf8_strlen(vstr) : 0; + if (style & SS_CENTER) { + int8_t pad = (LCD_WIDTH - plen - vlen) / 2; + while (--pad >= 0) n -= lcd_put_wchar(' '); + } - n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n / (MENU_FONT_WIDTH)) * (MENU_FONT_WIDTH); - if (valstr) n -= lcd_put_u8str_max(valstr, n); + if (plen) n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n / (MENU_FONT_WIDTH)) * (MENU_FONT_WIDTH); + if (vlen) n -= lcd_put_u8str_max(vstr, n); while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); } } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 391cb598cffc..ca7ddd2b0310 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -504,7 +504,7 @@ namespace Language_en { #if LCD_WIDTH >= 20 PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Print Count"); PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total Print time"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total Print Time"); PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time"); PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded Total"); #else diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 8e611bde8325..00139808aebc 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -99,6 +99,7 @@ #endif +#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) int lcd_glyph_height(); diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index d298376ce26d..7c3df79a19e4 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -83,7 +83,7 @@ class MenuItemBase { class MenuItem_static : public MenuItemBase { public: - static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const valstr=nullptr); + static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const vstr=nullptr); }; // CONFIRM_ITEM(LABEL,Y,N,FY,FN,V...), @@ -418,16 +418,17 @@ class MenuItem_bool : public MenuEditItemBase { }while(0) #define _MENU_ITEM_P(TYPE, V...) do { \ - _skipStatic = false; \ - if (_menuLineNr == _thisItemNr) \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ _MENU_INNER_P(TYPE, ##V); \ + } \ NEXT_ITEM(); \ }while(0) // Indexed items set a global index value and optional data #define _MENU_ITEM_N_S_P(TYPE, N, S, V...) do{ \ - _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ MenuItemBase::init(N, S); \ _MENU_INNER_P(TYPE, ##V); \ } \ @@ -436,8 +437,8 @@ class MenuItem_bool : public MenuEditItemBase { // Indexed items set a global index value #define _MENU_ITEM_N_P(TYPE, N, V...) do{ \ - _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ MenuItemBase::itemIndex = N; \ _MENU_INNER_P(TYPE, ##V); \ } \ @@ -446,8 +447,8 @@ class MenuItem_bool : public MenuEditItemBase { // Items with a unique string #define _MENU_ITEM_S_P(TYPE, S, V...) do{ \ - _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ MenuItemBase::itemString = S; \ _MENU_INNER_P(TYPE, ##V); \ } \ @@ -550,16 +551,17 @@ class MenuItem_bool : public MenuEditItemBase { // Indexed items set a global index value and optional data #define _CONFIRM_ITEM_P(PLABEL, V...) do { \ - _skipStatic = false; \ - if (_menuLineNr == _thisItemNr) \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ + } \ NEXT_ITEM(); \ }while(0) // Indexed items set a global index value #define _CONFIRM_ITEM_N_S_P(N, S, V...) do{ \ - _skipStatic = false; \ if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ MenuItemBase::init(N, S); \ _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ } \ diff --git a/Marlin/src/lcd/menu/menu_addon.h b/Marlin/src/lcd/menu/menu_addon.h index c276c8865be2..b6eb8e163493 100644 --- a/Marlin/src/lcd/menu/menu_addon.h +++ b/Marlin/src/lcd/menu/menu_addon.h @@ -25,6 +25,6 @@ #define MENU_ITEM_ADDON_START(X) do{ \ if (ui.should_draw() && _menuLineNr == _thisItemNr - 1) { \ - SETCURSOR(X, _lcdLineNr) + SETCURSOR_X(X) #define MENU_ITEM_ADDON_END() } }while(0) diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index ef3ad1ffed1d..26120fc5da6c 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -66,7 +66,7 @@ void menu_advanced_settings(); bar_percent += (int8_t)ui.encoderPosition; LIMIT(bar_percent, 0, 100); ui.encoderPosition = 0; - MenuItem_static::draw(0, GET_TEXT(MSG_PROGRESS_BAR_TEST), SS_CENTER|SS_INVERT); + MenuItem_static::draw(0, GET_TEXT(MSG_PROGRESS_BAR_TEST), SS_DEFAULT|SS_INVERT); lcd_put_int((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2, bar_percent); lcd_put_wchar('%'); lcd_moveto(0, LCD_HEIGHT - 1); ui.draw_progress_bar(bar_percent); } @@ -307,7 +307,7 @@ void menu_advanced_settings(); #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0) const uint8_t m = MenuItemBase::itemIndex; START_MENU(); - STATIC_ITEM_P(ui.get_preheat_label(m), SS_CENTER|SS_INVERT); + STATIC_ITEM_P(ui.get_preheat_label(m), SS_DEFAULT|SS_INVERT); BACK_ITEM(MSG_CONFIGURATION); #if HAS_FAN editable.uint8 = uint8_t(ui.material_preset[m].fan_speed); diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index b430e0448bda..1b11438f4c38 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -87,7 +87,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { _change_filament_mode = mode; _change_filament_extruder = extruder; START_MENU(); - if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_CENTER|SS_INVERT); + if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_DEFAULT|SS_INVERT); BACK_ITEM(MSG_BACK); #if PREHEAT_COUNT LOOP_L_N(m, PREHEAT_COUNT) @@ -266,7 +266,7 @@ void _lcd_pause_message(PGM_P const msg) { skip1 = !has2 && (LCD_HEIGHT) >= 5; START_SCREEN(); - STATIC_ITEM_P(pause_header(), SS_CENTER|SS_INVERT); // 1: Header + STATIC_ITEM_P(pause_header(), SS_DEFAULT|SS_INVERT); // 1: Header if (skip1) SKIP_ITEM(); // Move a single-line message down STATIC_ITEM_P(msg1); // 2: Message Line 1 if (has2) STATIC_ITEM_P(msg2); // 3: Message Line 2 diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 697d4b767e7b..b94be2e53f2f 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -205,7 +205,7 @@ void menu_info_board() { if (ui.use_click()) return ui.go_back(); START_SCREEN(); - STATIC_ITEM_P(PSTR(BOARD_INFO_NAME), SS_CENTER|SS_INVERT); // MyPrinterController + STATIC_ITEM_P(PSTR(BOARD_INFO_NAME), SS_DEFAULT|SS_INVERT); // MyPrinterController #ifdef BOARD_WEBSITE_URL STATIC_ITEM_P(PSTR(BOARD_WEBSITE_URL), SS_LEFT); // www.my3dprinter.com #endif @@ -237,7 +237,7 @@ void menu_info_board() { void menu_info_printer() { if (ui.use_click()) return ui.go_back(); START_SCREEN(); - STATIC_ITEM(MSG_MARLIN, SS_CENTER|SS_INVERT); // Marlin + STATIC_ITEM(MSG_MARLIN, SS_DEFAULT|SS_INVERT); // Marlin STATIC_ITEM_P(PSTR(SHORT_BUILD_VERSION)); // x.x.x-Branch STATIC_ITEM_P(PSTR(STRING_DISTRIBUTION_DATE)); // YYYY-MM-DD HH:MM STATIC_ITEM_P(PSTR(MACHINE_NAME)); // My3DPrinter diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index ac56ca0e524c..b117e0baa1dd 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -37,7 +37,7 @@ void menu_led_presets() { START_MENU(); #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_LED_PRESETS, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_LED_PRESETS, SS_DEFAULT|SS_INVERT); #endif BACK_ITEM(MSG_LED_CONTROL); ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white); diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index e9627b8411b4..304e95887784 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -131,7 +131,7 @@ inline void action_mmu2_choose(const uint8_t tool) { void menu_mmu2_choose_filament() { START_MENU(); #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_DEFAULT|SS_INVERT); #endif LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_choose(MenuItemBase::itemIndex); }); END_MENU(); @@ -145,7 +145,7 @@ void menu_mmu2_pause() { currentTool = mmu2.get_current_tool(); START_MENU(); #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_DEFAULT|SS_INVERT); #endif ACTION_ITEM(MSG_MMU2_RESUME, []{ mmuMenuWait = false; }); ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, []{ mmu2.unload(); }); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 60118a3017d7..622cd091c061 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -178,12 +178,12 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int START_MENU(); if (LCD_HEIGHT >= 4) { switch (axis) { - case X_AXIS: STATIC_ITEM(MSG_MOVE_X, SS_CENTER|SS_INVERT); break; - case Y_AXIS: STATIC_ITEM(MSG_MOVE_Y, SS_CENTER|SS_INVERT); break; - case Z_AXIS: STATIC_ITEM(MSG_MOVE_Z, SS_CENTER|SS_INVERT); break; + case X_AXIS: STATIC_ITEM(MSG_MOVE_X, SS_DEFAULT|SS_INVERT); break; + case Y_AXIS: STATIC_ITEM(MSG_MOVE_Y, SS_DEFAULT|SS_INVERT); break; + case Z_AXIS: STATIC_ITEM(MSG_MOVE_Z, SS_DEFAULT|SS_INVERT); break; default: TERN_(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin = current_position.e); - STATIC_ITEM(MSG_MOVE_E, SS_CENTER|SS_INVERT); + STATIC_ITEM(MSG_MOVE_E, SS_DEFAULT|SS_INVERT); break; } } diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 0b800abc3912..a4ac1465ea25 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -341,11 +341,11 @@ void MarlinUI::draw_status_screen() { } // Draw a static item with no left-right margin required. Centered by default. -void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { menu_item(row); tft_string.set(pstr, itemIndex, itemString); - if (valstr) - tft_string.add(valstr); + if (vstr) + tft_string.add(vstr); tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); } diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 3eeed903cb17..c9f0bfd0e9b1 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -345,11 +345,11 @@ void MarlinUI::draw_status_screen() { } // Draw a static item with no left-right margin required. Centered by default. -void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { +void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { menu_item(row); tft_string.set(pstr, itemIndex, itemString); - if (valstr) - tft_string.add(valstr); + if (vstr) + tft_string.add(vstr); tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); } From e3c0891d2b6f956ab6dbb8b27e37f8215a1d4903 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 8 Aug 2020 20:40:12 -0300 Subject: [PATCH 312/483] Fix compiler search in non-default PIO installs (#18960) --- buildroot/share/PlatformIO/scripts/common-dependencies.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index e09c639ad781..6c1b571bf16b 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -156,16 +156,16 @@ def search_compiler(): # Find the current platform compiler by searching the $PATH if env['PLATFORM'] == 'win32': path_separator = ';' - path_regex = r'platformio\\packages.*\\bin' + path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + r'.*\\bin' gcc = "g++.exe" else: path_separator = ':' - path_regex = r'platformio/packages.*/bin' + path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + r'.*/bin' gcc = "g++" # Search for the compiler for path in env['ENV']['PATH'].split(path_separator): - if not re.search(path_regex, path): + if not re.search(path_regex, path, re.IGNORECASE): continue for file in os.listdir(path): if not file.endswith(gcc): From 2ef6c8ba970a217259f1b108eee42086c7d8faf4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 8 Aug 2020 20:45:34 -0300 Subject: [PATCH 313/483] Marlin Color UI for STM32F1 (SPI) (#18958) --- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 6 +- Marlin/src/HAL/STM32F1/tft/tft_spi.cpp | 144 ++++++++++++++++++ Marlin/src/HAL/STM32F1/tft/tft_spi.h | 65 ++++++++ Marlin/src/HAL/STM32F1/tft/xpt2046.cpp | 10 +- Marlin/src/lcd/tft/ili9488.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 9 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 31 ++++ 7 files changed, 253 insertions(+), 16 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/tft/tft_spi.cpp create mode 100644 Marlin/src/HAL/STM32F1/tft/tft_spi.h diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index 0a1d6c820208..09d79030b53e 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -26,12 +26,8 @@ #undef SD_CHECK_AND_RETRY #endif -#if HAS_SPI_TFT - #error "Sorry! SPI TFT displays are not available for HAL/STM32F1 (yet)." -#endif - // This platform has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) && !HAS_FSMC_TFT +#if ENABLED(TOUCH_SCREEN) && !HAS_FSMC_TFT && !HAS_SPI_TFT #undef TOUCH_SCREEN #undef TOUCH_SCREEN_CALIBRATION #define HAS_TOUCH_XPT2046 1 diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp new file mode 100644 index 000000000000..a64f90f2b50b --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp @@ -0,0 +1,144 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT + +#include "tft_spi.h" + +// TFT_SPI tft; + +SPIClass TFT_SPI::SPIx(1); + +#define SPI_TFT_CS_H OUT_WRITE(TFT_CS_PIN, HIGH) +#define SPI_TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW) + +#define SPI_TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH) +#define SPI_TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW) + +#define SPI_TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH) +#define SPI_TFT_RST_L OUT_WRITE(TFT_RST_PIN, LOW) + +#define SPI_TFT_BLK_H OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH) +#define SPI_TFT_BLK_L OUT_WRITE(TFT_BACKLIGHT_PIN, LOW) + +void TFT_SPI::Init() { + #if PIN_EXISTS(TFT_RESET) + // OUT_WRITE(TFT_RESET_PIN, HIGH); + SPI_TFT_RST_H; + delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + // OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + SPI_TFT_BLK_H; + #endif + + SPI_TFT_DC_H; + SPI_TFT_CS_H; + + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + #if SPI_DEVICE == 1 + #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 + #else + #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 + #endif + uint8_t clock; + uint8_t spiRate = SPI_FULL_SPEED; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX ; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + SPIx.setModule(1); + SPIx.setClockDivider(clock); + SPIx.setBitOrder(MSBFIRST); + SPIx.setDataMode(SPI_MODE0); +} + +void TFT_SPI::DataTransferBegin(uint16_t DataSize) { + SPIx.setDataSize(DataSize); + SPIx.begin(); + SPI_TFT_CS_L; +} + +uint32_t TFT_SPI::GetID() { + uint32_t id; + id = ReadID(LCD_READ_ID); + + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + +uint32_t TFT_SPI::ReadID(uint16_t Reg) { + #if !PIN_EXISTS(TFT_MISO) + return 0; + #else + uint16_t d = 0; + DataTransferBegin(DATASIZE_8BIT); + WriteReg(Reg); + + SPI.read((uint8_t*)&d, 1); //dummy read + SPI.read((uint8_t*)&d, 1); + + DataTransferEnd(); + + return d >> 7; + #endif +} + +bool TFT_SPI::isBusy() { + return false; +} + +void TFT_SPI::Abort() { + DataTransferEnd(); +} + +void TFT_SPI::Transmit(uint16_t Data) { + SPIx.send(Data); +} + +void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + DataTransferBegin(); + SPI_TFT_DC_H; + if (MemoryIncrease == DMA_MINC_ENABLE) { + SPIx.dmaSend(Data, Count, true); + } + else { + SPIx.dmaSend(Data, Count, false); + } + + DataTransferEnd(); +} + +#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.h b/Marlin/src/HAL/STM32F1/tft/tft_spi.h new file mode 100644 index 000000000000..1d1c9b444c8e --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.h @@ -0,0 +1,65 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#include + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#define DATASIZE_8BIT DATA_SIZE_8BIT +#define DATASIZE_16BIT DATA_SIZE_16BIT +#define TFT_IO TFT_SPI + +#define DMA_MINC_ENABLE 1 +#define DMA_MINC_DISABLE 0 + +class TFT_SPI { +private: + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + +public: + static SPIClass SPIx; + + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort(); + + static void DataTransferBegin(uint16_t DataWidth = DATA_SIZE_16BIT); + static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); SPIx.end(); }; + static void DataTransferAbort(); + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg) { WRITE(TFT_A0_PIN, LOW); Transmit(Reg); WRITE(TFT_A0_PIN, HIGH); } + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } + static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } +}; diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp index dc34b0d5b506..e06cace7419a 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -65,9 +65,7 @@ void XPT2046::Init() { SET_INPUT(TOUCH_INT_PIN); #endif - #if ENABLED(TOUCH_BUTTONS_HW_SPI) - touch_spi_init(SPI_SPEED_6); - #endif + TERN_(TOUCH_BUTTONS_HW_SPI, touch_spi_init(SPI_SPEED_6)); // Read once to enable pendrive status pin getRawData(XPT2046_X); @@ -95,12 +93,14 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { uint16_t data[3]; DataTransferBegin(); + TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.begin()); for (uint16_t i = 0; i < 3 ; i++) { IO(coordinate); data[i] = (IO() << 4) | (IO() >> 4); } + TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.end()); DataTransferEnd(); uint16_t delta01 = delta(data[0], data[1]), @@ -114,14 +114,12 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { } uint16_t XPT2046::IO(uint16_t data) { - TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); + return TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); } #if ENABLED(TOUCH_BUTTONS_HW_SPI) uint16_t XPT2046::HardwareIO(uint16_t data) { - SPIx.begin(); uint16_t result = SPIx.transfer(data); - SPIx.end(); return result; } #endif diff --git a/Marlin/src/lcd/tft/ili9488.h b/Marlin/src/lcd/tft/ili9488.h index 135f94a57ffc..6aad70486553 100644 --- a/Marlin/src/lcd/tft/ili9488.h +++ b/Marlin/src/lcd/tft/ili9488.h @@ -39,7 +39,9 @@ #define ILI9488_ORIENTATION_DOWN ILI9488_MADCTL_MX // 320x480 ; Cable on the upper side #define ILI9488_COLOR_BGR -#define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT +#ifndef ILI9488_ORIENTATION + #define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT +#endif #define ILI9488_MADCTL_DATA (ILI9488_ORIENTATION | TERN(ILI9488_COLOR_BGR, ILI9488_MADCTL_BGR, ILI9488_MADCTL_RGB)) #define ILI9488_NOP 0x00 // No Operation diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index d314c30fcdf1..afa9354aa2ab 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -225,10 +225,10 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define XPT2046_X_CALIBRATION -17181 - #define XPT2046_Y_CALIBRATION 11434 - #define XPT2046_X_OFFSET 501 - #define XPT2046_Y_OFFSET -9 + #define XPT2046_X_CALIBRATION 17880 + #define XPT2046_Y_CALIBRATION -12234 + #define XPT2046_X_OFFSET -45 + #define XPT2046_Y_OFFSET 349 #define TOUCH_CS_PIN PA7 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK @@ -237,6 +237,7 @@ #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 + #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV #endif #define SPI_FLASH diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 9f4e57dd704e..4552f8cd9fe5 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -344,6 +344,37 @@ #define MKS_LCD12864B #undef SHOW_BOOTSCREEN + #elif ENABLED(TFT_480x320_SPI) + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 + + #define TOUCH_CS_PIN PE14 // SPI1_NSS + #define TOUCH_SCK_PIN PA5 // SPI1_SCK + #define TOUCH_MISO_PIN PA6 // SPI1_MISO + #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI + + #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 + + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 From 58cfdb8f57bd71dd7a5ecaa8dc04388fd6944a5a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 9 Aug 2020 00:10:45 +0000 Subject: [PATCH 314/483] [cron] Bump distribution date (2020-08-09) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index a2bc2337f47c..33cd24dd0219 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-08" + #define STRING_DISTRIBUTION_DATE "2020-08-09" #endif /** From 0a1b8659871f681464f24c40b16aa64cd2f7ca8e Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 8 Aug 2020 21:24:31 -0300 Subject: [PATCH 315/483] W25QXX SPI Flash support (#18897) Co-authored-by: Scott Lahteine --- Marlin/src/gcode/control/M993_M994.cpp | 92 +++++++++++++++++++ Marlin/src/gcode/gcode.cpp | 5 + Marlin/src/gcode/gcode.h | 7 ++ .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 2 + .../lcd/extui/lib/mks_ui/SPIFlashStorage.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 1 - .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 4 + .../lib/mks_ui/tft_lvgl_configuration.cpp | 1 - .../{lcd/extui/lib/mks_ui => libs}/W25Qxx.cpp | 44 ++++----- .../{lcd/extui/lib/mks_ui => libs}/W25Qxx.h | 50 +--------- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 5 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 5 +- 14 files changed, 140 insertions(+), 84 deletions(-) create mode 100644 Marlin/src/gcode/control/M993_M994.cpp rename Marlin/src/{lcd/extui/lib/mks_ui => libs}/W25Qxx.cpp (90%) rename Marlin/src/{lcd/extui/lib/mks_ui => libs}/W25Qxx.h (67%) diff --git a/Marlin/src/gcode/control/M993_M994.cpp b/Marlin/src/gcode/control/M993_M994.cpp new file mode 100644 index 000000000000..4e13aa9d77df --- /dev/null +++ b/Marlin/src/gcode/control/M993_M994.cpp @@ -0,0 +1,92 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ALL(HAS_SPI_FLASH, SDSUPPORT, MARLIN_DEV_MODE) + +#include "../gcode.h" +#include "../../sd/cardreader.h" +#include "../../libs/W25Qxx.h" + +/** + * M993: Backup SPI Flash to SD + */ +void GcodeSuite::M993() { + if (!card.isMounted()) card.mount(); + + char fname[] = "spiflash.bin"; + card.openFileWrite(fname); + if (!card.isFileOpen()) { + SERIAL_ECHOLNPAIR("Failed to open ", fname, " to write."); + return; + } + + W25QXXFlash W25QXX; + + uint8_t buf[1024]; + uint32_t addr = 0; + W25QXX.init(SPI_QUARTER_SPEED); + SERIAL_ECHOPGM("Save SPI Flash"); + while (addr < SPI_FLASH_SIZE) { + W25QXX.SPI_FLASH_BufferRead(buf, addr, COUNT(buf)); + addr += COUNT(buf); + card.write(buf, COUNT(buf)); + if (addr % (COUNT(buf) * 10) == 0) SERIAL_CHAR('.'); + } + SERIAL_ECHOLNPGM(" done"); + + card.closefile(); +} + +/** + * M994: Load a backup from SD to SPI Flash + */ +void GcodeSuite::M994() { + if (!card.isMounted()) card.mount(); + + char fname[] = "spiflash.bin"; + card.openFileRead(fname); + if (!card.isFileOpen()) { + SERIAL_ECHOLNPAIR("Failed to open ", fname, " to read."); + return; + } + + W25QXXFlash W25QXX; + + uint8_t buf[1024]; + uint32_t addr = 0; + W25QXX.init(SPI_QUARTER_SPEED); + W25QXX.SPI_FLASH_BulkErase(); + SERIAL_ECHOPGM("Load SPI Flash"); + while(addr < SPI_FLASH_SIZE) { + card.read(buf, COUNT(buf)); + W25QXX.SPI_FLASH_BufferWrite(buf, addr, COUNT(buf)); + addr += COUNT(buf); + if (addr % (COUNT(buf) * 10) == 0) SERIAL_CHAR('.'); + } + SERIAL_ECHOLNPGM(" done"); + + card.closefile(); +} + +#endif // HAS_SPI_FLASH && SDSUPPORT && MARLIN_DEV_MODE diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index f1692ee807c6..2309953f8815 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -871,6 +871,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe #endif + #if BOTH(HAS_SPI_FLASH, SDSUPPORT) + case 993: M993(); break; // M993: Backup SPI Flash to SD + case 994: M994(); break; // M994: Load a Backup from SD to SPI Flash + #endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) case 995: M995(); break; // M995: Touch screen calibration for TFT display #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7e89e809d006..783781b9c305 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -276,6 +276,8 @@ * ************ Custom codes - This can change to suit future G-code regulations * G425 - Calibrate using a conductive object. (Requires CALIBRATION_GCODE) * M928 - Start SD logging: "M928 filename.gco". Stop with M29. (Requires SDSUPPORT) + * M993 - Backup SPI Flash to SD + * M994 - Load a Backup from SD to SPI Flash * M995 - Touch screen calibration for TFT display * M997 - Perform in-application firmware update * M999 - Restart after being stopped by error @@ -846,6 +848,11 @@ class GcodeSuite { TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); + #if BOTH(HAS_SPI_FLASH, SDSUPPORT) + static void M993(); + static void M994(); + #endif + TERN_(PLATFORM_M997_SUPPORT, static void M997()); static void M999(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp index 9d3adc1bab93..979c916e5cad 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -27,6 +27,8 @@ #include "../../../../inc/MarlinConfig.h" #include "SPIFlashStorage.h" +extern W25QXXFlash W25QXX; + uint8_t SPIFlashStorage::m_pageData[SPI_FLASH_PageSize]; uint32_t SPIFlashStorage::m_currentPage; uint16_t SPIFlashStorage::m_pageDataUsed; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h index 5a124137095a..98c8067bd3c2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h @@ -21,7 +21,7 @@ */ #pragma once -#include "W25Qxx.h" +#include "../../../../libs/W25Qxx.h" #define HAS_SPI_FLASH_COMPRESSION 1 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index e8899b9ad122..5d87eb9f8736 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -27,7 +27,6 @@ #include "SPI_TFT.h" #endif -#include "W25Qxx.h" #include "tft_lvgl_configuration.h" #include "pic_manager.h" @@ -50,6 +49,7 @@ #include "../../../../feature/pause.h" #endif +W25QXXFlash W25QXX; CFG_ITMES gCfgItems; UI_CFG uiCfg; DISP_STATE_STACK disp_state_stack; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index 00371d7ab5ab..a35ae29701fb 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -29,7 +29,6 @@ #include "tft_lvgl_configuration.h" #include "draw_ready_print.h" -#include "W25Qxx.h" #include "mks_hardware_test.h" #include "draw_ui.h" #include "pic_manager.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp index 072213e499ac..447303a88782 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -29,10 +29,10 @@ #include "mks_hardware_test.h" #include "SPIFlashStorage.h" -#include "W25Qxx.h" +#include "../../../../libs/W25Qxx.h" -#include "../../../../MarlinCore.h" #include "../../../../sd/cardreader.h" +#include "../../../../MarlinCore.h" extern uint16_t DeviceCode; extern unsigned char bmp_public_buf[17 * 1024]; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 354e11a540d4..4d9d08a9b4e3 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -23,6 +23,8 @@ #include "../../../../inc/MarlinConfig.h" +#include "../../../../libs/W25Qxx.h" + #include #include @@ -154,6 +156,8 @@ extern void spi_flash_read_test(); extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); +extern W25QXXFlash W25QXX; + #ifdef __cplusplus } /* C-declarations for C++ */ #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index fc5b8c1bf24e..81b50a101871 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -35,7 +35,6 @@ #include "tft_lvgl_configuration.h" #include "draw_ready_print.h" -#include "W25Qxx.h" #include "pic_manager.h" #include "mks_hardware_test.h" #include "draw_ui.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp similarity index 90% rename from Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp rename to Marlin/src/libs/W25Qxx.cpp index 60b4d0b7ea98..d51dfb819de9 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -19,13 +19,12 @@ * along with this program. If not, see . * */ -#include "../../../../inc/MarlinConfigPre.h" -#if 1 // ENABLED(SPI_FLASH) -#if HAS_TFT_LVGL_UI +#include "../inc/MarlinConfig.h" + +#if HAS_SPI_FLASH #include -#include "../../../../inc/MarlinConfig.h" #include "W25Qxx.h" @@ -45,9 +44,7 @@ #define W25QXX_CS_H OUT_WRITE(SPI_FLASH_CS_PIN, HIGH) #define W25QXX_CS_L OUT_WRITE(SPI_FLASH_CS_PIN, LOW) -ext_FLASH W25QXX; - -void ext_FLASH::init(uint8_t spiRate) { +void W25QXXFlash::init(uint8_t spiRate) { OUT_WRITE(SPI_FLASH_CS_PIN, HIGH); @@ -85,12 +82,12 @@ void ext_FLASH::init(uint8_t spiRate) { * * @details */ -uint8_t ext_FLASH::spi_flash_Rec() { +uint8_t W25QXXFlash::spi_flash_Rec() { uint8_t returnByte = SPI.transfer(ff); return returnByte; } -uint8_t ext_FLASH::spi_flash_read_write_byte(uint8_t data) { +uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { uint8_t returnByte = SPI.transfer(data); return returnByte; } @@ -104,7 +101,7 @@ uint8_t ext_FLASH::spi_flash_read_write_byte(uint8_t data) { * * @details Uses DMA */ -void ext_FLASH::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); } +void W25QXXFlash::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); } /** * @brief Send a single byte on SPI port @@ -113,7 +110,7 @@ void ext_FLASH::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0 * * @details */ -void ext_FLASH::spi_flash_Send(uint8_t b) { SPI.send(b); } +void W25QXXFlash::spi_flash_Send(uint8_t b) { SPI.send(b); } /** * @brief Write token and then write from 512 byte buffer to SPI (for SD card) @@ -123,12 +120,12 @@ void ext_FLASH::spi_flash_Send(uint8_t b) { SPI.send(b); } * * @details Use DMA */ -void ext_FLASH::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { +void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { SPI.send(token); SPI.dmaSend(const_cast(buf), 512); } -uint16_t ext_FLASH::W25QXX_ReadID(void) { +uint16_t W25QXXFlash::W25QXX_ReadID(void) { uint16_t Temp = 0; W25QXX_CS_L; spi_flash_Send(0x90); @@ -141,7 +138,7 @@ uint16_t ext_FLASH::W25QXX_ReadID(void) { return Temp; } -void ext_FLASH::SPI_FLASH_WriteEnable(void) { +void W25QXXFlash::SPI_FLASH_WriteEnable(void) { /* Select the FLASH: Chip Select low */ W25QXX_CS_L; /* Send "Write Enable" instruction */ @@ -159,7 +156,7 @@ void ext_FLASH::SPI_FLASH_WriteEnable(void) { * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_WaitForWriteEnd(void) { +void W25QXXFlash::SPI_FLASH_WaitForWriteEnd(void) { uint8_t FLASH_Status = 0; /* Select the FLASH: Chip Select low */ @@ -178,7 +175,7 @@ void ext_FLASH::SPI_FLASH_WaitForWriteEnd(void) { W25QXX_CS_H; } -void ext_FLASH::SPI_FLASH_SectorErase(uint32_t SectorAddr) { +void W25QXXFlash::SPI_FLASH_SectorErase(uint32_t SectorAddr) { /* Send write enable instruction */ SPI_FLASH_WriteEnable(); @@ -200,7 +197,7 @@ void ext_FLASH::SPI_FLASH_SectorErase(uint32_t SectorAddr) { SPI_FLASH_WaitForWriteEnd(); } -void ext_FLASH::SPI_FLASH_BlockErase(uint32_t BlockAddr) { +void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { SPI_FLASH_WriteEnable(); W25QXX_CS_L; /* Send Sector Erase instruction */ @@ -224,7 +221,7 @@ void ext_FLASH::SPI_FLASH_BlockErase(uint32_t BlockAddr) { * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_BulkErase(void) { +void W25QXXFlash::SPI_FLASH_BulkErase(void) { /* Send write enable instruction */ SPI_FLASH_WriteEnable(); @@ -253,7 +250,7 @@ void ext_FLASH::SPI_FLASH_BulkErase(void) { * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { +void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { /* Enable the write access to the FLASH */ SPI_FLASH_WriteEnable(); @@ -296,7 +293,7 @@ void ext_FLASH::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16 * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { +void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % SPI_FLASH_PageSize; @@ -361,7 +358,7 @@ void ext_FLASH::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint * Output : None * Return : None *******************************************************************************/ -void ext_FLASH::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { +void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { /* Select the FLASH: Chip Select low */ W25QXX_CS_L; @@ -389,7 +386,4 @@ void ext_FLASH::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16 W25QXX_CS_H; } -void ext_FLASH::lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);} - -#endif // HAS_TFT_LVGL_UI -#endif // 1 ... SPI_FLASH +#endif // HAS_SPI_FLASH diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h b/Marlin/src/libs/W25Qxx.h similarity index 67% rename from Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h rename to Marlin/src/libs/W25Qxx.h index 88d5d6c2f549..81e964345010 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h +++ b/Marlin/src/libs/W25Qxx.h @@ -52,49 +52,7 @@ #define SPI_FLASH_PageSize 256 #define SPI_FLASH_PerWritePageSize 256 -#if 0 - - #define PIC_NAME_MAX_LEN 50 - - #define LOGO_MAX_SIZE (300*1024) - #define TITLELOGO_MAX_SIZE (150*1024) - #define DEFAULT_VIEW_MAX_SIZE (200*200*2) - #define FLASH_VIEW_MAX_SIZE (200*200*2) - - //Robin 2 - #define PIC_NAME_ADDR 0x003000 - #define PIC_SIZE_ADDR 0x007000 - #define PIC_COUNTER_ADDR 0x008000 - #define PIC_LOGO_ADDR 0x009000 - //#define PIC_DATA_ADDR 0x02f000 - - #define DEFAULT_VIEW_ADDR 0XC5800 - #define BAK_VIEW_ADDR (DEFAULT_VIEW_ADDR+90*1024) - #define PIC_ICON_LOGO_ADDR (BAK_VIEW_ADDR+80*1024) - - #define PIC_DATA_ADDR (PIC_ICON_LOGO_ADDR+350*1024) - - #define FONTINFOADDR 0x600000 - #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 - #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024 - - #define PER_PIC_MAX_SPACE (32*1024) - - union union32 { - uint8_t bytes[4]; - uint32_t dwords; - }; - - struct pic_msg { - uint8_t name[PIC_NAME_MAX_LEN]; - union union32 size; - }; - - typedef struct pic_msg PIC_MSG; - -#endif // if 0 - -class ext_FLASH { +class W25QXXFlash { public: void init(uint8_t spiRate); static uint8_t spi_flash_Rec(); @@ -111,14 +69,8 @@ class ext_FLASH { static void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); static void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); static void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); - //uint32_t lv_get_pic_addr(uint8_t *Pname); - void lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); }; -extern ext_FLASH W25QXX; - -//extern uint32_t lv_get_pic_addr(uint8_t *Pname); - //#ifdef __cplusplus //} /* C-declarations for C++ */ //#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index afa9354aa2ab..16040643520b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -240,8 +240,9 @@ #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV #endif -#define SPI_FLASH -#if ENABLED(SPI_FLASH) +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB +#if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 4552f8cd9fe5..be363e45374b 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -398,8 +398,9 @@ #endif // HAS_SPI_LCD -#define SPI_FLASH -#if ENABLED(SPI_FLASH) +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB +#if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 #define W25QXX_MISO_PIN PB14 From 852e5ae0421810ecc6f44631237208030e70751f Mon Sep 17 00:00:00 2001 From: sherwin-dc <59867245+sherwin-dc@users.noreply.github.com> Date: Sun, 9 Aug 2020 09:00:42 +0800 Subject: [PATCH 316/483] Password via G-code and MarlinUI (#18399) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 31 +++ Marlin/src/MarlinCore.cpp | 14 +- Marlin/src/core/language.h | 7 + Marlin/src/core/macros.h | 51 +++-- Marlin/src/feature/password/password.cpp | 58 ++++++ Marlin/src/feature/password/password.h | 57 ++++++ .../src/gcode/feature/password/M510-M512.cpp | 83 ++++++++ Marlin/src/gcode/gcode.cpp | 25 +++ Marlin/src/gcode/gcode.h | 13 ++ Marlin/src/inc/SanityCheck.h | 11 ++ Marlin/src/lcd/language/language_en.h | 11 ++ Marlin/src/lcd/menu/menu_advanced.cpp | 8 + Marlin/src/lcd/menu/menu_main.cpp | 8 +- Marlin/src/lcd/menu/menu_password.cpp | 184 ++++++++++++++++++ Marlin/src/module/settings.cpp | 42 +++- .../PlatformIO/scripts/common-dependencies.h | 3 + buildroot/tests/DUE-tests | 2 +- buildroot/tests/rambo-tests | 1 + platformio.ini | 4 + 19 files changed, 588 insertions(+), 25 deletions(-) create mode 100644 Marlin/src/feature/password/password.cpp create mode 100644 Marlin/src/feature/password/password.h create mode 100644 Marlin/src/gcode/feature/password/M510-M512.cpp create mode 100644 Marlin/src/lcd/menu/menu_password.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 3ad7dfdab339..3b6155f969de 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1642,6 +1642,37 @@ */ //#define PRINTCOUNTER +/** + * Password + * + * Set a numerical password for the printer which can be requested: + * + * - When the printer boots up + * - Upon opening the 'Print from Media' Menu + * - When SD printing is completed or aborted + * + * The following G-codes can be used: + * + * M510 - Lock Printer. Blocks all commands except M511. + * M511 - Unlock Printer. + * M512 - Set, Change and Remove Password. + * + * If you forget the password and get locked out you'll need to re-flash + * the firmware with the feature disabled, reset EEPROM, and (optionally) + * re-flash the firmware again with this feature enabled. + */ +//#define PASSWORD_FEATURE +#if ENABLED(PASSWORD_FEATURE) + #define PASSWORD_LENGTH 4 // (#) Number of digits (1-9). 3 or 4 is recommended + #define PASSWORD_ON_STARTUP + #define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P command. Disable to prevent brute-force attack. + #define PASSWORD_CHANGE_GCODE // Change the password with M512 P N. + //#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent gcodes from running + //#define PASSWORD_AFTER_SD_PRINT_END + //#define PASSWORD_AFTER_SD_PRINT_ABORT + //#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE +#endif + //============================================================================= //============================= LCD and SD support ============================ //============================================================================= diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index a8c4407be29a..39530395eb48 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -213,6 +213,10 @@ #include "libs/L64XX/L64XX_Marlin.h" #endif +#if ENABLED(PASSWORD_FEATURE) + #include "feature/password/password.h" +#endif + PGMSTR(NUL_STR, ""); PGMSTR(M112_KILL_STR, "M112 Shutdown"); PGMSTR(G28_STR, "G28"); @@ -452,11 +456,15 @@ void startOrResumeJob() { #ifdef EVENT_GCODE_SD_STOP queue.inject_P(PSTR(EVENT_GCODE_SD_STOP)); #endif + + TERN_(PASSWORD_AFTER_SD_PRINT_ABORT, password.lock_machine()); } inline void finishSDPrinting() { - if (queue.enqueue_one_P(PSTR("M1001"))) + if (queue.enqueue_one_P(PSTR("M1001"))) { marlin_state = MF_RUNNING; + TERN_(PASSWORD_AFTER_SD_PRINT_END, password.lock_machine()); + } } #endif // SDSUPPORT @@ -1205,6 +1213,10 @@ void setup() { SETUP_RUN(tft_lvgl_init()); #endif + #if ENABLED(PASSWORD_ON_STARTUP) + SETUP_RUN(password.lock_machine()); // Will not proceed until correct password provided + #endif + marlin_state = MF_RUNNING; SETUP_LOG("setup() completed."); diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 5208b3e1bfb6..48431455f0ff 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -266,6 +266,13 @@ #define STR_DEBUG_COMMUNICATION "COMMUNICATION" #define STR_DEBUG_LEVELING "LEVELING" +#define STR_PRINTER_LOCKED "Printer locked! (Unlock with M511 or LCD)" +#define STR_WRONG_PASSWORD "Incorrect Password" +#define STR_PASSWORD_TOO_LONG "Password too long" +#define STR_PASSWORD_REMOVED "Password removed" +#define STR_REMINDER_SAVE_SETTINGS "Remember to save!" +#define STR_PASSWORD_SET "Password is " + // LCD Menu Messages #define LANGUAGE_DATA_INCL_(M) STRINGIFY_(fontdata/langdata_##M.h) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 3bd273872aa7..5fc1081019b5 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -342,15 +342,22 @@ #endif // Macros for adding -#define INC_0 1 -#define INC_1 2 -#define INC_2 3 -#define INC_3 4 -#define INC_4 5 -#define INC_5 6 -#define INC_6 7 -#define INC_7 8 -#define INC_8 9 +#define INC_0 1 +#define INC_1 2 +#define INC_2 3 +#define INC_3 4 +#define INC_4 5 +#define INC_5 6 +#define INC_6 7 +#define INC_7 8 +#define INC_8 9 +#define INC_9 10 +#define INC_10 11 +#define INC_11 12 +#define INC_12 13 +#define INC_13 14 +#define INC_14 15 +#define INC_15 16 #define INCREMENT_(n) INC_##n #define INCREMENT(n) INCREMENT_(n) @@ -367,16 +374,22 @@ #define ADD10(N) ADD5(ADD5(N)) // Macros for subtracting -#define DEC_0 0 -#define DEC_1 0 -#define DEC_2 1 -#define DEC_3 2 -#define DEC_4 3 -#define DEC_5 4 -#define DEC_6 5 -#define DEC_7 6 -#define DEC_8 7 -#define DEC_9 8 +#define DEC_0 0 +#define DEC_1 0 +#define DEC_2 1 +#define DEC_3 2 +#define DEC_4 3 +#define DEC_5 4 +#define DEC_6 5 +#define DEC_7 6 +#define DEC_8 7 +#define DEC_9 8 +#define DEC_10 9 +#define DEC_11 10 +#define DEC_12 11 +#define DEC_13 12 +#define DEC_14 13 +#define DEC_15 14 #define DECREMENT_(n) DEC_##n #define DECREMENT(n) DECREMENT_(n) diff --git a/Marlin/src/feature/password/password.cpp b/Marlin/src/feature/password/password.cpp new file mode 100644 index 000000000000..c519ee7c9c46 --- /dev/null +++ b/Marlin/src/feature/password/password.cpp @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(PASSWORD_FEATURE) + +#include "password.h" +#include "../../gcode/gcode.h" +#include "../../core/serial.h" + +Password password; + +// public: +bool Password::is_set, Password::is_locked; +uint32_t Password::value, Password::value_entry; + +// +// Authenticate user with password. +// Called from Setup, after SD Prinitng Stops/Aborts, and M510 +// +void Password::lock_machine() { + is_locked = true; + TERN_(HAS_LCD_MENU, authenticate_user(ui.status_screen, screen_password_entry)); +} + +// +// Authentication check +// +void Password::authentication_check() { + if (value_entry == value) + is_locked = false; + else + SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); + + TERN_(HAS_LCD_MENU, authentication_done()); +} + +#endif // PASSWORD_FEATURE diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h new file mode 100644 index 000000000000..66f1c70ba314 --- /dev/null +++ b/Marlin/src/feature/password/password.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../lcd/ultralcd.h" + +class Password { +public: + static bool is_set, is_locked; + static uint32_t value, value_entry; + + Password() { is_locked = false; } + + static void lock_machine(); + + #if HAS_LCD_MENU + static void access_menu_password(); + static void authentication_check(); + static void authentication_done(); + static void media_gatekeeper(); + + private: + static void authenticate_user(const screenFunc_t, const screenFunc_t); + static void menu_password(); + static void menu_password_entry(); + static void screen_password_entry(); + static void screen_set_password(); + static void start_over(); + + static void digit_entered(); + static void set_password_done(); + static void menu_password_report(); + + static void remove_password(); + #endif +}; + +extern Password password; diff --git a/Marlin/src/gcode/feature/password/M510-M512.cpp b/Marlin/src/gcode/feature/password/M510-M512.cpp new file mode 100644 index 000000000000..bcdeb7b91ccd --- /dev/null +++ b/Marlin/src/gcode/feature/password/M510-M512.cpp @@ -0,0 +1,83 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(PASSWORD_FEATURE) + +#include "../../../feature/password/password.h" +#include "../../../core/serial.h" +#include "../../gcode.h" + +// +// M510: Lock Printer +// +void GcodeSuite::M510() { + password.lock_machine(); +} + +// +// M511: Unlock Printer +// +#if ENABLED(PASSWORD_UNLOCK_GCODE) + + void GcodeSuite::M511() { + if (password.is_locked) { + password.value_entry = parser.ulongval('P'); + password.authentication_check(); + } + } + +#endif // PASSWORD_UNLOCK_GCODE + +// +// M512: Set/Change/Remove Password +// +#if ENABLED(PASSWORD_CHANGE_GCODE) + + void GcodeSuite::M512() { + if (password.is_set && parser.ulongval('P') != password.value) { + SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); + return; + } + + if (parser.seenval('N')) { + password.value_entry = parser.ulongval('N'); + + if (password.value_entry < CAT(1e, PASSWORD_LENGTH)) { + password.is_set = true; + password.value = password.value_entry; + SERIAL_ECHOLNPAIR(STR_PASSWORD_SET, password.value); // TODO: Update password.string + } + else + SERIAL_ECHOLNPGM(STR_PASSWORD_TOO_LONG); + } + else { + password.is_set = false; + SERIAL_ECHOLNPGM(STR_PASSWORD_REMOVED); + } + SERIAL_ECHOLNPGM(STR_REMINDER_SAVE_SETTINGS); + } + +#endif // PASSWORD_CHANGE_GCODE + +#endif // PASSWORD_FEATURE diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 2309953f8815..840df54f6a76 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -57,6 +57,10 @@ GcodeSuite gcode; #include "../feature/spindle_laser.h" #endif +#if ENABLED(PASSWORD_FEATURE) + #include "../feature/password/password.h" +#endif + #include "../MarlinCore.h" // for idle() // Inactivity shutdown @@ -241,6 +245,17 @@ void GcodeSuite::dwell(millis_t time) { void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { KEEPALIVE_STATE(IN_HANDLER); + /** + * Block all Gcodes except M511 Unlock Printer, if printer is locked + * Will still block Gcodes if M511 is disabled, in which case the printer should be unlocked via LCD Menu + */ + #if ENABLED(PASSWORD_FEATURE) + if (password.is_locked && !(parser.command_letter == 'M' && parser.codenum == 511)) { + SERIAL_ECHO_MSG(STR_PRINTER_LOCKED); + return; + } + #endif + // Handle a known G, M, or T switch (parser.command_letter) { case 'G': switch (parser.codenum) { @@ -736,6 +751,16 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 504: M504(); break; // M504: Validate EEPROM contents #endif + #if ENABLED(PASSWORD_FEATURE) + case 510: M510(); break; // M510: Lock Printer + #if ENABLED(PASSWORD_UNLOCK_GCODE) + case 511: M511(); break; // M511: Unlock Printer + #endif + #if ENABLED(PASSWORD_CHANGE_GCODE) + case 512: M512(); break; + #endif // M512: Set/Change/Remove Password + #endif + #if ENABLED(SDSUPPORT) case 524: M524(); break; // M524: Abort the current SD print job #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 783781b9c305..e04cd637eb92 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -225,6 +225,9 @@ * M502 - Revert to the default "factory settings". ** Does not write them to EEPROM! ** * M503 - Print the current settings (in memory): "M503 S". S0 specifies compact output. * M504 - Validate EEPROM contents. (Requires EEPROM_SETTINGS) + * M510 - Lock Printer + * M511 - Unlock Printer + * M512 - Set/Change/Remove Password * M524 - Abort the current SD print job started with M24. (Requires SDSUPPORT) * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires SD_ABORT_ON_ENDSTOP_HIT) * M569 - Enable stealthChop on an axis. (Requires at least one _DRIVER_TYPE to be TMC2130/2160/2208/2209/5130/5160) @@ -760,6 +763,16 @@ class GcodeSuite { #endif TERN_(EEPROM_SETTINGS, static void M504()); + #if ENABLED(PASSWORD_FEATURE) + static void M510(); + #if ENABLED(PASSWORD_UNLOCK_GCODE) + static void M511(); + #endif + #if ENABLED(PASSWORD_CHANGE_GCODE) + static void M512(); + #endif + #endif + TERN_(SDSUPPORT, static void M524()); TERN_(SD_ABORT_ON_ENDSTOP_HIT, static void M540()); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 7fbfda4fe109..f9b65c8bf483 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3083,5 +3083,16 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 controller." #endif +/** + * Sanity Check for Password Feature + */ +#if ENABLED(PASSWORD_FEATURE) + #if NONE(HAS_LCD_MENU, PASSWORD_UNLOCK_GCODE, PASSWORD_CHANGE_GCODE) + #error "Without PASSWORD_UNLOCK_GCODE, PASSWORD_CHANGE_GCODE, or a supported LCD there's no way to unlock the printer or set a password." + #elif DISABLED(EEPROM_SETTINGS) + #warning "PASSWORD_FEATURE settings will be lost on power-off without EEPROM_SETTINGS." + #endif +#endif + // Misc. Cleanup #undef _TEST_PWM diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index ca7ddd2b0310..9f6178ae50cc 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -588,6 +588,17 @@ namespace Language_en { PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Bad page index"); PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Bad page speed"); + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Edit Password"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login Required"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Password Settings"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Enter Digit"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Set/Edit Password"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Remove Password"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Password is "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Start Over"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Remember to Save!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Password Removed"); + // // Filament Change screens show up to 3 lines on a 4-line display // ...or up to 2 lines on a 3-line display diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 34def4d3bd7f..e41786107228 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -51,6 +51,10 @@ #include "../../module/settings.h" #endif +#if ENABLED(PASSWORD_FEATURE) + #include "../../feature/password/password.h" +#endif + void menu_tmc(); void menu_backlash(); @@ -603,6 +607,10 @@ void menu_advanced_settings() { }); #endif + #if ENABLED(PASSWORD_FEATURE) + SUBMENU(MSG_PASSWORD_SETTINGS, password.access_menu_password); + #endif + #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) CONFIRM_ITEM(MSG_INIT_EEPROM, MSG_BUTTON_INIT, MSG_BUTTON_CANCEL, diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 059290c5237e..9a1d2ece68e8 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -50,6 +50,10 @@ #include "../../lcd/menu/menu_mmu2.h" #endif +#if ENABLED(PASSWORD_FEATURE) + #include "../../feature/password/password.h" +#endif + void menu_tune(); void menu_cancelobject(); void menu_motion(); @@ -133,7 +137,7 @@ void menu_main() { if (card_detected) { if (!card_open) { - SUBMENU(MSG_MEDIA_MENU, menu_media); + SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); MENU_ITEM(gcode, #if PIN_EXISTS(SD_DETECT) MSG_CHANGE_MEDIA, M21_STR @@ -240,7 +244,7 @@ void menu_main() { MSG_RELEASE_MEDIA, PSTR("M22") #endif ); - SUBMENU(MSG_MEDIA_MENU, menu_media); + SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); } } else { diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp new file mode 100644 index 000000000000..f8e0b567218c --- /dev/null +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -0,0 +1,184 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// +// Advanced Settings Menus +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, PASSWORD_FEATURE) + +#include "../../feature/password/password.h" + +#include "menu.h" +#include "menu_addon.h" + +void menu_advanced_settings(); + +screenFunc_t success_screen, fail_screen; +bool authenticating; // = false +char string[(PASSWORD_LENGTH) + 1]; +static uint8_t digit_no; + +// +// Screen for both editing and setting the password +// +void Password::menu_password_entry() { + START_MENU(); + + // "Login" or "New Code" + STATIC_ITEM_P(authenticating ? GET_TEXT(MSG_LOGIN_REQUIRED) : GET_TEXT(MSG_EDIT_PASSWORD), SS_CENTER|SS_INVERT); + + STATIC_ITEM_P(PSTR(""), SS_CENTER|SS_INVERT, string); + + // Make the digit edit item look like a sub-menu + PGM_P const label = GET_TEXT(MSG_ENTER_DIGIT); + EDIT_ITEM_P(uint8, label, &editable.uint8, 0, 9, digit_entered); + MENU_ITEM_ADDON_START(utf8_strlen_P(label) + 1); + lcd_put_wchar(' '); + lcd_put_wchar('1' + digit_no); + SETCURSOR_X(LCD_WIDTH - 1); + lcd_put_wchar('>'); + MENU_ITEM_ADDON_END(); + + ACTION_ITEM(MSG_START_OVER, start_over); + + if (!authenticating) BACK_ITEM(MSG_BUTTON_CANCEL); + + END_MENU(); +} + +// +// Authentication check +// +void Password::authentication_done() { + ui.goto_screen(is_locked ? fail_screen : success_screen); + ui.completion_feedback(!is_locked); +} + +// A single digit was completed +void Password::digit_entered() { + uint32_t multiplier = CAT(1e, PASSWORD_LENGTH); // 1e5 = 100000 + LOOP_LE_N(i, digit_no) multiplier /= 10; + value_entry += editable.uint8 * multiplier; + string[digit_no++] = '0' + editable.uint8; + + // Exit edit screen menu and go to another screen + ui.goto_previous_screen(); + ui.use_click(); + ui.goto_screen(menu_password_entry); + + // After password has been keyed in + if (digit_no == PASSWORD_LENGTH) { + if (authenticating) + authentication_check(); + else + set_password_done(); + } +} + +// +// Set/Change Password +// +void Password::screen_password_entry() { + value_entry = 0; + digit_no = 0; + editable.uint8 = 0; + memset(string, '-', PASSWORD_LENGTH); + string[PASSWORD_LENGTH] = '\0'; + menu_password_entry(); +} + +void Password::screen_set_password() { + authenticating = false; + screen_password_entry(); +} + +void Password::authenticate_user(const screenFunc_t in_succ_scr, const screenFunc_t in_fail_scr) { + success_screen = in_succ_scr; + fail_screen = in_fail_scr; + if (is_set) { + authenticating = true; + ui.goto_screen(screen_password_entry); + ui.defer_status_screen(); + ui.update(); + } + else { + ui.goto_screen(in_succ_scr); + is_locked = false; + } +} + +void Password::access_menu_password() { + authenticate_user(menu_password, menu_advanced_settings); +} + +#if ENABLED(PASSWORD_ON_SD_PRINT_MENU) + void Password::media_gatekeeper() { + authenticate_user(menu_media, menu_main); + } +#endif + +void Password::start_over() { + ui.goto_previous_screen(); // Goto previous screen, if any + ui.goto_screen(screen_password_entry); +} + +void Password::menu_password_report() { + START_SCREEN(); + BACK_ITEM(MSG_PASSWORD_SETTINGS); + STATIC_ITEM(MSG_PASSWORD_SET, SS_LEFT, string); + STATIC_ITEM(MSG_REMINDER_SAVE_SETTINGS, SS_LEFT); + END_SCREEN(); +} + +void Password::set_password_done() { + is_set = true; + value = value_entry; + ui.completion_feedback(true); + ui.goto_screen(menu_password_report); +} + +void Password::remove_password() { + is_set = false; + string[0] = '0'; + string[1] = '\0'; + ui.completion_feedback(true); + ui.goto_screen(menu_password_report); +} + +// +// Password Menu +// +void Password::menu_password() { + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + SUBMENU(MSG_CHANGE_PASSWORD, screen_set_password); + ACTION_ITEM(MSG_REMOVE_PASSWORD, []{ ui.save_previous_screen(); remove_password(); } ); + #if ENABLED(EEPROM_SETTINGS) + ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); + #endif + END_MENU(); +} + +#endif // HAS_LCD_MENU && PASSWORD_FEATURE diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 34af8f2ea398..f1ab0fca6927 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -140,6 +140,10 @@ #define HAS_CASE_LIGHT_BRIGHTNESS 1 #endif +#if ENABLED(PASSWORD_FEATURE) + #include "../feature/password/password.h" +#endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) #include "../lcd/tft/touch.h" #endif @@ -152,7 +156,7 @@ typedef struct { int16_t X, Y, Z, X2, Y2, Z2, Z3, Z4; typedef struct { bool X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_stealth_enabled_t; // Limit an index to an array size -#define ALIM(I,ARR) _MIN(I, signed(COUNT(ARR) - 1)) +#define ALIM(I,ARR) _MIN(I, (signed)COUNT(ARR) - 1) // Defaults for reset / fill in on load static const uint32_t _DMA[] PROGMEM = DEFAULT_MAX_ACCELERATION; @@ -407,6 +411,14 @@ typedef struct SettingsDataStruct { uint8_t caselight_brightness; // M355 P #endif + // + // PASSWORD_FEATURE + // + #if ENABLED(PASSWORD_FEATURE) + bool password_is_set; + uint32_t password_value; + #endif + // // TOUCH_SCREEN_CALIBRATION // @@ -1345,6 +1357,14 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(caselight.brightness); #endif + // + // Password feature + // + #if ENABLED(PASSWORD_FEATURE) + EEPROM_WRITE(password.is_set); + EEPROM_WRITE(password.value); + #endif + // // TOUCH_SCREEN_CALIBRATION // @@ -2185,6 +2205,15 @@ void MarlinSettings::postprocess() { EEPROM_READ(caselight.brightness); #endif + // + // Password feature + // + #if ENABLED(PASSWORD_FEATURE) + _FIELD_TEST(password_is_set); + EEPROM_READ(password.is_set); + EEPROM_READ(password.value); + #endif + // // TOUCH_SCREEN_CALIBRATION // @@ -2665,7 +2694,7 @@ void MarlinSettings::reset() { #define PID_DEFAULT(N,E) DEFAULT_##N #endif HOTEND_LOOP() { - PID_PARAM(Kp, e) = float(PID_DEFAULT(Kp, ALIM(e, defKp))); + PID_PARAM(Kp, e) = float(PID_DEFAULT(Kp, ALIM(e, defKp))); PID_PARAM(Ki, e) = scalePID_i(PID_DEFAULT(Ki, ALIM(e, defKi))); PID_PARAM(Kd, e) = scalePID_d(PID_DEFAULT(Kd, ALIM(e, defKd))); TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = float(PID_DEFAULT(Kc, ALIM(e, defKc)))); @@ -2783,6 +2812,15 @@ void MarlinSettings::reset() { } #endif + #if ENABLED(PASSWORD_FEATURE) + #ifdef PASSWORD_DEFAULT_VALUE + password.is_set = true; + password.value = PASSWORD_DEFAULT_VALUE; + #else + password.is_set = false; + #endif + #endif + postprocess(); DEBUG_ECHO_START(); diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index d18cb8c28135..c41027003e9e 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -143,6 +143,9 @@ #if ENABLED(MMU2_MENUS) #define HAS_MENU_MMU2 #endif + #if ENABLED(PASSWORD_FEATURE) + #define HAS_MENU_PASSWORD + #endif #if HAS_TRINAMIC_CONFIG #define HAS_MENU_TMC #endif diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 5c36db03679a..7f488f6126cb 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -33,7 +33,7 @@ opt_set EXTRUDER_AUTO_FAN_SPEED 100 opt_set TEMP_SENSOR_CHAMBER 3 opt_add TEMP_CHAMBER_PIN 6 opt_set HEATER_CHAMBER_PIN 45 -exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), EXTENSIBLE_UI, S-Curve, many options." +exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." restore_configs opt_set MOTHERBOARD BOARD_RADDS diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 0b249e2149cf..ec8af16c23b4 100644 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -33,6 +33,7 @@ opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TE PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LEVEL_BED_CORNERS \ NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM \ ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \ + PASSWORD_FEATURE PASSWORD_ON_STARTUP PASSWORD_ON_SD_PRINT_MENU PASSWORD_AFTER_SD_PRINT_END PASSWORD_AFTER_SD_PRINT_ABORT \ AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DISTINCT_E_FACTORS \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ diff --git a/platformio.ini b/platformio.ini index fdb120ae88bd..10990b4d2151 100644 --- a/platformio.ini +++ b/platformio.ini @@ -41,6 +41,7 @@ default_src_filter = + - - + - - - + - - - - @@ -86,6 +87,7 @@ default_src_filter = + - - + - - - - + - - - - - - @@ -231,6 +233,7 @@ HAS_MENU_LED = src_filter=+ HAS_MENU_MEDIA = src_filter=+ HAS_MENU_MIXER = src_filter=+ HAS_MENU_MMU2 = src_filter=+ +HAS_MENU_PASSWORD = src_filter=+ HAS_MENU_POWER_MONITOR = src_filter=+ HAS_MENU_CUTTER = src_filter=+ HAS_MENU_TEMPERATURE = src_filter=+ @@ -276,6 +279,7 @@ TEMP_STAT_LEDS = src_filter=+ MAX7219_DEBUG = src_filter=+ + MIXING_EXTRUDER = src_filter=+ + PRUSA_MMU2 = src_filter=+ + +PASSWORD_FEATURE = src_filter=+ + ADVANCED_PAUSE_FEATURE = src_filter=+ + + AUTO_POWER_CONTROL = src_filter=+ HAS_POWER_MONITOR = src_filter=+ + From 8318d90e859219af9aa750ba2b91c7568f4dac55 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 8 Aug 2020 20:13:15 -0500 Subject: [PATCH 317/483] Password followup --- Marlin/src/gcode/feature/password/M510-M512.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/feature/password/M510-M512.cpp b/Marlin/src/gcode/feature/password/M510-M512.cpp index bcdeb7b91ccd..f26fb75fdada 100644 --- a/Marlin/src/gcode/feature/password/M510-M512.cpp +++ b/Marlin/src/gcode/feature/password/M510-M512.cpp @@ -60,8 +60,8 @@ void GcodeSuite::M510() { return; } - if (parser.seenval('N')) { - password.value_entry = parser.ulongval('N'); + if (parser.seenval('S')) { + password.value_entry = parser.ulongval('S'); if (password.value_entry < CAT(1e, PASSWORD_LENGTH)) { password.is_set = true; From 837dc4727de20856ed9e633d42fce906d8702a15 Mon Sep 17 00:00:00 2001 From: cbaugher Date: Sun, 9 Aug 2020 15:46:47 -0500 Subject: [PATCH 318/483] Tool-change Z move followup (#18963) --- Marlin/src/module/tool_change.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 5d2dc7d3be3f..d1017cea8078 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1133,7 +1133,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (toolchange_settings.enable_park) do_blocking_move_to_xy_z(destination, destination.z, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); #else do_blocking_move_to_xy(destination, planner.settings.max_feedrate_mm_s[X_AXIS]); - do_blocking_move_to_z(destination, planner.settings.max_feedrate_mm_s[Z_AXIS]); + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); #endif #endif From f7b261a363d50f1ca071cd46d859ac3eabc3b4b2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 9 Aug 2020 15:55:11 -0500 Subject: [PATCH 319/483] Shorthand values for M575 B --- Marlin/src/gcode/config/M575.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/config/M575.cpp b/Marlin/src/gcode/config/M575.cpp index 4144c366d114..3aa5844653c2 100644 --- a/Marlin/src/gcode/config/M575.cpp +++ b/Marlin/src/gcode/config/M575.cpp @@ -33,7 +33,21 @@ * B - Baud rate (bits per second) */ void GcodeSuite::M575() { - const int32_t baud = parser.ulongval('B'); + int32_t baud = parser.ulongval('B'); + switch (baud) { + case 24: + case 96: + case 192: + case 384: + case 576: + case 1152: baud *= 100; break; + case 250: + case 500: baud *= 1000; break; + case 19: baud = 19200; break; + case 38: baud = 38400; break; + case 57: baud = 57600; break; + case 115: baud = 115200; break; + } switch (baud) { case 2400: case 9600: case 19200: case 38400: case 57600: case 115200: case 250000: case 500000: case 1000000: { From 81f5973afc6da027bb2eb51f3f76a864585c01f8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 9 Aug 2020 15:57:59 -0500 Subject: [PATCH 320/483] Followup for SPI Flash --- Marlin/src/gcode/gcode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 840df54f6a76..edbeca9c9279 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -896,7 +896,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe #endif - #if BOTH(HAS_SPI_FLASH, SDSUPPORT) + #if ALL(HAS_SPI_FLASH, SDSUPPORT, MARLIN_DEV_MODE) case 993: M993(); break; // M993: Backup SPI Flash to SD case 994: M994(); break; // M994: Load a Backup from SD to SPI Flash #endif From b15c207d0899e838d41bd1dd684917769b93b89d Mon Sep 17 00:00:00 2001 From: ftk Date: Mon, 10 Aug 2020 01:19:35 +0300 Subject: [PATCH 321/483] Remaining Time for LIGHTWEIGHT_UI (#18875) --- .../lcd/dogm/status_screen_lite_ST7920.cpp | 22 +++++++++++++++---- .../src/lcd/dogm/status_screen_lite_ST7920.h | 10 ++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index fba485d7060e..211acc86c6d4 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -591,16 +591,17 @@ void ST7920_Lite_Status_Screen::draw_fan_speed(const uint8_t value) { write_byte('%'); } -void ST7920_Lite_Status_Screen::draw_print_time(const duration_t &elapsed) { +void ST7920_Lite_Status_Screen::draw_print_time(const duration_t &elapsed, char suffix) { #if HOTENDS == 1 set_ddram_address(DDRAM_LINE_3); #else set_ddram_address(DDRAM_LINE_3 + 5); #endif char str[7]; - str[elapsed.toDigital(str)] = ' '; + int str_length = elapsed.toDigital(str); + str[str_length++] = suffix; begin_data(); - write_str(str, 6); + write_str(str, str_length); } void ST7920_Lite_Status_Screen::draw_feedrate_percentage(const uint16_t percentage) { @@ -714,6 +715,7 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { if (forceUpdate || indicators_changed()) { const bool blink = ui.get_blink(); const duration_t elapsed = print_job_timer.duration(); + duration_t remaining = TERN0(USE_M73_REMAINING_TIME, ui.get_remaining_time()); const uint16_t feedrate_perc = feedrate_percentage; const int16_t extruder_1_temp = thermalManager.degHotend(0), extruder_1_target = thermalManager.degTargetHotend(0); @@ -738,7 +740,19 @@ void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { #endif draw_fan_speed(thermalManager.fanPercent(spd)); - draw_print_time(elapsed); + + // Draw elapsed/remaining time + const bool show_remaining = ENABLED(SHOW_REMAINING_TIME) && (DISABLED(ROTATE_PROGRESS_DISPLAY) || blink); + if (show_remaining && !remaining.second()) { + const auto progress = ui.get_progress_percent(); + if (progress) + remaining = elapsed.second() * (100 - progress) / progress; + } + if (show_remaining && remaining.second()) + draw_print_time(remaining, 'R'); + else + draw_print_time(elapsed); + draw_feedrate_percentage(feedrate_perc); // Update the fan and bed animations diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h index bc18c43f107f..9f0815d099ce 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h @@ -80,14 +80,14 @@ class ST7920_Lite_Status_Screen { static void draw_fan_icon(const bool whichIcon); static void draw_heat_icon(const bool whichIcon, const bool heating); static void draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange); - static void draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); - static void draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); - static void draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); + static void draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); + static void draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); + static void draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); static void draw_fan_speed(const uint8_t value); - static void draw_print_time(const duration_t &elapsed); + static void draw_print_time(const duration_t &elapsed, char suffix=' '); static void draw_feedrate_percentage(const uint16_t percentage); static void draw_status_message(); - static void draw_position(const xyze_pos_t &pos, bool position_known = true); + static void draw_position(const xyze_pos_t &pos, bool position_known=true); static bool indicators_changed(); static bool position_changed(); From f642656bff4e71256ea491c344b3ddb695dd962d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 10 Aug 2020 00:10:53 +0000 Subject: [PATCH 322/483] [cron] Bump distribution date (2020-08-10) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 33cd24dd0219..681bbfeca5ee 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-09" + #define STRING_DISTRIBUTION_DATE "2020-08-10" #endif /** From ce3df42e229ea563ef319f42cf5283f5a2ba3fa3 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 10 Aug 2020 03:48:57 +0200 Subject: [PATCH 323/483] Fix DISABLE_[XYZE] code (#18970) Co-authored-by: Scott Lahteine --- Marlin/src/module/planner.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index c2a9e6ac7716..931daa3322b8 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1281,7 +1281,7 @@ void Planner::recalculate() { void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) - xyze_bool_t axis_active = { true, true, true, true }; + xyze_bool_t axis_active = { false }; #endif #if HAS_FAN @@ -1316,10 +1316,10 @@ void Planner::check_axes_activity() { #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { block_t *block = &block_buffer[b]; - if (ENABLED(DISABLE_X) && block->steps[X_AXIS]) axis_active[X_AXIS] = true; - if (ENABLED(DISABLE_Y) && block->steps[Y_AXIS]) axis_active[Y_AXIS] = true; - if (ENABLED(DISABLE_Z) && block->steps[Z_AXIS]) axis_active[Z_AXIS] = true; - if (ENABLED(DISABLE_E) && block->steps[E_AXIS]) axis_active[E_AXIS] = true; + if (ENABLED(DISABLE_X) && block->steps.x) axis_active.x = true; + if (ENABLED(DISABLE_Y) && block->steps.y) axis_active.y = true; + if (ENABLED(DISABLE_Z) && block->steps.z) axis_active.z = true; + if (ENABLED(DISABLE_E) && block->steps.e) axis_active.e = true; } #endif } From 911cdd4d2f90104c74a6f5ee3a5656388eeccfa7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 10 Aug 2020 01:44:11 -0500 Subject: [PATCH 324/483] Fix scripts using gawk and wget --- buildroot/bin/use_example_configs | 17 ++++++++++------- buildroot/share/fonts/uxggenpages.sh | 5 ++++- buildroot/share/git/ghtp | 9 ++++++--- buildroot/share/git/mfclean | 5 ++++- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index 96be67e53d17..a7fe39a85988 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -1,18 +1,21 @@ #!/usr/bin/env bash IFS=: read -r PART1 PART2 <<< "$@" -[ -n "${PART2}" ] && { REPO="$PART1" ; RDIR="$PART2" ; } \ - || { REPO=bugfix-2.0.x ; RDIR="$PART1" ; } +[ -n "${PART2}" ] && { REPO="$PART1" ; RDIR="${PART2// /%20}" ; } \ + || { REPO=bugfix-2.0.x ; RDIR="${PART1// /%20}" ; } EXAMPLES="https://raw.githubusercontent.com/MarlinFirmware/Configurations/$REPO/config/examples" +which curl >/dev/null && TOOL='curl -L -s -S -f -o wgot' +which wget >/dev/null && TOOL='wget -q -O wgot' + restore_configs cd Marlin -wget -q "$EXAMPLES/$RDIR/Configuration.h" -O wgot && mv wgot Configuration.h -wget -q "$EXAMPLES/$RDIR/Configuration_adv.h" -O wgot && mv wgot Configuration_adv.h -wget -q "$EXAMPLES/$RDIR/_Bootscreen.h" -O wgot && mv wgot _Bootscreen.h -wget -q "$EXAMPLES/$RDIR/_Statusscreen.h" -O wgot && mv wgot _Statusscreen.h -rm -f wgot +$TOOL "$EXAMPLES/$RDIR/Configuration.h" >/dev/null 2>&1 && mv wgot Configuration.h +$TOOL "$EXAMPLES/$RDIR/Configuration_adv.h" >/dev/null 2>&1 && mv wgot Configuration.h +$TOOL "$EXAMPLES/$RDIR/_Bootscreen.h" >/dev/null 2>&1 && mv wgot Configuration.h +$TOOL "$EXAMPLES/$RDIR/_Statusscreen.h" >/dev/null 2>&1 && mv wgot Configuration.h +rm -f wgot cd - >/dev/null diff --git a/buildroot/share/fonts/uxggenpages.sh b/buildroot/share/fonts/uxggenpages.sh index 9207835148f6..46ad438f9c85 100755 --- a/buildroot/share/fonts/uxggenpages.sh +++ b/buildroot/share/fonts/uxggenpages.sh @@ -139,11 +139,14 @@ BEGIN { } EOF +which awk >/dev/null && AWK=awk +which gawk >/dev/null && AWK=gawk + grep -Hrn _UxGT . | grep '"' \ | sed 's/_UxGT("/\n&/g;s/[^\n]*\n_UxGT("\([^"]*\)[^\n]*/\1 /g;s/.$//' \ | ${EXEC_GENPAGES} \ | sort -k 1n -k 2n | uniq \ - | gawk -v EXEC_PREFIX=${DN_EXEC} -f "proc.awk" \ + | "$AWK" -v EXEC_PREFIX=${DN_EXEC} -f "proc.awk" \ | while read PAGE BEGIN END UTF8BEGIN UTF8END; do \ if [ ! -f ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h ]; then \ ${EXEC_BDF2U8G} -u ${PAGE} -b ${BEGIN} -e ${END} ${FN_FONT} fontpage_${PAGE}_${BEGIN}_${END} ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h > /dev/null 2>&1 ; diff --git a/buildroot/share/git/ghtp b/buildroot/share/git/ghtp index f7a6263012cd..a2fac985ddbb 100755 --- a/buildroot/share/git/ghtp +++ b/buildroot/share/git/ghtp @@ -13,14 +13,17 @@ case "$1" in -[Hh]) TYPE=HTTPS ; MATCH="git@" ; FORMULA="$GH_SSH/$GH_HTTPS" ;; -[Ss]) TYPE=SSH ; MATCH="https:" ; FORMULA="$GH_HTTPS/$GH_SSH" ;; *) - echo "usage: `basename $0` -h | -s" 1>&2 + echo "Usage: `basename $0` -h | -s" 1>&2 echo -e " \e[0;92m-h\e[0m to switch to HTTPS" 1>&2 echo -e " \e[0;92m-s\e[0m to switch to SSH" 1>&2 exit 1 ;; esac -REMOTES=$(git remote -v | egrep "\t$MATCH" | gawk '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") +which awk >/dev/null && AWK=awk +which gawk >/dev/null && AWK=gawk + +REMOTES=$(git remote -v | egrep "\t$MATCH" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") if [[ -z $REMOTES ]]; then echo "Nothing to do." ; exit @@ -29,5 +32,5 @@ fi echo "$REMOTES" | xargs -n2 git remote set-url echo -n "Remotes set to $TYPE: " -echo "$REMOTES" | gawk '{printf "%s ", $1}' +echo "$REMOTES" | "$AWK" '{printf "%s ", $1}' echo diff --git a/buildroot/share/git/mfclean b/buildroot/share/git/mfclean index f38997405bc8..b6ad2b5149ff 100755 --- a/buildroot/share/git/mfclean +++ b/buildroot/share/git/mfclean @@ -6,6 +6,9 @@ # Great way to clean up your branches after messing around a lot # +which awk >/dev/null && AWK=awk +which gawk >/dev/null && AWK=gawk + KEEP="RC|RCBugFix|dev|master|bugfix-1|bugfix-2" echo "Fetching latest upstream and origin..." @@ -18,7 +21,7 @@ git branch --merged | egrep -v "^\*|$KEEP" | xargs -n 1 git branch -d echo echo "Pruning Remotely-deleted Branches..." -git branch -vv | egrep -v "^\*|$KEEP" | grep ': gone]' | gawk '{print $1}' | xargs -n 1 git branch -D +git branch -vv | egrep -v "^\*|$KEEP" | grep ': gone]' | "$AWK" '{print $1}' | xargs -n 1 git branch -D echo # List fork branches that don't match local branches From 276d78461eabf9c1e16994ab4a1c8fe4930b5523 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 11 Aug 2020 00:10:45 +0000 Subject: [PATCH 325/483] [cron] Bump distribution date (2020-08-11) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 681bbfeca5ee..9b379ba9f54e 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-10" + #define STRING_DISTRIBUTION_DATE "2020-08-11" #endif /** From d2d6c167dfb93dcd63a5f55552200f840fd3aea1 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Mon, 10 Aug 2020 21:04:40 -0400 Subject: [PATCH 326/483] Fix Ender-3 V2 DWIN with manual mesh, host prompt (#18981) --- Marlin/src/lcd/dwin/dwin.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 74a0e6d8ff63..87db3c4b2573 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -53,6 +53,10 @@ #include "../../module/motion.h" #include "../../module/planner.h" +#if ENABLED(HOST_ACTION_COMMANDS) + #include "../../feature/host_actions.h" +#endif + #if HAS_LEVELING #include "../../feature/bedlevel/bedlevel.h" #endif @@ -124,7 +128,7 @@ constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other #define MBASE(L) (49 + (L)*MLINE) -#define BABY_Z_VAR TERN(HAS_LEVELING, probe.offset.z, zprobe_zoffset) +#define BABY_Z_VAR TERN(HAS_BED_PROBE, probe.offset.z, zprobe_zoffset) /* Value Init */ HMI_value_t HMI_ValueStruct; @@ -1116,11 +1120,11 @@ void HMI_Zoffset(void) { if (HMI_ValueStruct.show_mode == -4) { checkkey = Prepare; - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(4 + MROWS - index_prepare), TERN(HAS_LEVELING, probe.offset.z * 100, HMI_ValueStruct.offset_value)); + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(4 + MROWS - index_prepare), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); } else { checkkey = Tune; - show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5 + MROWS - index_tune), TERN(HAS_LEVELING, probe.offset.z * 100, HMI_ValueStruct.offset_value)); + show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(5 + MROWS - index_tune), TERN(HAS_BED_PROBE, probe.offset.z * 100, HMI_ValueStruct.offset_value)); } DWIN_UpdateLCD(); return; @@ -1484,7 +1488,7 @@ void update_variable(void) { DWIN_Draw_IntValue(true, true, 0, STAT_FONT, White, Background_black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); last_speed = feedrate_percentage; } - #if HAS_LEVELING + #if HAS_BED_PROBE if (last_probe_zoffset != probe.offset.z) { show_plus_or_minus(STAT_FONT, Background_black, 2, 2, 178 + STAT_CHR_W, 429, probe.offset.z * 100); last_probe_zoffset = probe.offset.z; @@ -2188,7 +2192,7 @@ void HMI_Prepare(void) { Popup_Window_Home(); break; case 4: // Z-offset - #if HAS_LEVELING + #if HAS_BED_PROBE checkkey = Homeoffset; HMI_ValueStruct.show_mode = -4; HMI_ValueStruct.offset_value = probe.offset.z * 100; @@ -3390,7 +3394,7 @@ void EachMomentUpdate(void) { else if (abort_flag && !HMI_flag.home_flag) { // Print Stop abort_flag = 0; HMI_ValueStruct.print_speed = feedrate_percentage = 100; - zprobe_zoffset = TERN(HAS_LEVELING, probe.offset.z, 0); + zprobe_zoffset = TERN(HAS_BED_PROBE, probe.offset.z, 0); planner.finish_and_disable(); From f62578efec85b155a0c969a1794b98bf1f6c19fe Mon Sep 17 00:00:00 2001 From: Marcio T Date: Mon, 10 Aug 2020 19:06:19 -0600 Subject: [PATCH 327/483] For FTDI800 compatibility, remove VERTEX_FORMAT dependency (#18982) --- .../screens/bed_mesh_screen.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index f8a30e82411e..663555f05de7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -88,7 +88,15 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: const float scale_z = ((val_max == val_min) ? 1 : 1/(val_max - val_min)) * autoscale_max; - // These equations determine the appearance of the grid on the screen. + /** + * The 3D points go through a 3D graphics pipeline to determine the final 2D point on the screen. + * This is written out as a stack of macros that each apply an affine transformation to the point. + * At compile time, the compiler should be able to reduce these expressions. + * + * The last transformation in the chain (TRANSFORM_5) is initially set to a no-op so we can measure + * the dimensions of the grid, but is later replaced with a scaling transform that scales the grid + * to fit. + */ #define TRANSFORM_5(X,Y,Z) (X), (Y) // No transform #define TRANSFORM_4(X,Y,Z) TRANSFORM_5((X)/(Z),(Y)/-(Z), 0) // Perspective @@ -119,8 +127,12 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: const float center_x = x + w/2; const float center_y = y + h/2; + // Now replace the last transformation in the chain with a scaling operation. + #undef TRANSFORM_5 - #define TRANSFORM_5(X,Y,Z) center_x + (X - grid_cx) * scale_x, center_y + (Y - grid_cy) * scale_y // Fit to bounds + #define TRANSFORM_6(X,Y,Z) (X)*16, (Y)*16 // Scale to 1/16 pixel units + #define TRANSFORM_5(X,Y,Z) TRANSFORM_6( center_x + ((X) - grid_cx) * scale_x, \ + center_y + ((Y) - grid_cy) * scale_y, 0) // Scale to bounds // Draw the grid @@ -128,7 +140,6 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: CommandProcessor cmd; cmd.cmd(SAVE_CONTEXT()) - .cmd(VERTEX_FORMAT(0)) .cmd(TAG_MASK(false)) .cmd(SAVE_CONTEXT()); From 6dd054895b4566f7d63a629f3ab5f5aa890db8af Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 10 Aug 2020 20:03:13 -0500 Subject: [PATCH 328/483] Add'l CI/git script tweaks, fixes --- buildroot/bin/use_example_configs | 6 +++--- buildroot/share/fonts/uxggenpages.sh | 3 +-- buildroot/share/git/ghtp | 3 +-- buildroot/share/git/mfclean | 3 +-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index a7fe39a85988..83c0f5485d2c 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -13,9 +13,9 @@ restore_configs cd Marlin $TOOL "$EXAMPLES/$RDIR/Configuration.h" >/dev/null 2>&1 && mv wgot Configuration.h -$TOOL "$EXAMPLES/$RDIR/Configuration_adv.h" >/dev/null 2>&1 && mv wgot Configuration.h -$TOOL "$EXAMPLES/$RDIR/_Bootscreen.h" >/dev/null 2>&1 && mv wgot Configuration.h -$TOOL "$EXAMPLES/$RDIR/_Statusscreen.h" >/dev/null 2>&1 && mv wgot Configuration.h +$TOOL "$EXAMPLES/$RDIR/Configuration_adv.h" >/dev/null 2>&1 && mv wgot Configuration_adv.h +$TOOL "$EXAMPLES/$RDIR/_Bootscreen.h" >/dev/null 2>&1 && mv wgot _Bootscreen.h +$TOOL "$EXAMPLES/$RDIR/_Statusscreen.h" >/dev/null 2>&1 && mv wgot _Statusscreen.h rm -f wgot cd - >/dev/null diff --git a/buildroot/share/fonts/uxggenpages.sh b/buildroot/share/fonts/uxggenpages.sh index 46ad438f9c85..a99fd9902463 100755 --- a/buildroot/share/fonts/uxggenpages.sh +++ b/buildroot/share/fonts/uxggenpages.sh @@ -139,8 +139,7 @@ BEGIN { } EOF -which awk >/dev/null && AWK=awk -which gawk >/dev/null && AWK=gawk +AWK=$(which gawk || which awk) grep -Hrn _UxGT . | grep '"' \ | sed 's/_UxGT("/\n&/g;s/[^\n]*\n_UxGT("\([^"]*\)[^\n]*/\1 /g;s/.$//' \ diff --git a/buildroot/share/git/ghtp b/buildroot/share/git/ghtp index a2fac985ddbb..3c0e21e371b1 100755 --- a/buildroot/share/git/ghtp +++ b/buildroot/share/git/ghtp @@ -20,8 +20,7 @@ case "$1" in ;; esac -which awk >/dev/null && AWK=awk -which gawk >/dev/null && AWK=gawk +AWK=$(which gawk || which awk) REMOTES=$(git remote -v | egrep "\t$MATCH" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") diff --git a/buildroot/share/git/mfclean b/buildroot/share/git/mfclean index b6ad2b5149ff..fd131c42630c 100755 --- a/buildroot/share/git/mfclean +++ b/buildroot/share/git/mfclean @@ -6,8 +6,7 @@ # Great way to clean up your branches after messing around a lot # -which awk >/dev/null && AWK=awk -which gawk >/dev/null && AWK=gawk +AWK=$(which gawk || which awk) KEEP="RC|RCBugFix|dev|master|bugfix-1|bugfix-2" From b14f630f26b95cd08ef047ba1a83cfb6dc2a537e Mon Sep 17 00:00:00 2001 From: Anders Sahlman <57940217+AndersSahlman@users.noreply.github.com> Date: Tue, 11 Aug 2020 03:21:48 +0200 Subject: [PATCH 329/483] MKS Robin new 320x240 TFT Color UI support (#18985) --- Marlin/src/lcd/tft/ili9341.h | 8 +- Marlin/src/lcd/tft/ili9488.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 128 ++++++++++++------ 3 files changed, 96 insertions(+), 44 deletions(-) diff --git a/Marlin/src/lcd/tft/ili9341.h b/Marlin/src/lcd/tft/ili9341.h index 42a36b7e342e..22709e4cf7d3 100644 --- a/Marlin/src/lcd/tft/ili9341.h +++ b/Marlin/src/lcd/tft/ili9341.h @@ -38,8 +38,12 @@ #define ILI9341_ORIENTATION_LEFT ILI9341_MADCTL_MY | ILI9341_MADCTL_MX | ILI9341_MADCTL_MV // 320x240 ; Cable on the left side #define ILI9341_ORIENTATION_DOWN ILI9341_MADCTL_MX // 240x320 ; Cable on the upper side -#define ILI9341_COLOR_BGR -#define ILI9341_ORIENTATION ILI9341_ORIENTATION_LEFT +#ifndef ILI9341_COLOR_RGB + #define ILI9341_COLOR_BGR +#endif +#ifndef ILI9341_ORIENTATION + #define ILI9341_ORIENTATION ILI9341_ORIENTATION_LEFT +#endif #define ILI9341_MADCTL_DATA (ILI9341_ORIENTATION | TERN(ILI9341_COLOR_BGR, ILI9341_MADCTL_BGR, ILI9341_MADCTL_RGB)) #define ILI9341_NOP 0x00 // No Operation diff --git a/Marlin/src/lcd/tft/ili9488.h b/Marlin/src/lcd/tft/ili9488.h index 6aad70486553..19fdc78e0a5e 100644 --- a/Marlin/src/lcd/tft/ili9488.h +++ b/Marlin/src/lcd/tft/ili9488.h @@ -38,7 +38,9 @@ #define ILI9488_ORIENTATION_LEFT ILI9488_MADCTL_MY | ILI9488_MADCTL_MX | ILI9488_MADCTL_MV // 480x320 ; Cable on the left side #define ILI9488_ORIENTATION_DOWN ILI9488_MADCTL_MX // 320x480 ; Cable on the upper side -#define ILI9488_COLOR_BGR +#ifndef ILI9488_COLOR_RGB + #define ILI9488_COLOR_BGR +#endif #ifndef ILI9488_ORIENTATION #define ILI9488_ORIENTATION ILI9488_ORIENTATION_LEFT #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 73e1b12b88eb..716cb1637556 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -22,34 +22,33 @@ #pragma once /** - * MKS Robin MINI (STM32F130VET6) board pin assignments + * MKS Robin mini (STM32F130VET6) board pin assignments */ #ifndef __STM32F1__ #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin mini supports up to 1 hotends / E-steppers. Comment out this line to continue." + #error "MKS Robin mini only supports 1 hotend / E-stepper. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "MKS Robin mini" +#define BOARD_INFO_NAME "MKS Robin Mini" // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role // #define DISABLE_DEBUG +// +// EEPROM +// #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - // 2K in a AT24C16N - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) + #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB #endif -// -// Note: MKS Robin mini board is using SPI2 interface. -// -#define SPI_MODULE 2 +#define ENABLE_SPI2 // // Limit Switches @@ -82,6 +81,15 @@ #define E0_STEP_PIN PD6 #define E0_DIR_PIN PD3 + +// Motor current PWM pins +#define MOTOR_CURRENT_PWM_XY_PIN PA6 +#define MOTOR_CURRENT_PWM_Z_PIN PA7 +#define MOTOR_CURRENT_PWM_E_PIN PB0 +#define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp +#ifndef DEFAULT_PWM_MOTOR_CURRENT + #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } +#endif // // Temperature Sensors // @@ -91,64 +99,102 @@ // // Heaters / Fans // -#define HEATER_0_PIN PC3 // HEATER1 -#define HEATER_BED_PIN PA0 // HOT BED +#define HEATER_0_PIN PC3 +#define HEATER_BED_PIN PA0 #define FAN_PIN PB1 // FAN -// -// Thermocouples -// -//#define MAX6675_SS_PIN PE5 // TC1 - CS1 -//#define MAX6675_SS_PIN PE6 // TC2 - CS2 - // // Misc. Functions // #define POWER_LOSS_PIN PA2 // PW_DET #define PS_ON_PIN PA3 // PW_OFF -//#define LED_PIN PB2 +#define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) + +#define MT_DET_1_PIN PA4 +#define MT_DET_PIN_INVERTING false + +#define WIFI_IO0_PIN PC13 + +// +// SD Card +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define SDIO_SUPPORT +#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SD_DETECT_PIN PD12 +#define ONBOARD_SD_CS_PIN PC11 // // LCD / Controller // #define BEEPER_PIN PC5 -#define SD_DETECT_PIN PD12 /** * Note: MKS Robin TFT screens use various TFT controllers. * If the screen stays white, disable 'LCD_RESET_PIN' * to let the bootloader init the screen. */ + #define XPT2046_X_CALIBRATION 12033 + #define XPT2046_Y_CALIBRATION -9047 + #define XPT2046_X_OFFSET -30 + #define XPT2046_Y_OFFSET 254 + #if ENABLED(FSMC_GRAPHICAL_TFT) + #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 - #define LCD_RESET_PIN PC6 + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PC2 - #define TOUCH_SCK_PIN PB13 - #define TOUCH_MOSI_PIN PB15 - #define TOUCH_MISO_PIN PB14 + #define TOUCH_CS_PIN PC2 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif + +#elif ENABLED(TFT_320x240) //TFT32/28 + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define TOUCH_CS_PIN PC2 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + + #define TFT_DRIVER ILI9341 + #define TFT_BUFFER_SIZE 14400 + + // YV for normal screen mounting + #define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV + // XV for 180° rotated screen mounting + //#define ILI9341_ORIENTATION ILI9341_MADCTL_MX | ILI9341_MADCTL_MV + + #define ILI9341_COLOR_RGB #endif -// Motor current PWM pins -#define MOTOR_CURRENT_PWM_XY_PIN PA6 -#define MOTOR_CURRENT_PWM_Z_PIN PA7 -#define MOTOR_CURRENT_PWM_E_PIN PB0 -#define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp -#define DEFAULT_PWM_MOTOR_CURRENT { 1030, 1030, 1030 } // 1.05Amp per driver, here is XY, Z and E. This values determined empirically. - -// This is a kind of workaround in case native marlin "digipot" interface won't work. -// Required to enable related code in STM32F1/HAL.cpp -//#ifndef MKS_ROBIN_MINI_VREF_PWM -// #define MKS_ROBIN_MINI_VREF_PWM -//#endif - -//#define VREF_XY_PIN PA6 -//#define VREF_Z_PIN PA7 -//#define VREF_E1_PIN PB0 +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB +#if HAS_SPI_FLASH + #define W25QXX_CS_PIN PB12 // Flash chip-select + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif From 9590fcd85567d578087568bdc8c478073f9808b7 Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Tue, 11 Aug 2020 08:25:35 +0700 Subject: [PATCH 330/483] EVENT_GCODE_SD_STOP => ABORT (#18978) --- Marlin/Configuration_adv.h | 2 +- Marlin/src/MarlinCore.cpp | 4 ++-- Marlin/src/inc/SanityCheck.h | 6 ++++-- Marlin/src/lcd/dwin/dwin.cpp | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a3013611cba6..1b31f0bc3498 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1137,7 +1137,7 @@ //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files - #define EVENT_GCODE_SD_STOP "G28XY" // G-code to run on Stop Print (e.g., "G28XY" or "G27") + #define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27") #if ENABLED(PRINTER_EVENT_LEDS) #define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 39530395eb48..30b6fbe3d59d 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -453,8 +453,8 @@ void startOrResumeJob() { #endif wait_for_heatup = false; TERN_(POWER_LOSS_RECOVERY, recovery.purge()); - #ifdef EVENT_GCODE_SD_STOP - queue.inject_P(PSTR(EVENT_GCODE_SD_STOP)); + #ifdef EVENT_GCODE_SD_ABORT + queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); #endif TERN_(PASSWORD_AFTER_SD_PRINT_ABORT, password.lock_machine()); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index f9b65c8bf483..6fcd867981de 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -517,6 +517,8 @@ #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." #elif defined(ANYCUBIC_TFT_MODEL) #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." +#elif defined(EVENT_GCODE_SD_STOP) + #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT. Please update your Configuration.h." #endif #ifdef FIL_RUNOUT_INVERTING @@ -742,8 +744,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif #endif -#if defined(EVENT_GCODE_SD_STOP) && DISABLED(NOZZLE_PARK_FEATURE) - static_assert(nullptr == strstr(EVENT_GCODE_SD_STOP, "G27"), "NOZZLE_PARK_FEATURE is required to use G27 in EVENT_GCODE_SD_STOP."); +#if defined(EVENT_GCODE_SD_ABORT) && DISABLED(NOZZLE_PARK_FEATURE) + static_assert(nullptr == strstr(EVENT_GCODE_SD_ABORT, "G27"), "NOZZLE_PARK_FEATURE is required to use G27 in EVENT_GCODE_SD_ABORT."); #endif /** diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 87db3c4b2573..1aa2656dcfd6 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -2072,9 +2072,9 @@ void HMI_PauseOrStop(void) { #ifdef ACTION_ON_CANCEL host_action_cancel(); #endif - #ifdef EVENT_GCODE_SD_STOP + #ifdef EVENT_GCODE_SD_ABORT Popup_Window_Home(); - queue.inject_P(PSTR(EVENT_GCODE_SD_STOP)); // For Ender 3 "G28 X Y" + queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); #endif abort_flag = true; #endif From bd690f12bc7fc4abdd2fc5c6971b11b2635c4448 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Tue, 11 Aug 2020 10:11:40 +0200 Subject: [PATCH 331/483] Mention units for MANUAL_FEEDRATE (#18993) --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1b31f0bc3498..1c29af1f46cb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1025,7 +1025,7 @@ // @section lcd #if EITHER(ULTIPANEL, EXTENSIBLE_UI) - #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/m) Feedrates for manual moves along X, Y, Z, E from panel #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) #if ENABLED(ULTIPANEL) #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" From ca4eaf92b4d1acda18a5ffba515efd5bd1be0e43 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 12 Aug 2020 00:10:11 +0000 Subject: [PATCH 332/483] [cron] Bump distribution date (2020-08-12) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 9b379ba9f54e..bead274b4cda 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-11" + #define STRING_DISTRIBUTION_DATE "2020-08-12" #endif /** From ee28a1079582b39fa97d563f4df4824964552638 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 12 Aug 2020 16:46:51 -0500 Subject: [PATCH 333/483] String interpolation for 2-digit numbers (#18998) --- Marlin/src/core/language.h | 4 ++-- Marlin/src/lcd/lcdprint.cpp | 18 ++++++++++++------ Marlin/src/lcd/tft/tft_string.cpp | 21 ++++++++++----------- Marlin/src/lcd/tft/tft_string.h | 6 +++--- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 48431455f0ff..f0ddbdd6d096 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -353,7 +353,7 @@ * */ #if ENABLED(NUMBER_TOOLS_FROM_0) - #define LCD_FIRST_TOOL '0' + #define LCD_FIRST_TOOL 0 #define LCD_STR_N0 "0" #define LCD_STR_N1 "1" #define LCD_STR_N2 "2" @@ -363,7 +363,7 @@ #define LCD_STR_N6 "6" #define LCD_STR_N7 "7" #else - #define LCD_FIRST_TOOL '1' + #define LCD_FIRST_TOOL 1 #define LCD_STR_N0 "1" #define LCD_STR_N1 "2" #define LCD_STR_N2 "3" diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index c982cfe2aa86..0f7f945a9925 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -44,22 +44,28 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const i if (ch == '=' || ch == '~' || ch == '*') { if (ind >= 0) { if (ch == '*') { lcd_put_wchar('E'); n--; } - if (n) { lcd_put_wchar(ind + ((ch == '=') ? '0' : LCD_FIRST_TOOL)); n--; } + if (n) { + int8_t inum = ind + ((ch == '=') ? 0 : LCD_FIRST_TOOL); + if (inum >= 10) { + lcd_put_wchar('0' + (inum / 10)); n--; + inum %= 10; + } + if (n) { lcd_put_wchar('0' + inum); n--; } + } } else { PGM_P const b = ind == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED); n -= lcd_put_u8str_max_P(b, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); } if (n) n -= lcd_put_u8str_max_P((PGM_P)p, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); - continue; } else if (ch == '$' && inStr) { n -= lcd_put_u8str_max_P(inStr, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); - continue; } - - lcd_put_wchar(ch); - n--; + else { + lcd_put_wchar(ch); + n--; + } } return n; } diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index f4e203445daf..7e66c3d29cf8 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -86,33 +86,32 @@ void TFT_String::set() { uint8_t read_byte(uint8_t *byte) { return *byte; } -void TFT_String::add(uint8_t *string, uint8_t index, uint8_t *itemString) { - uint8_t character; +void TFT_String::add(uint8_t *string, int8_t index, uint8_t *itemString) { wchar_t wchar; while (*string) { string = get_utf8_value_cb(string, read_byte, &wchar); - if (wchar > 255) - wchar |= 0x0080; - character = (uint8_t) (wchar & 0x00FF); + if (wchar > 255) wchar |= 0x0080; + uint8_t ch = uint8_t(wchar & 0x00FF); - if (character == '=' || character == '~' || character == '*') { + if (ch == '=' || ch == '~' || ch == '*') { if (index >= 0) { - if (character == '*') - add_character('E'); - add_character(index + ((character == '=') ? '0' : LCD_FIRST_TOOL)); + int8_t inum = index + ((ch == '=') ? 0 : LCD_FIRST_TOOL); + if (ch == '*') add_character('E'); + if (inum >= 10) { add_character('0' + (inum / 10)); inum %= 10; } + add_character('0' + inum); } else { add(index == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED)); } continue; } - else if (character == '$' && itemString) { + else if (ch == '$' && itemString) { add(itemString); continue; } - add_character(character); + add_character(ch); } eol(); } diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h index b4c94953f759..d83d3af7027e 100644 --- a/Marlin/src/lcd/tft/tft_string.h +++ b/Marlin/src/lcd/tft/tft_string.h @@ -86,11 +86,11 @@ class TFT_String { static void set(); static void add(uint8_t character) { add_character(character); eol(); } static void add(uint8_t *string) { while (*string) { add_character(*string++); } eol(); } - static void add(uint8_t *string, uint8_t index, uint8_t *itemString = NULL); + static void add(uint8_t *string, int8_t index, uint8_t *itemString = NULL); static void set(uint8_t *string) { set(); add(string); }; - static void set(uint8_t *string, uint8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; + static void set(uint8_t *string, int8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; static inline void set(const char *string) { set((uint8_t *)string); } - static inline void set(const char *string, uint8_t index, const char *itemString = NULL) { set((uint8_t *)string, index, itemString); } + static inline void set(const char *string, int8_t index, const char *itemString = NULL) { set((uint8_t *)string, index, itemString); } static inline void add(const char *string) { add((uint8_t *)string); } static void trim(uint8_t character = 0x20); From 3b9e0c3dde3d1879fa59fa1244a050319dc1467a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 13 Aug 2020 00:10:41 +0000 Subject: [PATCH 334/483] [cron] Bump distribution date (2020-08-13) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index bead274b4cda..3babd11a3ca5 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-12" + #define STRING_DISTRIBUTION_DATE "2020-08-13" #endif /** From ff5c8d35705df99f385a6b27163380a249c2e646 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 13 Aug 2020 20:31:59 -0300 Subject: [PATCH 335/483] Optimize LVGL with HAL TFT IO (SPI and FSMC) (#18974) --- Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 18 +- Marlin/src/HAL/STM32F1/tft/tft_fsmc.h | 7 + Marlin/src/HAL/STM32F1/tft/tft_spi.cpp | 15 +- Marlin/src/HAL/STM32F1/tft/tft_spi.h | 7 + Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 186 ++---------- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h | 20 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 2 + Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 69 +---- .../extui/lib/mks_ui/mks_hardware_test.cpp | 2 - Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp | 272 ++--------------- .../lib/mks_ui/tft_lvgl_configuration.cpp | 280 +++--------------- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 25 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 25 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 11 + .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 35 ++- 16 files changed, 191 insertions(+), 785 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp index 33cddd1e05e1..e0047e7d5910 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_FSMC_TFT +#if HAS_FSMC_TFT || ENABLED(TFT_LVGL_UI_FSMC) #include "tft_fsmc.h" #include @@ -224,13 +224,15 @@ void TFT_FSMC::Abort() { } void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + #if defined(FSMC_DMA_DEV) && defined(FSMC_DMA_CHANNEL) + dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); + dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); + dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + + while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; + dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); + #endif } #endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h index 5c43361c0cab..6fcfea8a1167 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h @@ -61,4 +61,11 @@ class TFT_FSMC { static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_MODE, Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_CIRC_MODE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + while (Count > 0) { + TransmitDMA(DMA_CIRC_MODE, &Data, Count > 0xFFFF ? 0xFFFF : Count); + Count = Count > 0xFFFF ? Count - 0xFFFF : 0; + } + } }; diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp index a64f90f2b50b..2610262b0f2c 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_SPI_TFT +#if HAS_SPI_TFT || ENABLED(TFT_LVGL_UI_SPI) #include "tft_spi.h" @@ -103,16 +103,21 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { #if !PIN_EXISTS(TFT_MISO) return 0; #else - uint16_t d = 0; + uint8_t d = 0; + uint32_t data = 0; + SPIx.setClockDivider(SPI_CLOCK_DIV16); DataTransferBegin(DATASIZE_8BIT); WriteReg(Reg); - SPI.read((uint8_t*)&d, 1); //dummy read - SPI.read((uint8_t*)&d, 1); + LOOP_L_N(i, 4) { + SPIx.read((uint8_t*)&d, 1); + data = (data << 8) | d; + } DataTransferEnd(); + SPIx.setClockDivider(SPI_CLOCK_MAX); - return d >> 7; + return data >> 7; #endif } diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.h b/Marlin/src/HAL/STM32F1/tft/tft_spi.h index 1d1c9b444c8e..bb26fc21b64f 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.h @@ -62,4 +62,11 @@ class TFT_SPI { static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + while (Count > 0) { + TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count); + Count = Count > 0xFFFF ? Count - 0xFFFF : 0; + } + } }; diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 277131289a3c..fa4f0cd9b1f6 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -252,7 +252,7 @@ #endif // Full Touch Screen needs 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) +#if EITHER(TOUCH_SCREEN, HAS_TFT_LVGL_UI) #define HAS_TFT_XPT2046 1 #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index 0febc4edbddd..607090ba391d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -54,112 +54,27 @@ TFT SPI_TFT; // use SPI1 for the spi tft. void TFT::spi_init(uint8_t spiRate) { - - SPI_TFT_CS_H; - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(1); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -} - -uint8_t TFT::spi_Rec() { - uint8_t returnByte = SPI.transfer(ff); - return returnByte; -} - -uint8_t TFT::spi_read_write_byte(uint8_t data) { - uint8_t returnByte = SPI.transfer(data); - return returnByte; -} - -/** - * @brief Receive a number of bytes from the SPI port to a buffer - * - * @param buf Pointer to starting address of buffer to write to. - * @param nbyte Number of bytes to receive. - * @return Nothing - * - * @details Uses DMA - */ -void TFT::spi_Read(uint8_t* buf, uint16_t nbyte) {SPI.dmaTransfer(0, const_cast(buf), nbyte);} - -/** - * @brief Send a single byte on SPI port - * - * @param b Byte to send - * - * @details - */ -void TFT::spi_Send(uint8_t b) {SPI.send(b);} - -/** - * @brief Write token and then write from 512 byte buffer to SPI (for SD card) - * - * @param buf Pointer with buffer start address - * @return Nothing - * - * @details Use DMA - */ -void TFT::spi_SendBlock(uint8_t token, const uint8_t* buf) { - SPI.send(token); - SPI.dmaSend(const_cast(buf), 512); + tftio.Init(); } void TFT::LCD_WR_REG(uint8_t cmd) { - SPI_TFT_CS_L; - SPI_TFT_DC_L; - spi_Send(cmd); - SPI_TFT_CS_H; + tftio.WriteReg(cmd); } -void TFT::LCD_WR_DATA(uint8_t data) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - spi_Send(data); - SPI_TFT_CS_H; -} -void TFT::LCD_WriteRAM_Prepare() {LCD_WR_REG(0X2C);} -void TFT::SetCursor(uint16_t x, uint16_t y) { - LCD_WR_REG(0x2A); - LCD_WR_DATA(x >> 8); - LCD_WR_DATA(x); - LCD_WR_DATA(x >> 8); - LCD_WR_DATA(x); - LCD_WR_REG(0x2B); - LCD_WR_DATA(y >> 8); - LCD_WR_DATA(y); - LCD_WR_DATA(y >> 8); - LCD_WR_DATA(y); +void TFT::LCD_WR_DATA(uint8_t data) { + tftio.WriteData(data); } void TFT::SetPoint(uint16_t x, uint16_t y, uint16_t point) { if ((x > 480) || (y > 320)) return; - SetCursor(x, y); - - LCD_WriteRAM_Prepare(); - LCD_WR_DATA((uint8_t)(point >> 8)); - LCD_WR_DATA((uint8_t)point); + SetWindows(x, y, 1, 1); + tftio.WriteMultiple(point, (uint16_t)1); } void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { + tftio.DataTransferBegin(DATASIZE_8BIT); + LCD_WR_REG(0x2A); LCD_WR_DATA(x >> 8); LCD_WR_DATA(x); @@ -171,6 +86,10 @@ void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { LCD_WR_DATA(y); LCD_WR_DATA((y + height - 1) >> 8); LCD_WR_DATA(y + height - 1); + + LCD_WR_REG(0X2C); + + tftio.DataTransferEnd(); } void TFT::LCD_init() { @@ -180,6 +99,8 @@ void TFT::LCD_init() { delay(150); SPI_TFT_RST_H; + tftio.DataTransferBegin(DATASIZE_8BIT); + delay(120); LCD_WR_REG(0x11); delay(120); @@ -251,6 +172,8 @@ void TFT::LCD_init() { delay(120); // Delay 120ms LCD_WR_REG(0x29); // Display ON + tftio.DataTransferEnd(); + LCD_clear(0x0000); // LCD_Draw_Logo(); SPI_TFT_BLK_H; @@ -258,81 +181,18 @@ void TFT::LCD_init() { } void TFT::LCD_clear(uint16_t color) { - unsigned int i; - uint8_t tbuf[960]; - - SetCursor(0, 0); - SetWindows(0, 0, 480 - 1, 320 - 1); - LCD_WriteRAM_Prepare(); - SPI_TFT_CS_L; - SPI_TFT_DC_H; - for (i = 0; i < 960;) { - tbuf[i] = color >> 8; - tbuf[i + 1] = color; - i += 2; - } - for (i = 0; i < 320; i++) { - // for (m=0;m<480;m++) - // { - // LCD_WR_DATA(color>>8); - // LCD_WR_DATA(color); - SPI.dmaSend(tbuf, 960, true); - // SPI_TFT_CS_H; - // } - } - SPI_TFT_CS_H; + SetWindows(0, 0, (LCD_FULL_PIXEL_WIDTH) - 1, (LCD_FULL_PIXEL_HEIGHT) - 1); + tftio.WriteMultiple(color, (uint32_t)(LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); } extern unsigned char bmp_public_buf[17 * 1024]; void TFT::LCD_Draw_Logo() { - uint16_t i,y_off = 0; - uint16_t *p_index; - uint16_t Color; - - #if 1 - for (y_off = 0; y_off < 320; y_off ++) { - Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, 960); - - SPI_TFT.spi_init(SPI_FULL_SPEED); - SetWindows(0, y_off, 480, 1); - LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ - for (i = 0; i < 960;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i+=2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(bmp_public_buf,960,true); - SPI_TFT_CS_H; - } - - #else - - for (index = 0; index < 40; index ++) { - Pic_Logo_Read((uint8_t *)"", bmp_public_buf, 480*8*2); - i = 0; - SetCursor(0,0); - SetWindows(0, y_off * 8, 480, 8); - LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */ - for (i = 0; i < 480 * 8 * 2;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(bmp_public_buf,480*8*2,true); - SPI_TFT_CS_H; - - y_off++; - } - #endif - - SetWindows(0, 0, 479, 319); + SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); + for (uint16_t i = 0; i < (LCD_FULL_PIXEL_HEIGHT); i ++) { + Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (LCD_FULL_PIXEL_WIDTH) * 2); + tftio.WriteSequence((uint16_t *)bmp_public_buf, LCD_FULL_PIXEL_WIDTH); + } } #endif // HAS_TFT_LVGL_UI_SPI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h index 9b676843139c..c4b04e1c2183 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -21,13 +21,13 @@ */ #pragma once -#include +#include "../../inc/MarlinConfigPre.h" -#define SPI_TFT_CS_H OUT_WRITE(SPI_TFT_CS_PIN, HIGH) -#define SPI_TFT_CS_L OUT_WRITE(SPI_TFT_CS_PIN, LOW) - -#define SPI_TFT_DC_H OUT_WRITE(SPI_TFT_DC_PIN, HIGH) -#define SPI_TFT_DC_L OUT_WRITE(SPI_TFT_DC_PIN, LOW) +#if ENABLED(TFT_LVGL_UI_SPI) + #include HAL_PATH(../../HAL, tft/tft_spi.h) +#elif ENABLED(TFT_LVGL_UI_FSMC) + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) +#endif #define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) #define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) @@ -37,20 +37,14 @@ class TFT { public: + TFT_IO tftio; void spi_init(uint8_t spiRate); - uint8_t spi_Rec(); - uint8_t spi_read_write_byte(uint8_t data); - void spi_Read(uint8_t* buf, uint16_t nbyte); - void spi_Send(uint8_t b); - void spi_SendBlock(uint8_t token, const uint8_t* buf); void LCD_WR_REG(uint8_t cmd); void LCD_WR_DATA(uint8_t data); - void SetCursor(uint16_t x, uint16_t y); void SetPoint(uint16_t x, uint16_t y, uint16_t point); void SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height); void LCD_init(); void LCD_clear(uint16_t color); - void LCD_WriteRAM_Prepare(); void LCD_Draw_Logo(); }; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 9ef27afc9ba6..aad5e4362e38 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -51,6 +51,8 @@ #endif #include "../../../../gcode/gcode.h" +#include "pic_manager.h" + static lv_obj_t * scr; extern uint8_t sel_id; extern uint8_t once_flag; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 5d87eb9f8736..dc5e4910e939 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -500,14 +500,9 @@ char *creat_title_text() { } } - //SERIAL_ECHOLNPAIR("gPicturePreviewStart: ", gPicturePreviewStart, " PREVIEW_LITTLE_PIC_SIZE: ", PREVIEW_LITTLE_PIC_SIZE); - card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.spi_init(SPI_FULL_SPEED); - //SPI_TFT.SetCursor(0,0); SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); - SPI_TFT.LCD_WriteRAM_Prepare(); #else ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); LCD_WriteRAM_Prepare(); @@ -525,19 +520,11 @@ char *creat_title_text() { if (j >= 400) break; } #if ENABLED(TFT_LVGL_UI_SPI) - uint16_t Color, SpiColor; - SpiColor = (LV_COLOR_BACKGROUND.full >> 8) | ((LV_COLOR_BACKGROUND.full & 0xFF) << 8); - for (i = 0; i < 400;) { + for (i = 0; i < 400; i += 2) { p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = SpiColor; + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(bmp_public_buf, 400, true); - SPI_TFT_CS_H; + SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); #else for (i = 0; i < 400;) { p_index = (uint16_t *)(&bmp_public_buf[i]); @@ -627,10 +614,7 @@ char *creat_title_text() { card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.spi_init(SPI_FULL_SPEED); - //SPI_TFT.SetCursor(0,0); SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); - SPI_TFT.LCD_WriteRAM_Prepare(); #else ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1); LCD_WriteRAM_Prepare(); @@ -750,9 +734,6 @@ char *creat_title_text() { void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { int index; int y_off = 0; - int _y; - uint16_t *p_index; - int i; for (index = 0; index < 10; index++) { // 200*200 #if HAS_BAK_VIEW_IN_FLASH @@ -761,58 +742,24 @@ char *creat_title_text() { } else { default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 20k - #if ENABLED(TFT_LVGL_UI_SPI) - uint16_t Color; - for (i = 0; i < (DEFAULT_VIEW_MAX_SIZE / 10);) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xff) << 8); - i += 2; - } - #endif } #else default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 20k - #if ENABLED(TFT_LVGL_UI_SPI) - for (i = 0; i < (DEFAULT_VIEW_MAX_SIZE / 10);) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xff) << 8); - i += 2; - } - #endif #endif - i = 0; #if ENABLED(TFT_LVGL_UI_SPI) - - //SPI_TFT.spi_init(SPI_FULL_SPEED); - //SPI_TFT.SetWindows(xpos_pixel, y_off * 20+ypos_pixel, 200,20); //200*200 - //SPI_TFT.LCD_WriteRAM_Prepare(); - int j = 0; - for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { - SPI_TFT.spi_init(SPI_FULL_SPEED); - SPI_TFT.SetWindows(xpos_pixel, y_off * 20 + ypos_pixel + j, 200, 1); // 200*200 - SPI_TFT.LCD_WriteRAM_Prepare(); - - j++; - //memcpy(public_buf,&bmp_public_buf[i],400); - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(&bmp_public_buf[i], 400, true); - SPI_TFT_CS_H; - - i += 400; - if (i >= 8000) break; - } + SPI_TFT.SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 + SPI_TFT.tftio.WriteSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20); #else int x_off = 0; uint16_t temp_p; + int i = 0; + uint16_t *p_index; ili9320_SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 LCD_WriteRAM_Prepare(); - for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) { + for (int _y = y_off * 20; _y < (y_off + 1) * 20; _y++) { for (x_off = 0; x_off < 200; x_off++) { if (sel == 1) { temp_p = (uint16_t)(bmp_public_buf[i] | bmp_public_buf[i + 1] << 8); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index a35ae29701fb..a2795e933bcf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -590,8 +590,6 @@ void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint1 } void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor) { - // Select TFT SPI so it can receive data - TERN_(TFT_LVGL_UI_SPI, SPI_TFT.spi_init(SPI_FULL_SPEED)); while (*string != '\0') { disp_char_1624(x, y, *string, charColor, bkColor); string++; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp index a257d03489cd..62967b9d8061 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp @@ -22,249 +22,39 @@ #include "../../../../inc/MarlinConfig.h" -#if HAS_TFT_LVGL_UI - -#if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs - - #include - #include - #include - #include - - /* Timing configuration */ - #define FSMC_ADDRESS_SETUP_TIME 15// AddressSetupTime - #define FSMC_DATA_SETUP_TIME 15// DataSetupTime - - void LCD_IO_Init(uint8_t cs, uint8_t rs); - void LCD_IO_WriteData(uint16_t RegValue); - void LCD_IO_WriteReg(uint16_t Reg); - uint16_t LCD_IO_ReadData(uint16_t RegValue); - uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); - uint16_t ILI9488_ReadRAM(); - #ifdef LCD_USE_DMA_FSMC - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); - #endif - - /** - * FSMC LCD IO - */ - #define __ASM __asm - #define __STATIC_INLINE static inline - - __attribute__((always_inline)) __STATIC_INLINE void __DSB() {__ASM volatile ("dsb 0xF" ::: "memory");} - - #define FSMC_CS_NE1 PD7 - - #if ENABLED(STM32_XL_DENSITY) - #define FSMC_CS_NE2 PG9 - #define FSMC_CS_NE3 PG10 - #define FSMC_CS_NE4 PG12 - - #define FSMC_RS_A0 PF0 - #define FSMC_RS_A1 PF1 - #define FSMC_RS_A2 PF2 - #define FSMC_RS_A3 PF3 - #define FSMC_RS_A4 PF4 - #define FSMC_RS_A5 PF5 - #define FSMC_RS_A6 PF12 - #define FSMC_RS_A7 PF13 - #define FSMC_RS_A8 PF14 - #define FSMC_RS_A9 PF15 - #define FSMC_RS_A10 PG0 - #define FSMC_RS_A11 PG1 - #define FSMC_RS_A12 PG2 - #define FSMC_RS_A13 PG3 - #define FSMC_RS_A14 PG4 - #define FSMC_RS_A15 PG5 - #endif - - #define FSMC_RS_A16 PD11 - #define FSMC_RS_A17 PD12 - #define FSMC_RS_A18 PD13 - #define FSMC_RS_A19 PE3 - #define FSMC_RS_A20 PE4 - #define FSMC_RS_A21 PE5 - #define FSMC_RS_A22 PE6 - #define FSMC_RS_A23 PE2 - - #if ENABLED(STM32_XL_DENSITY) - #define FSMC_RS_A24 PG13 - #define FSMC_RS_A25 PG14 - #endif - - static uint8_t fsmcInit = 0; - - typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; - } LCD_CONTROLLER_TypeDef; - - LCD_CONTROLLER_TypeDef *LCD; - - void LCD_IO_Init(uint8_t cs, uint8_t rs) { - uint32_t controllerAddress; - struct fsmc_nor_psram_reg_map* fsmcPsramRegion; - - if (fsmcInit) return; - fsmcInit = 1; - - switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; - #endif - default: return; - } - - #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) - - switch (rs) { - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A0: _ORADDR( 1); break; - case FSMC_RS_A1: _ORADDR( 2); break; - case FSMC_RS_A2: _ORADDR( 3); break; - case FSMC_RS_A3: _ORADDR( 4); break; - case FSMC_RS_A4: _ORADDR( 5); break; - case FSMC_RS_A5: _ORADDR( 6); break; - case FSMC_RS_A6: _ORADDR( 7); break; - case FSMC_RS_A7: _ORADDR( 8); break; - case FSMC_RS_A8: _ORADDR( 9); break; - case FSMC_RS_A9: _ORADDR(10); break; - case FSMC_RS_A10: _ORADDR(11); break; - case FSMC_RS_A11: _ORADDR(12); break; - case FSMC_RS_A12: _ORADDR(13); break; - case FSMC_RS_A13: _ORADDR(14); break; - case FSMC_RS_A14: _ORADDR(15); break; - case FSMC_RS_A15: _ORADDR(16); break; - #endif - case FSMC_RS_A16: _ORADDR(17); break; - case FSMC_RS_A17: _ORADDR(18); break; - case FSMC_RS_A18: _ORADDR(19); break; - case FSMC_RS_A19: _ORADDR(20); break; - case FSMC_RS_A20: _ORADDR(21); break; - case FSMC_RS_A21: _ORADDR(22); break; - case FSMC_RS_A22: _ORADDR(23); break; - case FSMC_RS_A23: _ORADDR(24); break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A24: _ORADDR(25); break; - case FSMC_RS_A25: _ORADDR(26); break; - #endif - default: return; - } - - rcc_clk_enable(RCC_FSMC); - - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP);// FSMC_D02 - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP);// FSMC_D03 - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP);// FSMC_D04 - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP);// FSMC_D05 - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP);// FSMC_D06 - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP);// FSMC_D13 - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP);// FSMC_D14 - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 - - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP);// FSMC_NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP);// FSMC_NWE - - gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx - gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - - fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - - afio_remap(AFIO_REMAP_FSMC_NADV); - - LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; - } - - void LCD_IO_WriteData(uint16_t RegValue) { - LCD->RAM = RegValue; - __DSB(); - } - - void LCD_IO_WriteReg(uint16_t Reg) { - LCD->REG = Reg; - __DSB(); - } - - uint16_t LCD_IO_ReadData(uint16_t RegValue) { - LCD->REG = RegValue; - __DSB(); - - return LCD->RAM; +#if ENABLED(TFT_LVGL_UI_FSMC) + +#include HAL_PATH(../../HAL, tft/tft_fsmc.h) +TFT_IO tftio; + +void LCD_IO_Init(uint8_t cs, uint8_t rs); +void LCD_IO_WriteData(uint16_t RegValue); +void LCD_IO_WriteReg(uint16_t Reg); +#ifdef LCD_USE_DMA_FSMC + void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); +#endif + +void LCD_IO_Init(uint8_t cs, uint8_t rs) { + tftio.Init(); +} + +void LCD_IO_WriteData(uint16_t RegValue) { + tftio.WriteData(RegValue); +} + +void LCD_IO_WriteReg(uint16_t Reg) { + tftio.WriteReg(Reg); +} + +#ifdef LCD_USE_DMA_FSMC + void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { + tftio.WriteMultiple(color, count); } - uint16_t ILI9488_ReadRAM() { - uint16_t data; - data = LCD->RAM; - return data; + void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { + tftio.WriteSequence(data, length); } +#endif // LCD_USE_DMA_FSMC - uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - volatile uint32_t data; - LCD->REG = RegValue; - __DSB(); - - data = LCD->RAM; // dummy read - data = LCD->RAM & 0x00FF; - - while (--ReadSize) { - data <<= 8; - data |= (LCD->RAM & 0x00FF); - } - return uint32_t(data); - } - - #ifdef LCD_USE_DMA_FSMC - - void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { - while (count > 0) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, &color, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, count > 65535 ? 65535 : count); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {} - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - count = count > 65535 ? count - 65535 : 0; - } - } - - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {} - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - } - - void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - } - - void LCD_IO_WaitSequence_Async() { - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {} - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - } - - #endif // LCD_USE_DMA_FSMC - -#endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 81b50a101871..391e12ba3fc7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -42,9 +42,8 @@ #include "../../../../inc/MarlinConfig.h" -#if HAS_TOUCH_XPT2046 - #include "../../../touch/xpt2046.h" -#endif +#include HAL_PATH(../../HAL, tft/xpt2046.h) +XPT2046 touch; #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" @@ -121,14 +120,14 @@ void tft_set_cursor(uint16_t x, uint16_t y) { void LCD_WriteRAM_Prepare(void) { #if 0 - if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x8989)) { - ClrCs - LCD->LCD_REG = R34; - SetCs - } - else { - LCD_WrtReg(0x002C); - } + switch (DeviceCode) { + case 0x9325: case 0x9328: case 0x8989: { + ClrCs + LCD->LCD_REG = R34; + SetCs + } break; + default: LCD_WrtReg(0x002C); + } #else LCD_IO_WriteReg(0x002C); #endif @@ -197,8 +196,8 @@ void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16 LCD_WriteReg(0x0053, yEnd);*/ LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit - LCD_WriteReg(0x0052, 320 - xEnd); - LCD_WriteReg(0x0053, 320 - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0052, (LCD_FULL_PIXEL_HEIGHT) - xEnd); + LCD_WriteReg(0x0053, (LCD_FULL_PIXEL_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit } else { @@ -268,28 +267,10 @@ void LCD_Clear(uint16_t Color) { } } -extern uint16_t ILI9488_ReadRAM(); - +#include HAL_PATH(../../HAL, tft/tft_fsmc.h) +extern TFT_IO tftio; void init_tft() { uint16_t i; - //************* Start Initial Sequence **********// - - //start lcd pins and dma - #if PIN_EXISTS(LCD_BACKLIGHT) - OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away - #endif - - #if PIN_EXISTS(LCD_RESET) - // Perform a clean hardware reset with needed delays - OUT_WRITE(LCD_RESET_PIN, LOW); - _delay_ms(5); - WRITE(LCD_RESET_PIN, HIGH); - _delay_ms(5); - #endif - - #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) - WRITE(LCD_BACKLIGHT_PIN, HIGH); - #endif TERN_(HAS_LCD_CONTRAST, refresh_contrast()); @@ -303,12 +284,9 @@ void init_tft() { _delay_ms(5); - LCD_IO_WriteReg(0x00D3); - DeviceCode = ILI9488_ReadRAM(); //dummy read - DeviceCode = ILI9488_ReadRAM(); - DeviceCode = ILI9488_ReadRAM(); - DeviceCode <<= 8; - DeviceCode |= ILI9488_ReadRAM(); + DeviceCode = tftio.GetID() & 0xFFFF; + // Chitu and others + if (DeviceCode == 0x8066) DeviceCode = 0x9488; if (DeviceCode == 0x9488) { LCD_IO_WriteReg(0x00E0); @@ -436,7 +414,7 @@ void tft_lvgl_init() { //spi_flash_read_test(); - TERN_(HAS_TOUCH_XPT2046, touch.init()); + touch.Init(); lv_init(); @@ -492,35 +470,14 @@ void tft_lvgl_init() { void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { #if ENABLED(TFT_LVGL_UI_SPI) uint16_t i, width, height; - uint16_t clr_temp; - uint8_t tbuf[(LCD_FULL_PIXEL_WIDTH) * 2]; - - SPI_TFT.spi_init(SPI_FULL_SPEED); width = area->x2 - area->x1 + 1; height = area->y2 - area->y1 + 1; - for (int j = 0; j < height; j++) { - SPI_TFT.SetCursor(0, 0); - SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1 + j, width, 1); - SPI_TFT.LCD_WriteRAM_Prepare(); - - for (i = 0; i < width * 2;) { - clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11) - | ((uint16_t)color_p->ch.green << 5) - | ((uint16_t)color_p->ch.blue)); - - tbuf[i] = clr_temp >> 8; - tbuf[i + 1] = clr_temp; - i += 2; - color_p++; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(tbuf, width * 2, true); - SPI_TFT_CS_H; + SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height); + for (i = 0; i < height; i++) { + SPI_TFT.tftio.WriteSequence((uint16_t*)(color_p + width * i), width); } - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ W25QXX.init(SPI_QUARTER_SPEED); @@ -556,174 +513,23 @@ unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { return TICK_CYCLE * (lastTick <= curTick ? (curTick - lastTick) : (0xFFFFFFFF - lastTick + curTick)); } -#if ENABLED(TFT_LVGL_UI_SPI) - - #ifndef USE_XPT2046 - #define USE_XPT2046 1 - #define XPT2046_XY_SWAP 1 - #define XPT2046_X_INV 1 - #define XPT2046_Y_INV 0 - #endif - - #if USE_XPT2046 - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 201 - #define XPT2046_Y_MIN 164 - #define XPT2046_X_MAX 3919 - #define XPT2046_Y_MAX 3776 - #define XPT2046_AVG 4 - #define XPT2046_INV 1 - #endif - -#else - - #ifndef USE_XPT2046 - #define USE_XPT2046 1 - #ifndef XPT2046_XY_SWAP - #define XPT2046_XY_SWAP 1 - #endif - #ifndef XPT2046_X_INV - #define XPT2046_X_INV 0 - #endif - #ifndef XPT2046_Y_INV - #define XPT2046_Y_INV 1 - #endif - #endif - - #if USE_XPT2046 - #ifndef XPT2046_HOR_RES - #define XPT2046_HOR_RES 480 - #endif - #ifndef XPT2046_VER_RES - #define XPT2046_VER_RES 320 - #endif - #ifndef XPT2046_X_MIN - #define XPT2046_X_MIN 201 - #endif - #ifndef XPT2046_Y_MIN - #define XPT2046_Y_MIN 164 - #endif - #ifndef XPT2046_X_MAX - #define XPT2046_X_MAX 3919 - #endif - #ifndef XPT2046_Y_MAX - #define XPT2046_Y_MAX 3776 - #endif - #ifndef XPT2046_AVG - #define XPT2046_AVG 4 - #endif - #ifndef XPT2046_INV - #define XPT2046_INV 0 - #endif - #endif - -#endif - -static void xpt2046_corr(uint16_t *x, uint16_t *y) { - #if XPT2046_XY_SWAP - int16_t swap_tmp; - swap_tmp = *x; - *x = *y; - *y = swap_tmp; - #endif - if ((*x) > XPT2046_X_MIN) (*x) -= XPT2046_X_MIN; else (*x) = 0; - if ((*y) > XPT2046_Y_MIN) (*y) -= XPT2046_Y_MIN; else (*y) = 0; - (*x) = uint32_t(uint32_t(*x) * XPT2046_HOR_RES) / (XPT2046_X_MAX - XPT2046_X_MIN); - (*y) = uint32_t(uint32_t(*y) * XPT2046_VER_RES) / (XPT2046_Y_MAX - XPT2046_Y_MIN); - #if XPT2046_X_INV - (*x) = XPT2046_HOR_RES - (*x); - #endif - #if XPT2046_Y_INV - (*y) = XPT2046_VER_RES - (*y); - #endif -} - -#define times 4 -#define CHX 0x90 -#define CHY 0xD0 - -int SPI2_ReadWrite2Bytes(void) { - #define SPI_READ_WRITE_BYTE(B) TERN(TFT_LVGL_UI_SPI, SPI_TFT.spi_read_write_byte, W25QXX.spi_flash_read_write_byte)(B) - const uint16_t t1 = SPI_READ_WRITE_BYTE(0xFF), - t2 = SPI_READ_WRITE_BYTE(0xFF); - return (((t1 << 8) | t2) >> 3) & 0x0FFF; -} +static bool get_point(int16_t *x, int16_t *y) { + bool is_touched = touch.getRawPoint(x, y); -uint16_t x_addata[times], y_addata[times]; -void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) { - uint16_t i, j, k; - - TERN(TFT_LVGL_UI_SPI, SPI_TFT.spi_init, W25QXX.init)(SPI_SPEED_6); - - for (i = 0; i < times; i++) { - #if ENABLED(TFT_LVGL_UI_SPI) - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI_TFT.spi_read_write_byte(CHX); - y_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI_TFT.spi_read_write_byte(CHY); - x_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - #else // #if HAS_TOUCH_XPT2046 - OUT_WRITE(TOUCH_CS_PIN, LOW); - W25QXX.spi_flash_read_write_byte(CHX); - y_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - - OUT_WRITE(TOUCH_CS_PIN, LOW); - W25QXX.spi_flash_read_write_byte(CHY); - x_addata[i] = SPI2_ReadWrite2Bytes(); - WRITE(TOUCH_CS_PIN, HIGH); - #endif - - } - TERN(TFT_LVGL_UI_SPI,,W25QXX.init(SPI_QUARTER_SPEED)); - - for (i = 0; i < times; i++) - for (j = i + 1; j < times; j++) - if (x_addata[j] > x_addata[i]) { - k = x_addata[j]; - x_addata[j] = x_addata[i]; - x_addata[i] = k; - } - if (x_addata[times / 2 - 1] - x_addata[times / 2] > 50) { - *X_Addata = *Y_Addata = 0; - return; - } - - *X_Addata = (x_addata[times / 2 - 1] + x_addata[times / 2]) / 2; - - for (i = 0; i < times; i++) - for (j = i + 1; j < times; j++) - if (y_addata[j] > y_addata[i]) { - k = y_addata[j]; - y_addata[j] = y_addata[i]; - y_addata[i] = k; - } - - if (y_addata[times / 2 - 1] - y_addata[times / 2] > 50) { - *X_Addata = *Y_Addata = 0; - return; + if (is_touched) { + *x = int16_t((int32_t(*x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; + *y = int16_t((int32_t(*y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; } - *Y_Addata = (y_addata[times / 2 - 1] + y_addata[times / 2]) / 2; -} - -#define ADC_VALID_OFFSET 10 + #if ENABLED(GRAPHICAL_TFT_ROTATE_180) + x = (LCD_FULL_PIXEL_WIDTH) - x; + y = (LCD_FULL_PIXEL_HEIGHT) - y; + #endif -uint8_t TOUCH_PressValid(uint16_t _usX, uint16_t _usY) { - if ( (_usX <= ADC_VALID_OFFSET) - || (_usY <= ADC_VALID_OFFSET) - || (_usX >= 4095 - ADC_VALID_OFFSET) - || (_usY >= 4095 - ADC_VALID_OFFSET) - ) return 0; - return 1; + return is_touched; } -static lv_coord_t last_x = 0, last_y = 0; +static int16_t last_x = 0, last_y = 0; bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { uint32_t tmpTime, diffTime = 0; @@ -735,34 +541,24 @@ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { //touchpad_get_xy(&last_x, &last_y); /*Save the pressed coordinates and the state*/ if (diffTime > 10) { - //use marlin touch code if enabled - #if HAS_TOUCH_XPT2046 - touch.getTouchPoint(reinterpret_cast(last_x), reinterpret_cast(last_y)); - #else - XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y); - #endif - if (TOUCH_PressValid(last_x, last_y)) { + if (get_point(&last_x, &last_y)) { data->state = LV_INDEV_STATE_PR; - /* Set the coordinates (if released use the last pressed coordinates) */ + // Set the coordinates (if released use the last-pressed coordinates) - // SERIAL_ECHOLNPAIR("antes X: ", last_x, ", y: ", last_y); - xpt2046_corr((uint16_t *)&last_x, (uint16_t *)&last_y); - // SERIAL_ECHOLNPAIR("X: ", last_x, ", y: ", last_y); data->point.x = last_x; data->point.y = last_y; - last_x = 0; - last_y = 0; + last_x = last_y = 0; } - else { + else data->state = LV_INDEV_STATE_REL; - } + touch_time1 = tmpTime; } - return false; /*Return `false` because we are not buffering and no more data to read*/ + return false; // Return `false` since no data is buffering or left to read } #endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 6be67fc1a263..e4f0014417b1 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -164,7 +164,6 @@ #define HAS_LANG_SELECT_SCREEN 1 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - #define HAS_TOUCH_XPT2046 1 #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK @@ -183,6 +182,8 @@ #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_CS_PIN PD7 @@ -197,24 +198,10 @@ #define LCD_PIXEL_OFFSET_X 48 #define LCD_PIXEL_OFFSET_Y 48 - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 - - #define USE_XPT2046 1 - #define XPT2046_XY_SWAP 0 - #define XPT2046_X_INV 1 - #define XPT2046_Y_INV 0 - - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 140 - #define XPT2046_Y_MIN 200 - #define XPT2046_X_MAX 1900 - #define XPT2046_Y_MAX 1900 - #define XPT2046_AVG 4 - #define XPT2046_INV 0 + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 #elif ENABLED(TFT_480x320) #define TFT_RESET_PIN PF11 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 4633de40f2a5..3d36de82424f 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -198,7 +198,6 @@ #define HAS_LANG_SELECT_SCREEN 0 #define HAS_BAK_VIEW_IN_FLASH 0 #define HAS_LOGO_IN_FLASH 0 - #define HAS_TOUCH_XPT2046 1 #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK @@ -217,6 +216,8 @@ #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 + #define TFT_RESET_PIN PF11 + #define TFT_BACKLIGHT_PIN PD13 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_CS_PIN PD7 @@ -231,24 +232,10 @@ #define LCD_PIXEL_OFFSET_X 48 #define LCD_PIXEL_OFFSET_Y 48 - #define XPT2046_X_CALIBRATION -12316 - #define XPT2046_Y_CALIBRATION 8981 - #define XPT2046_X_OFFSET 340 - #define XPT2046_Y_OFFSET -20 - - #define USE_XPT2046 1 - #define XPT2046_XY_SWAP 0 - #define XPT2046_X_INV 1 - #define XPT2046_Y_INV 0 - - #define XPT2046_HOR_RES 480 - #define XPT2046_VER_RES 320 - #define XPT2046_X_MIN 140 - #define XPT2046_Y_MIN 200 - #define XPT2046_X_MAX 1900 - #define XPT2046_Y_MAX 1900 - #define XPT2046_AVG 4 - #define XPT2046_INV 0 + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 16040643520b..948663f6f059 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -177,6 +177,17 @@ #define LCD_BACKLIGHT_PIN PD13 + #define XPT2046_X_CALIBRATION 17880 + #define XPT2046_Y_CALIBRATION -12234 + #define XPT2046_X_OFFSET -45 + #define XPT2046_Y_OFFSET 349 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + #elif ENABLED(FSMC_GRAPHICAL_TFT) #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index be363e45374b..feac729c73b2 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -261,17 +261,30 @@ #define BTN_EN2 PE11 #define BTN_ENC PE13 -#elif ENABLED(TFT_LITTLE_VGL_UI) - - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - - #define LCD_BACKLIGHT_PIN PD13 + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + #ifndef LCD_FULL_PIXEL_WIDTH + #define LCD_FULL_PIXEL_WIDTH 480 + #endif + #ifndef LCD_FULL_PIXEL_HEIGHT + #define LCD_FULL_PIXEL_HEIGHT 320 + #endif #endif From f01cb240d7c3da66832a0ef1366784a73f0f4425 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 14 Aug 2020 00:10:34 +0000 Subject: [PATCH 336/483] [cron] Bump distribution date (2020-08-14) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 3babd11a3ca5..b0b9bfd96e50 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-13" + #define STRING_DISTRIBUTION_DATE "2020-08-14" #endif /** From 567d77f1cb62dd444ee2c13350b60bc2032fc083 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Fri, 14 Aug 2020 05:32:01 +0200 Subject: [PATCH 337/483] TFT: Restore ILI9341 colors and reversed logic (#19010) Followup to #18877, #18901, #18817 --- .../lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp | 5 ++++- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index 205cafbccb39..e42faf025527 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -366,7 +366,7 @@ static const uint16_t ili9328_init[] = { static const uint16_t ili9341_init[] = { ESC_REG(0x0010), ESC_DELAY(10), ESC_REG(0x0001), ESC_DELAY(200), - ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x00E8, 0x0028), + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x0028, 0x00E8), ESC_REG(0x003A), 0x0055, ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F, ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF, @@ -658,6 +658,9 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u setWindow = setWindow_ili9328; break; case 0x9341: // ILI9341 + WRITE_ESC_SEQUENCE(ili9341_init); + setWindow = setWindow_st7789v; + break; case 0x8066: // Anycubic / TronXY TFTs (480x320) WRITE_ESC_SEQUENCE(ili9488_init); setWindow = setWindow_st7789v; diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 2f5dbd010564..490fb617d17d 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -130,6 +130,12 @@ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 +#define FSMC_UPSCALE 2 +#define LCD_FULL_PIXEL_WIDTH 320 +#define LCD_FULL_PIXEL_HEIGHT 240 +#define LCD_PIXEL_OFFSET_X 32 +#define LCD_PIXEL_OFFSET_Y 32 + /** * Note: Alfawise U20/U30 boards DON'T use SPI2, as the hardware designer * mixed up MOSI and MISO pins. SPI is managed in SW, and needs pins From 3ddb720722133386c6e22f1d93554eb46f8d7abc Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Fri, 14 Aug 2020 05:37:57 +0200 Subject: [PATCH 338/483] Fix 'sync_plan_position' call (#19016) --- Marlin/src/module/stepper/indirection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 1fd1a72e7e9f..e9705cd3c322 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -850,7 +850,7 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define ENABLE_AXIS_Z() do{ ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); }while(0) #ifdef Z_AFTER_DEACTIVATE - #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; planner.sync_plan_position(); }while(0) + #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; sync_plan_position(); }while(0) #else #define Z_RESET() #endif From 506deedfdd2331947e6e5e4e996d611f9b964acf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Aug 2020 00:47:09 -0500 Subject: [PATCH 339/483] config-labels.py needs py3 --- buildroot/share/scripts/config-labels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/share/scripts/config-labels.py b/buildroot/share/scripts/config-labels.py index 8effb54eed58..267aa2d27353 100755 --- a/buildroot/share/scripts/config-labels.py +++ b/buildroot/share/scripts/config-labels.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # for python3.5 or higher #----------------------------------- From 16cb4303a4d9c7a86df9a843cd1ff71f41da88be Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Aug 2020 21:17:48 -0500 Subject: [PATCH 340/483] Fix touch test --- Marlin/src/lcd/touch/xpt2046.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Marlin/src/lcd/touch/xpt2046.cpp b/Marlin/src/lcd/touch/xpt2046.cpp index 1fed5b78f0e3..4407d945d351 100644 --- a/Marlin/src/lcd/touch/xpt2046.cpp +++ b/Marlin/src/lcd/touch/xpt2046.cpp @@ -133,12 +133,14 @@ uint8_t XPT2046::read_buttons() { // Touch within the button area simulates an encoder button if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) return WITHIN(x, 14, 77) ? EN_D - : WITHIN(x, 90, 153) ? EN_A - : WITHIN(x, 166, 229) ? EN_B - : WITHIN(x, 242, 305) ? EN_C - : 0; + : WITHIN(x, 90, 153) ? EN_A + : WITHIN(x, 166, 229) ? EN_B + : WITHIN(x, 242, 305) ? EN_C + : 0; - if (x > TOUCH_SENSOR_WIDTH || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT)) return 0; + if ( !WITHIN(x, SCREEN_START_LEFT, SCREEN_START_LEFT + SCREEN_WIDTH) + || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT) + ) return 0; // Column and row above BUTTON_AREA_TOP int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH), @@ -161,6 +163,7 @@ bool XPT2046::isTouched() { } #if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include static void touch_spi_init(uint8_t spiRate) { From aaba9b7880886d10f15d8aeb8eb6104193d1da9b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Aug 2020 21:30:12 -0500 Subject: [PATCH 341/483] Clean up M80/M81, DWIN --- Marlin/src/gcode/control/M80_M81.cpp | 14 +++++--------- Marlin/src/lcd/dwin/dwin.cpp | 8 +++++--- Marlin/src/lcd/fontutils.h | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 0dede7ea644c..3498bfbc39f7 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -22,15 +22,11 @@ #include "../gcode.h" #include "../../module/temperature.h" -#include "../../module/stepper.h" -#include "../../module/printcounter.h" // for print_job_timer +#include "../../module/printcounter.h" // for print_job_timer +#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM_P #include "../../inc/MarlinConfig.h" -#if HAS_LCD_MENU - #include "../../lcd/ultralcd.h" -#endif - #if HAS_SUICIDE #include "../../MarlinCore.h" #endif @@ -39,6 +35,8 @@ #if ENABLED(AUTO_POWER_CONTROL) #include "../../feature/power.h" + #else + void restore_stepper_drivers(); #endif // Could be moved to a feature, but this is all the data @@ -108,7 +106,5 @@ void GcodeSuite::M81() { PSU_OFF(); #endif - #if HAS_LCD_MENU - LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF ".")); - #endif + LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF ".")); } diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 1aa2656dcfd6..8cd7af15747d 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -935,7 +935,8 @@ void Goto_PrintProcess(void) { // Copy into filebuf string before entry char * const name = card.longest_filename(); - DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2, 60, name); + const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2; + DWIN_Draw_String(false, false, font8x16, White, Background_black, npos, 60, name); DWIN_ICON_Show(ICON, ICON_PrintTime, 17, 193); DWIN_ICON_Show(ICON, ICON_RemainTime, 150, 191); @@ -1523,7 +1524,7 @@ inline void make_name_without_ext(char *dst, char *src, int maxlen=MENU_CHAR_LIM if (!card.flag.filenameIsDir) while (pos && src[pos] != '.') pos--; // find last '.' (stop at 0) - int len = pos; // nul or '.' + size_t len = pos; // nul or '.' if (len > maxlen) { // Keep the name short pos = len = maxlen; // move nul down dst[--pos] = '.'; // insert dots @@ -3436,7 +3437,8 @@ void EachMomentUpdate(void) { Popup_Window_Resume(); draw_first_option(false); char * const name = card.longest_filename(); - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, (DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2, 252, name); + const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, npos, 252, name); DWIN_UpdateLCD(); break; } diff --git a/Marlin/src/lcd/fontutils.h b/Marlin/src/lcd/fontutils.h index 8839e36a2bd1..74c4a87fb9d3 100644 --- a/Marlin/src/lcd/fontutils.h +++ b/Marlin/src/lcd/fontutils.h @@ -38,6 +38,6 @@ int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, /* Get the character, decoding multibyte UTF8 characters and returning a pointer to the start of the next UTF8 character */ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval); -/* Returns lenght of string in CHARACTERS, NOT BYTES */ +/* Returns length of string in CHARACTERS, NOT BYTES */ uint8_t utf8_strlen(const char *pstart); uint8_t utf8_strlen_P(PGM_P pstart); From 56b35fc1039843bd6884fea872e424018335c0cb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Aug 2020 00:16:12 -0500 Subject: [PATCH 342/483] Do runout.reset after EEPROM read --- Marlin/src/module/settings.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index f1ab0fca6927..c84bbb44aea7 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -626,7 +626,12 @@ void MarlinSettings::postprocess() { #endif EEPROM_WRITE(home_offset); #endif + } + // + // Hotend Offsets, if any + // + { #if HAS_HOTEND_OFFSET // Skip hotend 0 which must be 0 LOOP_S_L_N(e, 1, HOTENDS) @@ -1521,6 +1526,8 @@ void MarlinSettings::postprocess() { _FIELD_TEST(runout_sensor_enabled); EEPROM_READ(runout_sensor_enabled); + TERN_(HAS_FILAMENT_SENSOR, if (runout.enabled) runout.reset()); + float runout_distance_mm; EEPROM_READ(runout_distance_mm); #if HAS_FILAMENT_RUNOUT_DISTANCE From b11c3ddbedf9c84352b58f6620a9d0b801f66004 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Aug 2020 00:32:59 -0500 Subject: [PATCH 343/483] M80 followup --- Marlin/src/gcode/control/M80_M81.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 3498bfbc39f7..6302bb5c6787 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -21,8 +21,10 @@ */ #include "../gcode.h" + #include "../../module/temperature.h" -#include "../../module/printcounter.h" // for print_job_timer +#include "../../module/planner.h" // for planner.finish_and_disable +#include "../../module/printcounter.h" // for print_job_timer.stop #include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM_P #include "../../inc/MarlinConfig.h" From 1b28a28ced22b5b3c7eda639ba576826f28dce3d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Aug 2020 06:26:18 -0500 Subject: [PATCH 344/483] Unhide /src folders in Sublime --- buildroot/share/sublime/MarlinFirmware.sublime-project | 1 - 1 file changed, 1 deletion(-) diff --git a/buildroot/share/sublime/MarlinFirmware.sublime-project b/buildroot/share/sublime/MarlinFirmware.sublime-project index e437369ec243..9b5234f7a13c 100644 --- a/buildroot/share/sublime/MarlinFirmware.sublime-project +++ b/buildroot/share/sublime/MarlinFirmware.sublime-project @@ -8,7 +8,6 @@ "MarlinFirmware/lib", "Marlin/lib", "datatmp", - "Marlin/*/src", ".vscode" ], "binary_file_patterns": From 5038cddfd54cf4b8484d10e7378fb2acd2b5f2ad Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 15 Aug 2020 01:25:45 +1200 Subject: [PATCH 345/483] Add option to arrange Neopixel sets in series (#18992) --- Marlin/Configuration.h | 1 + Marlin/src/feature/leds/neopixel.cpp | 2 +- Marlin/src/feature/leds/neopixel.h | 27 ++++++++++++++++++++------- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 3b6155f969de..a4b6c51ae5fb 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2354,6 +2354,7 @@ #define NEOPIXEL_PIN 4 // LED driving pin //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE //#define NEOPIXEL2_PIN 5 + #define NEOPIXEL2_INSERIES false // The default behaviour is 'false' with neopixel2 in parallel #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 neopixel strips are used #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 5d80cfe5d22a..520d4d63b22f 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -38,7 +38,7 @@ Marlin_NeoPixel neo; int8_t Marlin_NeoPixel::neoindex; Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800) - #if MULTIPLE_NEOPIXEL_TYPES + #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) , Marlin_NeoPixel::adaneo2(NEOPIXEL_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE + NEO_KHZ800) #endif ; diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 17057498d4d5..0155785e9afb 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -61,7 +61,7 @@ class Marlin_NeoPixel { private: static Adafruit_NeoPixel adaneo1 - #if MULTIPLE_NEOPIXEL_TYPES + #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) , adaneo2 #endif ; @@ -82,23 +82,36 @@ class Marlin_NeoPixel { static inline void begin() { adaneo1.begin(); - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.begin()); + #if ENABLED(NEOPIXEL2_INSERIES) + adaneo2.begin(); + #else + TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.begin()); + #endif } static inline void set_pixel_color(const uint16_t n, const uint32_t c) { - adaneo1.setPixelColor(n, c); - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setPixelColor(n, c)); + #if ENABLED(NEOPIXEL2_INSERIES) + if (n >= NEOPIXEL_PIXELS) adaneo2.setPixelColor(n - (NEOPIXEL_PIXELS), c); + else adaneo1.setPixelColor(n, c); + #else + adaneo1.setPixelColor(n, c); + TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setPixelColor(n, c)); + #endif } static inline void set_brightness(const uint8_t b) { adaneo1.setBrightness(b); - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setBrightness(b)); + #if ENABLED(NEOPIXEL2_INSERIES) + adaneo2.setBrightness(b); + #else + TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setBrightness(b)); + #endif } static inline void show() { adaneo1.show(); #if PIN_EXISTS(NEOPIXEL2) - #if MULTIPLE_NEOPIXEL_TYPES + #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) adaneo2.show(); #else adaneo1.setPin(NEOPIXEL2_PIN); @@ -113,7 +126,7 @@ class Marlin_NeoPixel { #endif // Accessors - static inline uint16_t pixels() { return adaneo1.numPixels(); } + static inline uint16_t pixels() { TERN(NEOPIXEL2_INSERIES, return adaneo1.numPixels() * 2, return adaneo1.numPixels()); } static inline uint8_t brightness() { return adaneo1.getBrightness(); } static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { return adaneo1.Color(r, g, b, w); From e69bbc3531f4545fb55a5d2699aa2bf65621061b Mon Sep 17 00:00:00 2001 From: Tommy Hartmann Date: Fri, 14 Aug 2020 15:35:53 +0200 Subject: [PATCH 346/483] ENDER2_STOCKDISPLAY for BTT SKR 1.4 (and Turbo) (#19002) --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index f467ba58cbec..83543703e540 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -250,6 +250,30 @@ #define LCD_PINS_ENABLE P1_23 #define LCD_PINS_D4 P1_21 + #elif ENABLED(ENDER2_STOCKDISPLAY) + + /** Creality Ender-2 display pinout + * _____ + * 5V | 1 2 | GND + * (MOSI) 1.23 | 3 4 | 1.22 (LCD_RS) + * (LCD_A0) 1.21 | 5 6 | 1.20 (BTN_EN2) + * RESET 1.19 | 7 8 | 1.18 (BTN_EN1) + * (BTN_ENC) 0.28 | 9 10| 1.30 (SCK) + * ----- + * EXP1 + */ + + #define BTN_EN1 P1_18 + #define BTN_EN2 P1_20 + #define BTN_ENC P0_28 + + #define DOGLCD_CS P1_22 + #define DOGLCD_A0 P1_21 + #define DOGLCD_SCK P1_30 + #define DOGLCD_MOSI P1_23 + #define FORCE_SOFT_SPI + #define LCD_BACKLIGHT_PIN -1 + #else #define BTN_ENC P0_28 // (58) open-drain From 1b097d0467173ed99eb4ee403481522977303a9e Mon Sep 17 00:00:00 2001 From: Robby Candra Date: Fri, 14 Aug 2020 20:38:00 +0700 Subject: [PATCH 347/483] Wait for hotend temp before Resume move (#19009) --- Marlin/src/feature/pause.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 77f352c399b5..2cb9c2df718e 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -582,6 +582,9 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_RESUME)); + // Check Temperature before moving hotend + ensure_safe_temperature(); + // Retract to prevent oozing unscaled_e_move(-(PAUSE_PARK_RETRACT_LENGTH), feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); @@ -594,8 +597,6 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Unretract unscaled_e_move(PAUSE_PARK_RETRACT_LENGTH, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); - ensure_safe_temperature(); - // Intelligent resuming #if ENABLED(FWRETRACT) // If retracted before goto pause From 6cfc4b571149847da25f7b10c37e9ebc3883bf26 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Fri, 14 Aug 2020 15:41:44 +0200 Subject: [PATCH 348/483] Let laser/spindle use free AVR servo timers (#19011) --- Marlin/src/HAL/AVR/ServoTimers.h | 8 +++++--- Marlin/src/HAL/AVR/inc/SanityCheck.h | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Marlin/src/HAL/AVR/ServoTimers.h b/Marlin/src/HAL/AVR/ServoTimers.h index 564714df6e8e..598db62578d4 100644 --- a/Marlin/src/HAL/AVR/ServoTimers.h +++ b/Marlin/src/HAL/AVR/ServoTimers.h @@ -60,9 +60,11 @@ #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) //#define _useTimer1 #define _useTimer3 - #define _useTimer4 - #if !HAS_MOTOR_CURRENT_PWM - #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. + #if NUM_SERVOS > SERVOS_PER_TIMER + #define _useTimer4 + #if !HAS_MOTOR_CURRENT_PWM && SERVOS > 2 * SERVOS_PER_TIMER + #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. + #endif #endif #elif defined(__AVR_ATmega32U4__) #define _useTimer3 diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h index e55e45b73bd0..731cf9286582 100644 --- a/Marlin/src/HAL/AVR/inc/SanityCheck.h +++ b/Marlin/src/HAL/AVR/inc/SanityCheck.h @@ -36,9 +36,10 @@ * Sanity checks for Spindle / Laser PWM */ #if ENABLED(SPINDLE_LASER_PWM) + #include "../ServoTimers.h" // Needed to check timer availability (_useTimer3) #if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13) #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt." - #elif NUM_SERVOS > 0 && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) + #elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system." #endif #elif defined(SPINDLE_LASER_FREQUENCY) From 8f730cfb6e474f98f4ac284d443bac061634c497 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 14 Aug 2020 08:45:48 -0500 Subject: [PATCH 349/483] Fix ExtUI base methods --- Marlin/src/lcd/extui/ui_api.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index c19275449507..3df9c17f6b8e 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -548,7 +548,7 @@ namespace ExtUI { void setAxisSteps_per_mm(const float value, const extruder_t extruder) { UNUSED_E(extruder); - planner.settings.axis_steps_per_mm[E_AXIS_N(axis - E0)] = value; + planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)] = value; } feedRate_t getAxisMaxFeedrate_mm_s(const axis_t axis) { @@ -557,7 +557,7 @@ namespace ExtUI { feedRate_t getAxisMaxFeedrate_mm_s(const extruder_t extruder) { UNUSED_E(extruder); - return planner.settings.max_feedrate_mm_s[E_AXIS_N(axis - E0)]; + return planner.settings.max_feedrate_mm_s[E_AXIS_N(extruder - E0)]; } void setAxisMaxFeedrate_mm_s(const feedRate_t value, const axis_t axis) { From f7ff3f0803a901c72ee7fd65736069f920cbcee2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 15 Aug 2020 00:10:28 +0000 Subject: [PATCH 350/483] [cron] Bump distribution date (2020-08-15) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index b0b9bfd96e50..c6abdd242934 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-14" + #define STRING_DISTRIBUTION_DATE "2020-08-15" #endif /** From 0e8cdd19389aa8004f5264371dc05461675fe83e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 16 Aug 2020 00:11:06 +0000 Subject: [PATCH 351/483] [cron] Bump distribution date (2020-08-16) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c6abdd242934..58b40b521d97 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-15" + #define STRING_DISTRIBUTION_DATE "2020-08-16" #endif /** From bb64aa7841b081ccada9384dd2401341601b24e2 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 15 Aug 2020 21:38:13 -0300 Subject: [PATCH 352/483] Update build script for PIO 4.4 (#19034) --- .github/workflows/test-builds.yml | 2 +- .../PlatformIO/scripts/common-dependencies.py | 24 ++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index fdb81fbdc9d2..1467f1b33fc4 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -106,7 +106,7 @@ jobs: - name: Install PlatformIO run: | - pip install -U https://github.com/platformio/platformio-core/archive/develop.zip + pip install -U https://github.com/platformio/platformio-core/archive/master.zip platformio update - name: Check out the PR diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 6c1b571bf16b..d5f6fc195807 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -9,12 +9,24 @@ import configparser except ImportError: import ConfigParser as configparser -from platformio.managers.package import PackageManager +try: + # PIO < 4.4 + from platformio.managers.package import PackageManager +except ImportError: + # PIO >= 4.4 + from platformio.package.meta import PackageSpec as PackageManager Import("env") FEATURE_CONFIG = {} +def parse_pkg_uri(spec): + if PackageManager.__name__ == 'PackageSpec': + return PackageManager(spec).name + else: + name, _, _ = PackageManager.parse_pkg_uri(spec) + return name + def add_to_feat_cnf(feature, flines): feat = FEATURE_CONFIG[feature] atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') @@ -56,7 +68,7 @@ def get_all_known_libs(): if not 'lib_deps' in feat: continue for dep in feat['lib_deps']: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) known_libs.append(name) return known_libs @@ -64,7 +76,7 @@ def get_all_env_libs(): env_libs = [] lib_deps = env.GetProjectOption('lib_deps') for dep in lib_deps: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) env_libs.append(name) return env_libs @@ -96,20 +108,20 @@ def apply_features_config(): # feat to add deps_to_add = {} for dep in feat['lib_deps']: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) deps_to_add[name] = dep # Does the env already have the dependency? deps = env.GetProjectOption('lib_deps') for dep in deps: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] # Are there any libraries that should be ignored? lib_ignore = env.GetProjectOption('lib_ignore') for dep in deps: - name, _, _ = PackageManager.parse_pkg_uri(dep) + name = parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] From e70440b7cbbabc0bf44db45273ec1a4baaf7d5cf Mon Sep 17 00:00:00 2001 From: Julius Mumme Date: Sun, 16 Aug 2020 05:50:28 +0200 Subject: [PATCH 353/483] Fix IS_PROBE_PIN macro (#19024) --- Marlin/src/inc/Conditionals_post.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 6243d82aa8c8..29ab2cfc2946 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1622,7 +1622,7 @@ // // Is an endstop plug used for extra Z endstops or the probe? -#define IS_PROBE_PIN(A,M) (HAS_CUSTOM_PROBE_PIN && Z_MIN_PROBE_PIN == P) +#define IS_PROBE_PIN(A,M) (HAS_CUSTOM_PROBE_PIN && Z_MIN_PROBE_PIN == A##_##M##_PIN) #define IS_X2_ENDSTOP(A,M) (ENABLED(X_DUAL_ENDSTOPS) && X2_USE_ENDSTOP == _##A##M##_) #define IS_Y2_ENDSTOP(A,M) (ENABLED(Y_DUAL_ENDSTOPS) && Y2_USE_ENDSTOP == _##A##M##_) #define IS_Z2_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && Z2_USE_ENDSTOP == _##A##M##_) From 19818a95a2bd10fe98431023a502229cbfa82f3a Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 16 Aug 2020 15:57:07 +1200 Subject: [PATCH 354/483] Checks for CR10_STOCKDISPLAY with Creality v4 (#19019) --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index ed281eb00c21..c36b4561b02b 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -134,6 +134,10 @@ #define ONBOARD_SD_CS_PIN PA4 // SDSS #define SDIO_SUPPORT +#if ENABLED(CR10_STOCKDISPLAY) && NONE(RET6_12864_LCD, VET6_12864_LCD) + #error "Define RET6_12864_LCD or VET6_12864_LCD to select pins for CR10_STOCKDISPLAY with the Creality V4 controller." +#endif + #if ENABLED(RET6_12864_LCD) /* RET6 12864 LCD */ @@ -146,6 +150,7 @@ #define BTN_EN2 PB14 #define BEEPER_PIN PC6 + #elif ENABLED(VET6_12864_LCD) /* VET6 12864 LCD */ From ed775ac9859e8b525c94681c8d8dfe82b7010dfd Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 17 Aug 2020 00:11:16 +0000 Subject: [PATCH 355/483] [cron] Bump distribution date (2020-08-17) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 58b40b521d97..7ae190fa9926 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-16" + #define STRING_DISTRIBUTION_DATE "2020-08-17" #endif /** From c55f47752069d687e57e4fe91a3b6e59828a657a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 18 Aug 2020 00:10:40 +0000 Subject: [PATCH 356/483] [cron] Bump distribution date (2020-08-18) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 7ae190fa9926..cdcbf65834ce 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-17" + #define STRING_DISTRIBUTION_DATE "2020-08-18" #endif /** From 167e42af996c2f8f745e8e2dfa6dbe0e9fa675e9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 19 Aug 2020 00:11:56 +0000 Subject: [PATCH 357/483] [cron] Bump distribution date (2020-08-19) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index cdcbf65834ce..9e9e5f3c7eae 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-18" + #define STRING_DISTRIBUTION_DATE "2020-08-19" #endif /** From 2cbc84855bfd2d1ccb6d2861573fd612b3e86d0a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Aug 2020 01:49:38 -0500 Subject: [PATCH 358/483] Creality DWIN simple beeper --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index c36b4561b02b..5aab757129da 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -170,7 +170,10 @@ #define BTN_EN2 PB12 //#define LCD_LED_PIN PB2 - #define BEEPER_PIN PB13 + #ifndef BEEPER_PIN + #define BEEPER_PIN PB13 + #undef SPEAKER + #endif #elif ENABLED(DWIN_VET6_CREALITY_LCD) From 092aad1813fdf61d6f34dcfee6737ab4a1015a19 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Aug 2020 00:49:23 -0500 Subject: [PATCH 359/483] Creality DWIN cleanup --- Marlin/src/lcd/dwin/dwin.cpp | 137 +++++++++++++++++------------------ Marlin/src/lcd/dwin/dwin.h | 4 +- 2 files changed, 70 insertions(+), 71 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 8cd7af15747d..e527c8dba024 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -65,8 +65,6 @@ #include "../../module/probe.h" #endif -#include "../../libs/buzzer.h" - #ifndef MACHINE_SIZE #define MACHINE_SIZE "220x220x250" #endif @@ -1065,36 +1063,40 @@ void HMI_Move_Z(void) { } } -void HMI_Move_E(void) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_CW) { - HMI_ValueStruct.Move_E_scale += EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - HMI_ValueStruct.Move_E_scale -= EncoderRate.encoderMoveValue; - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - checkkey = AxisMove; - EncoderRate.encoderRateEnabled = 0; - last_E_scale = HMI_ValueStruct.Move_E_scale; - show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - if (!planner.is_full()) { - planner.synchronize(); // Wait for planner moves to finish! - planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); +#if EXTRUDERS + + void HMI_Move_E(void) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (encoder_diffState == ENCODER_DIFF_CW) { + HMI_ValueStruct.Move_E_scale += EncoderRate.encoderMoveValue; + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + HMI_ValueStruct.Move_E_scale -= EncoderRate.encoderMoveValue; } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + checkkey = AxisMove; + EncoderRate.encoderRateEnabled = 0; + last_E_scale = HMI_ValueStruct.Move_E_scale; + show_plus_or_minus(font8x16, Background_black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + if (!planner.is_full()) { + planner.synchronize(); // Wait for planner moves to finish! + planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); + } + DWIN_UpdateLCD(); + return; + } + if ((HMI_ValueStruct.Move_E_scale - last_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) + HMI_ValueStruct.Move_E_scale = last_E_scale + (EXTRUDE_MAXLENGTH) * MINUNITMULT; + else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) + HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; + current_position.e = HMI_ValueStruct.Move_E_scale / 10; + show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); DWIN_UpdateLCD(); - return; } - if ((HMI_ValueStruct.Move_E_scale - last_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scale = last_E_scale + (EXTRUDE_MAXLENGTH) * MINUNITMULT; - else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; - current_position.e = HMI_ValueStruct.Move_E_scale / 10; - show_plus_or_minus(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - DWIN_UpdateLCD(); } -} + +#endif void HMI_Zoffset(void) { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); @@ -2096,7 +2098,9 @@ inline void Draw_Move_Menu() { DWIN_Frame_AreaCopy(1, 58, 118, 271 - 165, 479 - 347, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 109, 118, 271 - 114, 479 - 347, LBLX, MBASE(2)); DWIN_Frame_AreaCopy(1, 160, 118, 271 - 62, 479 - 347, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 212, 118, 271 - 18, 479 - 348, LBLX, MBASE(4)); + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 212, 118, 271 - 18, 479 - 348, LBLX, MBASE(4)); + #endif } else { #ifdef USE_STRING_HEADINGS @@ -2107,7 +2111,9 @@ inline void Draw_Move_Menu() { draw_move_en(MBASE(1)); say_x(33 + 3, MBASE(1)); // "Move X" draw_move_en(MBASE(2)); say_y(33 + 3, MBASE(2)); // "Move Y" draw_move_en(MBASE(3)); say_z(33 + 3, MBASE(3)); // "Move Z" - DWIN_Frame_AreaCopy(1, 123, 192, 271 - 95, 479 - 277, LBLX, MBASE(4)); // "Extruder" + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 123, 192, 271 - 95, 479 - 277, LBLX, MBASE(4)); // "Extruder" + #endif } Draw_Back_First(select_axis.now == 0); @@ -2116,6 +2122,18 @@ inline void Draw_Move_Menu() { LOOP_L_N(i, MROWS) Draw_Menu_Line(i + 1, ICON_MoveX + i); } +#include "../../libs/buzzer.h" + +void HMI_AudioFeedback(const bool success=true) { + if (success) { + buzzer.tone(100, 659); + buzzer.tone(10, 0); + buzzer.tone(100, 698); + } + else + buzzer.tone(40, 440); +} + /* Prepare */ void HMI_Prepare(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); @@ -2202,8 +2220,7 @@ void HMI_Prepare(void) { #else // Apply workspace offset, making the current position 0,0,0 queue.inject_P(PSTR("G92 X0 Y0 Z0")); - buzzer.tone(100, 659); - buzzer.tone(100, 698); + HMI_AudioFeedback(); #endif break; case 5: // PLA preheat @@ -2347,27 +2364,17 @@ void HMI_Control(void) { select_motion.reset(); Draw_Motion_Menu(); break; - case 3: // write EEPROM - if (settings.save()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else - buzzer.tone(20, 440); - break; - case 4: // read EEPROM - if (settings.load()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else {buzzer.tone(20, 440);} - break; + case 3: { // write EEPROM + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + case 4: { // read EEPROM + const bool success = settings.load(); + HMI_AudioFeedback(success); + } break; case 5: // resume EEPROM settings.reset(); - #if HAS_BUZZER - buzzer.tone(100, 659); - buzzer.tone(100, 698); - #endif + HMI_AudioFeedback(); break; case 6: // info checkkey = Info; @@ -3006,14 +3013,10 @@ void HMI_PLAPreheatSetting(void) { EncoderRate.encoderRateEnabled = 1; break; #endif - case 4: // save PLA configuration - if (settings.save()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else - buzzer.tone(20, 440); - break; + case 4: { // save PLA configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; default: break; } } @@ -3064,14 +3067,10 @@ void HMI_ABSPreheatSetting(void) { EncoderRate.encoderRateEnabled = 1; break; #endif - case 4: // save PLA configuration - if (settings.save()) { - buzzer.tone(100, 659); - buzzer.tone(100, 698); - } - else - buzzer.tone(20, 440); - break; + case 4: { // save ABS configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; default: break; } @@ -3496,11 +3495,11 @@ void DWIN_HandleScreen(void) { case Move_X: HMI_Move_X(); break; case Move_Y: HMI_Move_Y(); break; case Move_Z: HMI_Move_Z(); break; - case Extruder: HMI_Move_E(); break; - case Homeoffset: HMI_Zoffset(); break; #if HAS_HOTEND + case Extruder: HMI_Move_E(); break; case ETemp: HMI_ETemp(); break; #endif + case Homeoffset: HMI_Zoffset(); break; #if HAS_HEATED_BED case BedTemp: HMI_BedTemp(); break; #endif diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/dwin.h index 2d24d2504e7e..cddc582fc2ba 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/dwin.h @@ -68,11 +68,11 @@ enum processID { Move_X, Move_Y, Move_Z, - Extruder, - Homeoffset, #if HAS_HOTEND + Extruder, ETemp, #endif + Homeoffset, #if HAS_HEATED_BED BedTemp, #endif From f205bff2ccdaea55e2dc9e6fa1f98820a9761d42 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 19 Aug 2020 09:49:46 +0200 Subject: [PATCH 360/483] Fix PSU on for PID autotune (#19066) --- Marlin/src/feature/power.cpp | 5 ++--- Marlin/src/module/temperature.cpp | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 74850122c296..5be554e5e472 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -59,7 +59,6 @@ bool Power::is_power_needed() { // If any of the drivers or the bed are enabled... if (X_ENABLE_READ() == X_ENABLE_ON || Y_ENABLE_READ() == Y_ENABLE_ON || Z_ENABLE_READ() == Z_ENABLE_ON - || TERN0(HAS_HEATED_BED, thermalManager.temp_bed.soft_pwm_amount > 0) #if HAS_X2_ENABLE || X2_ENABLE_READ() == X_ENABLE_ON #endif @@ -75,8 +74,8 @@ bool Power::is_power_needed() { #endif ) return true; - HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0) return true; - if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0)) return true; + HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0 || thermalManager.temp_hotend[e].soft_pwm_amount > 0) return true; + if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0 || thermalManager.temp_bed.soft_pwm_amount > 0)) return true; #if HAS_HOTEND && AUTO_POWER_E_TEMP HOTEND_LOOP() if (thermalManager.degHotend(e) >= AUTO_POWER_E_TEMP) return true; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1dc480a9279a..a217fc9ab81b 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -444,6 +444,7 @@ volatile bool Temperature::raw_temps_ready = false; LEDColor color = ONHEATINGSTART(); #endif + TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = false); // PID Tuning loop From 60b61de395a02bce6f1a7b4663780ae9b8ef4d11 Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Wed, 19 Aug 2020 10:58:41 +0300 Subject: [PATCH 361/483] "SD init fail" status error (#19064) --- Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/sd/cardreader.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 9f6178ae50cc..3791a4ad180d 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -48,6 +48,7 @@ namespace Language_en { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media Inserted"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media Removed"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Waiting for media"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD Init Fail"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Media read error"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB device removed"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB start failed"); diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 864552516bcc..3aa7156e7b02 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -376,8 +376,13 @@ void CardReader::mount() { flag.mounted = true; SERIAL_ECHO_MSG(STR_SD_CARD_OK); } - cdroot(); + if (flag.mounted) + cdroot(); + else { + spiInit(SPI_SPEED); // Return to base SPI speed + ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); + } ui.refresh(); } From d3c51614760b87d4844b77f2459195ffc2cd9a62 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Wed, 19 Aug 2020 09:59:37 +0200 Subject: [PATCH 362/483] Fix __ARM__ / __arm__ typo (#19063) --- Marlin/src/module/stepper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index c9d87486f87d..e5f65a3cdd97 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1264,7 +1264,7 @@ void Stepper::set_directions() { } FORCE_INLINE int32_t Stepper::_eval_bezier_curve(const uint32_t curr_step) { - #if defined(__ARM__) || defined(__thumb__) + #if defined(__arm__) || defined(__thumb__) // For ARM Cortex M3/M4 CPUs, we have the optimized assembler version, that takes 43 cycles to execute uint32_t flo = 0; From a62ae2aa2d74613fe15bf2b8ca4390fca53ebf01 Mon Sep 17 00:00:00 2001 From: Steven Haigh Date: Thu, 20 Aug 2020 09:58:18 +1000 Subject: [PATCH 363/483] Default Filament Runout Sensor enabled state (#19013) --- Marlin/Configuration.h | 9 +++++---- Marlin/src/feature/runout.cpp | 8 -------- Marlin/src/feature/runout.h | 35 ++++++++++++++++++++++++---------- Marlin/src/module/settings.cpp | 21 +++++++++++--------- 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index a4b6c51ae5fb..24d7c46a6899 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1178,10 +1178,11 @@ */ //#define FILAMENT_RUNOUT_SENSOR #if ENABLED(FILAMENT_RUNOUT_SENSOR) - #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. - #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. - #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. - //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500. + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. // Set one or more commands to execute on filament runout. // (After 'M412 H' Marlin will ask the host to handle the process.) diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 0b5c0ebc2e62..71f31f214559 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -44,14 +44,6 @@ bool FilamentMonitorBase::enabled = true, #include "../module/tool_change.h" #endif -/** - * Called by FilamentSensorSwitch::run when filament is detected. - * Called by FilamentSensorEncoder::block_completed when motion is detected. - */ -void FilamentSensorBase::filament_present(const uint8_t extruder) { - runout.filament_present(extruder); // calls response.filament_present(extruder) -} - #if HAS_FILAMENT_RUNOUT_DISTANCE float RunoutResponseDelayed::runout_distance_mm = FILAMENT_RUNOUT_DISTANCE_MM; volatile float RunoutResponseDelayed::runout_mm_countdown[EXTRUDERS]; diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 450ae1830a7b..a7f836684949 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -48,6 +48,24 @@ void event_filament_runout(); +template +class TFilamentMonitor; +class FilamentSensorEncoder; +class FilamentSensorSwitch; +class RunoutResponseDelayed; +class RunoutResponseDebounced; + +/********************************* TEMPLATE SPECIALIZATION *********************************/ + +typedef TFilamentMonitor< + TERN(HAS_FILAMENT_RUNOUT_DISTANCE, RunoutResponseDelayed, RunoutResponseDebounced), + TERN(FILAMENT_MOTION_SENSOR, FilamentSensorEncoder, FilamentSensorSwitch) + > FilamentMonitor; + +extern FilamentMonitor runout; + +/*******************************************************************************************/ + class FilamentMonitorBase { public: static bool enabled, filament_ran_out; @@ -121,7 +139,13 @@ class TFilamentMonitor : public FilamentMonitorBase { class FilamentSensorBase { protected: - static void filament_present(const uint8_t extruder); + /** + * Called by FilamentSensorSwitch::run when filament is detected. + * Called by FilamentSensorEncoder::block_completed when motion is detected. + */ + static inline void filament_present(const uint8_t extruder) { + runout.filament_present(extruder); // ...which calls response.filament_present(extruder) + } public: static inline void setup() { @@ -311,12 +335,3 @@ class FilamentSensorBase { }; #endif // !HAS_FILAMENT_RUNOUT_DISTANCE - -/********************************* TEMPLATE SPECIALIZATION *********************************/ - -typedef TFilamentMonitor< - TERN(HAS_FILAMENT_RUNOUT_DISTANCE, RunoutResponseDelayed, RunoutResponseDebounced), - TERN(FILAMENT_MOTION_SENSOR, FilamentSensorEncoder, FilamentSensorSwitch) - > FilamentMonitor; - -extern FilamentMonitor runout; diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c84bbb44aea7..29b12e5cafc1 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -106,6 +106,9 @@ #if HAS_FILAMENT_SENSOR #include "../feature/runout.h" + #ifndef FIL_RUNOUT_ENABLED_DEFAULT + #define FIL_RUNOUT_ENABLED_DEFAULT true + #endif #endif #if ENABLED(EXTRA_LIN_ADVANCE_K) @@ -646,15 +649,16 @@ void MarlinSettings::postprocess() { #if HAS_FILAMENT_SENSOR const bool &runout_sensor_enabled = runout.enabled; #else - constexpr bool runout_sensor_enabled = true; + constexpr int8_t runout_sensor_enabled = -1; #endif + _FIELD_TEST(runout_sensor_enabled); + EEPROM_WRITE(runout_sensor_enabled); + #if HAS_FILAMENT_RUNOUT_DISTANCE const float &runout_distance_mm = runout.runout_distance(); #else constexpr float runout_distance_mm = 0; #endif - _FIELD_TEST(runout_sensor_enabled); - EEPROM_WRITE(runout_sensor_enabled); EEPROM_WRITE(runout_distance_mm); } @@ -1518,13 +1522,12 @@ void MarlinSettings::postprocess() { // Filament Runout Sensor // { - #if HAS_FILAMENT_SENSOR - const bool &runout_sensor_enabled = runout.enabled; - #else - bool runout_sensor_enabled; - #endif + int8_t runout_sensor_enabled; _FIELD_TEST(runout_sensor_enabled); EEPROM_READ(runout_sensor_enabled); + #if HAS_FILAMENT_SENSOR + runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; + #endif TERN_(HAS_FILAMENT_SENSOR, if (runout.enabled) runout.reset()); @@ -2476,7 +2479,7 @@ void MarlinSettings::reset() { // #if HAS_FILAMENT_SENSOR - runout.enabled = true; + runout.enabled = FIL_RUNOUT_ENABLED_DEFAULT; runout.reset(); TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, runout.set_runout_distance(FILAMENT_RUNOUT_DISTANCE_MM)); #endif From a4809b3a47fbaee73527f9fc1457d3aaa0a0f536 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 20 Aug 2020 00:11:10 +0000 Subject: [PATCH 364/483] [cron] Bump distribution date (2020-08-20) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 9e9e5f3c7eae..b48b75c9d4e7 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-19" + #define STRING_DISTRIBUTION_DATE "2020-08-20" #endif /** From 64e181979c347ff5a12eb33b03e527216088eca7 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 20 Aug 2020 12:18:39 +1200 Subject: [PATCH 365/483] Env mega2560ext adds pins 70-85 (#19022) --- .../copy_marlin_variant_to_framework.py | 14 +- .../variants/megaextendedpins/pins_arduino.h | 461 ++++++++++++++++++ platformio.ini | 17 +- 3 files changed, 488 insertions(+), 4 deletions(-) create mode 100755 buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index 02957ec47026..b66ba27fa646 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -1,6 +1,7 @@ import os,shutil from SCons.Script import DefaultEnvironment from platformio import util +from platformio.managers.package import PackageManager def copytree(src, dst, symlinks=False, ignore=None): for item in os.listdir(src): @@ -16,7 +17,18 @@ def copytree(src, dst, symlinks=False, ignore=None): board = env.BoardConfig() variant = board.get("build.variant") -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32") +platform_packages = env.GetProjectOption('platform_packages') +# if there's no framework defined, take it from the class name of platform +framewords = { + "Ststm32Platform": "framework-arduinoststm32", + "AtmelavrPlatform": "framework-arduino-avr" +} +if len(platform_packages) == 0: + platform_name = framewords[platform.__class__.__name__] +else: + platform_name, _, _ = PackageManager.parse_pkg_uri(platform_packages[0]) + +FRAMEWORK_DIR = platform.get_package_dir(platform_name) assert os.path.isdir(FRAMEWORK_DIR) assert os.path.isdir("buildroot/share/PlatformIO/variants") diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h new file mode 100755 index 000000000000..77d0beca9b9d --- /dev/null +++ b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h @@ -0,0 +1,461 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2007 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define NUM_DIGITAL_PINS 86 +#define NUM_ANALOG_INPUTS 16 +#define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1) +#define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46)) + +#define PIN_SPI_SS (53) +#define PIN_SPI_MOSI (51) +#define PIN_SPI_MISO (50) +#define PIN_SPI_SCK (52) + +static const uint8_t SS = PIN_SPI_SS; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +#define PIN_WIRE_SDA (20) +#define PIN_WIRE_SCL (21) + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; + +#define LED_BUILTIN 13 + +#define PIN_A0 (54) +#define PIN_A1 (55) +#define PIN_A2 (56) +#define PIN_A3 (57) +#define PIN_A4 (58) +#define PIN_A5 (59) +#define PIN_A6 (60) +#define PIN_A7 (61) +#define PIN_A8 (62) +#define PIN_A9 (63) +#define PIN_A10 (64) +#define PIN_A11 (65) +#define PIN_A12 (66) +#define PIN_A13 (67) +#define PIN_A14 (68) +#define PIN_A15 (69) + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; +static const uint8_t A3 = PIN_A3; +static const uint8_t A4 = PIN_A4; +static const uint8_t A5 = PIN_A5; +static const uint8_t A6 = PIN_A6; +static const uint8_t A7 = PIN_A7; +static const uint8_t A8 = PIN_A8; +static const uint8_t A9 = PIN_A9; +static const uint8_t A10 = PIN_A10; +static const uint8_t A11 = PIN_A11; +static const uint8_t A12 = PIN_A12; +static const uint8_t A13 = PIN_A13; +static const uint8_t A14 = PIN_A14; +static const uint8_t A15 = PIN_A15; + +// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins) +// Only pins available for RECEIVE (TRANSMIT can be on any pin): +// (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me) +// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 + +#define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \ + (((p) >= 50) && ((p) <= 53)) || \ + (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) ) + +#define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \ + ( (((p) >= 62) && ((p) <= 69)) ? 2 : \ + 0 ) ) + +#define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \ + ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \ + ((uint8_t *)0) ) ) + +#define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \ + ( ((p) == 50) ? 3 : \ + ( ((p) == 51) ? 2 : \ + ( ((p) == 52) ? 1 : \ + ( ((p) == 53) ? 0 : \ + ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \ + 0 ) ) ) ) ) ) + +#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT))) + +#ifdef ARDUINO_MAIN + +const uint16_t PROGMEM port_to_mode_PGM[] = { + NOT_A_PORT, + (uint16_t) &DDRA, + (uint16_t) &DDRB, + (uint16_t) &DDRC, + (uint16_t) &DDRD, + (uint16_t) &DDRE, + (uint16_t) &DDRF, + (uint16_t) &DDRG, + (uint16_t) &DDRH, + NOT_A_PORT, + (uint16_t) &DDRJ, + (uint16_t) &DDRK, + (uint16_t) &DDRL, +}; + +const uint16_t PROGMEM port_to_output_PGM[] = { + NOT_A_PORT, + (uint16_t) &PORTA, + (uint16_t) &PORTB, + (uint16_t) &PORTC, + (uint16_t) &PORTD, + (uint16_t) &PORTE, + (uint16_t) &PORTF, + (uint16_t) &PORTG, + (uint16_t) &PORTH, + NOT_A_PORT, + (uint16_t) &PORTJ, + (uint16_t) &PORTK, + (uint16_t) &PORTL, +}; + +const uint16_t PROGMEM port_to_input_PGM[] = { + NOT_A_PIN, + (uint16_t) &PINA, + (uint16_t) &PINB, + (uint16_t) &PINC, + (uint16_t) &PIND, + (uint16_t) &PINE, + (uint16_t) &PINF, + (uint16_t) &PING, + (uint16_t) &PINH, + NOT_A_PIN, + (uint16_t) &PINJ, + (uint16_t) &PINK, + (uint16_t) &PINL, +}; + +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { + // PORTLIST + // ------------------------------------------- + PE , // PE 0 ** 0 ** USART0_RX + PE , // PE 1 ** 1 ** USART0_TX + PE , // PE 4 ** 2 ** PWM2 + PE , // PE 5 ** 3 ** PWM3 + PG , // PG 5 ** 4 ** PWM4 + PE , // PE 3 ** 5 ** PWM5 + PH , // PH 3 ** 6 ** PWM6 + PH , // PH 4 ** 7 ** PWM7 + PH , // PH 5 ** 8 ** PWM8 + PH , // PH 6 ** 9 ** PWM9 + PB , // PB 4 ** 10 ** PWM10 + PB , // PB 5 ** 11 ** PWM11 + PB , // PB 6 ** 12 ** PWM12 + PB , // PB 7 ** 13 ** PWM13 + PJ , // PJ 1 ** 14 ** USART3_TX + PJ , // PJ 0 ** 15 ** USART3_RX + PH , // PH 1 ** 16 ** USART2_TX + PH , // PH 0 ** 17 ** USART2_RX + PD , // PD 3 ** 18 ** USART1_TX + PD , // PD 2 ** 19 ** USART1_RX + PD , // PD 1 ** 20 ** I2C_SDA + PD , // PD 0 ** 21 ** I2C_SCL + PA , // PA 0 ** 22 ** D22 + PA , // PA 1 ** 23 ** D23 + PA , // PA 2 ** 24 ** D24 + PA , // PA 3 ** 25 ** D25 + PA , // PA 4 ** 26 ** D26 + PA , // PA 5 ** 27 ** D27 + PA , // PA 6 ** 28 ** D28 + PA , // PA 7 ** 29 ** D29 + PC , // PC 7 ** 30 ** D30 + PC , // PC 6 ** 31 ** D31 + PC , // PC 5 ** 32 ** D32 + PC , // PC 4 ** 33 ** D33 + PC , // PC 3 ** 34 ** D34 + PC , // PC 2 ** 35 ** D35 + PC , // PC 1 ** 36 ** D36 + PC , // PC 0 ** 37 ** D37 + PD , // PD 7 ** 38 ** D38 + PG , // PG 2 ** 39 ** D39 + PG , // PG 1 ** 40 ** D40 + PG , // PG 0 ** 41 ** D41 + PL , // PL 7 ** 42 ** D42 + PL , // PL 6 ** 43 ** D43 + PL , // PL 5 ** 44 ** D44 + PL , // PL 4 ** 45 ** D45 + PL , // PL 3 ** 46 ** D46 + PL , // PL 2 ** 47 ** D47 + PL , // PL 1 ** 48 ** D48 + PL , // PL 0 ** 49 ** D49 + PB , // PB 3 ** 50 ** SPI_MISO + PB , // PB 2 ** 51 ** SPI_MOSI + PB , // PB 1 ** 52 ** SPI_SCK + PB , // PB 0 ** 53 ** SPI_SS + PF , // PF 0 ** 54 ** A0 + PF , // PF 1 ** 55 ** A1 + PF , // PF 2 ** 56 ** A2 + PF , // PF 3 ** 57 ** A3 + PF , // PF 4 ** 58 ** A4 + PF , // PF 5 ** 59 ** A5 + PF , // PF 6 ** 60 ** A6 + PF , // PF 7 ** 61 ** A7 + PK , // PK 0 ** 62 ** A8 + PK , // PK 1 ** 63 ** A9 + PK , // PK 2 ** 64 ** A10 + PK , // PK 3 ** 65 ** A11 + PK , // PK 4 ** 66 ** A12 + PK , // PK 5 ** 67 ** A13 + PK , // PK 6 ** 68 ** A14 + PK , // PK 7 ** 69 ** A15 + PG , // PG 4 ** 70 ** D70 + PG , // PG 3 ** 71 ** D71 + PJ , // PJ 2 ** 72 ** D72 + PJ , // PJ 3 ** 73 ** D73 + PJ , // PJ 7 ** 74 ** D74 + PJ , // PJ 4 ** 75 ** D75 + PJ , // PJ 5 ** 76 ** D76 + PJ , // PJ 6 ** 77 ** D77 + PE , // PE 2 ** 78 ** D78 + PE , // PE 6 ** 79 ** D79 + PE , // PE 7 ** 80 ** D80 + PD , // PD 4 ** 81 ** D81 + PD , // PD 5 ** 82 ** D82 + PD , // PD 6 ** 83 ** D83 + PH , // PH 2 ** 84 ** D84 + PH , // PH 7 ** 85 ** D85 +}; + +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { + // PIN IN PORT + // ------------------------------------------- + _BV( 0 ) , // PE 0 ** 0 ** USART0_RX + _BV( 1 ) , // PE 1 ** 1 ** USART0_TX + _BV( 4 ) , // PE 4 ** 2 ** PWM2 + _BV( 5 ) , // PE 5 ** 3 ** PWM3 + _BV( 5 ) , // PG 5 ** 4 ** PWM4 + _BV( 3 ) , // PE 3 ** 5 ** PWM5 + _BV( 3 ) , // PH 3 ** 6 ** PWM6 + _BV( 4 ) , // PH 4 ** 7 ** PWM7 + _BV( 5 ) , // PH 5 ** 8 ** PWM8 + _BV( 6 ) , // PH 6 ** 9 ** PWM9 + _BV( 4 ) , // PB 4 ** 10 ** PWM10 + _BV( 5 ) , // PB 5 ** 11 ** PWM11 + _BV( 6 ) , // PB 6 ** 12 ** PWM12 + _BV( 7 ) , // PB 7 ** 13 ** PWM13 + _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX + _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX + _BV( 1 ) , // PH 1 ** 16 ** USART2_TX + _BV( 0 ) , // PH 0 ** 17 ** USART2_RX + _BV( 3 ) , // PD 3 ** 18 ** USART1_TX + _BV( 2 ) , // PD 2 ** 19 ** USART1_RX + _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA + _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL + _BV( 0 ) , // PA 0 ** 22 ** D22 + _BV( 1 ) , // PA 1 ** 23 ** D23 + _BV( 2 ) , // PA 2 ** 24 ** D24 + _BV( 3 ) , // PA 3 ** 25 ** D25 + _BV( 4 ) , // PA 4 ** 26 ** D26 + _BV( 5 ) , // PA 5 ** 27 ** D27 + _BV( 6 ) , // PA 6 ** 28 ** D28 + _BV( 7 ) , // PA 7 ** 29 ** D29 + _BV( 7 ) , // PC 7 ** 30 ** D30 + _BV( 6 ) , // PC 6 ** 31 ** D31 + _BV( 5 ) , // PC 5 ** 32 ** D32 + _BV( 4 ) , // PC 4 ** 33 ** D33 + _BV( 3 ) , // PC 3 ** 34 ** D34 + _BV( 2 ) , // PC 2 ** 35 ** D35 + _BV( 1 ) , // PC 1 ** 36 ** D36 + _BV( 0 ) , // PC 0 ** 37 ** D37 + _BV( 7 ) , // PD 7 ** 38 ** D38 + _BV( 2 ) , // PG 2 ** 39 ** D39 + _BV( 1 ) , // PG 1 ** 40 ** D40 + _BV( 0 ) , // PG 0 ** 41 ** D41 + _BV( 7 ) , // PL 7 ** 42 ** D42 + _BV( 6 ) , // PL 6 ** 43 ** D43 + _BV( 5 ) , // PL 5 ** 44 ** D44 + _BV( 4 ) , // PL 4 ** 45 ** D45 + _BV( 3 ) , // PL 3 ** 46 ** D46 + _BV( 2 ) , // PL 2 ** 47 ** D47 + _BV( 1 ) , // PL 1 ** 48 ** D48 + _BV( 0 ) , // PL 0 ** 49 ** D49 + _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO + _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI + _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK + _BV( 0 ) , // PB 0 ** 53 ** SPI_SS + _BV( 0 ) , // PF 0 ** 54 ** A0 + _BV( 1 ) , // PF 1 ** 55 ** A1 + _BV( 2 ) , // PF 2 ** 56 ** A2 + _BV( 3 ) , // PF 3 ** 57 ** A3 + _BV( 4 ) , // PF 4 ** 58 ** A4 + _BV( 5 ) , // PF 5 ** 59 ** A5 + _BV( 6 ) , // PF 6 ** 60 ** A6 + _BV( 7 ) , // PF 7 ** 61 ** A7 + _BV( 0 ) , // PK 0 ** 62 ** A8 + _BV( 1 ) , // PK 1 ** 63 ** A9 + _BV( 2 ) , // PK 2 ** 64 ** A10 + _BV( 3 ) , // PK 3 ** 65 ** A11 + _BV( 4 ) , // PK 4 ** 66 ** A12 + _BV( 5 ) , // PK 5 ** 67 ** A13 + _BV( 6 ) , // PK 6 ** 68 ** A14 + _BV( 7 ) , // PK 7 ** 69 ** A15 + _BV( 4 ) , // PG 4 ** 70 ** D70 + _BV( 3 ) , // PG 3 ** 71 ** D71 + _BV( 2 ) , // PJ 2 ** 72 ** D72 + _BV( 3 ) , // PJ 3 ** 73 ** D73 + _BV( 7 ) , // PJ 7 ** 74 ** D74 + _BV( 4 ) , // PJ 4 ** 75 ** D75 + _BV( 5 ) , // PJ 5 ** 76 ** D76 + _BV( 6 ) , // PJ 6 ** 77 ** D77 + _BV( 2 ) , // PE 2 ** 78 ** D78 + _BV( 6 ) , // PE 6 ** 79 ** D79 + _BV( 7 ) , // PE 7 ** 80 ** D80 + _BV( 4 ) , // PD 4 ** 81 ** D81 + _BV( 5 ) , // PD 5 ** 82 ** D82 + _BV( 6 ) , // PD 6 ** 83 ** D83 + _BV( 2 ) , // PH 2 ** 84 ** D84 + _BV( 7 ) , // PH 7 ** 85 ** D85 +}; + +const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { + // TIMERS + // ------------------------------------------- + NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX + NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX + TIMER3B , // PE 4 ** 2 ** PWM2 + TIMER3C , // PE 5 ** 3 ** PWM3 + TIMER0B , // PG 5 ** 4 ** PWM4 + TIMER3A , // PE 3 ** 5 ** PWM5 + TIMER4A , // PH 3 ** 6 ** PWM6 + TIMER4B , // PH 4 ** 7 ** PWM7 + TIMER4C , // PH 5 ** 8 ** PWM8 + TIMER2B , // PH 6 ** 9 ** PWM9 + TIMER2A , // PB 4 ** 10 ** PWM10 + TIMER1A , // PB 5 ** 11 ** PWM11 + TIMER1B , // PB 6 ** 12 ** PWM12 + TIMER0A , // PB 7 ** 13 ** PWM13 + NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX + NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX + NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX + NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX + NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX + NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX + NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA + NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL + NOT_ON_TIMER , // PA 0 ** 22 ** D22 + NOT_ON_TIMER , // PA 1 ** 23 ** D23 + NOT_ON_TIMER , // PA 2 ** 24 ** D24 + NOT_ON_TIMER , // PA 3 ** 25 ** D25 + NOT_ON_TIMER , // PA 4 ** 26 ** D26 + NOT_ON_TIMER , // PA 5 ** 27 ** D27 + NOT_ON_TIMER , // PA 6 ** 28 ** D28 + NOT_ON_TIMER , // PA 7 ** 29 ** D29 + NOT_ON_TIMER , // PC 7 ** 30 ** D30 + NOT_ON_TIMER , // PC 6 ** 31 ** D31 + NOT_ON_TIMER , // PC 5 ** 32 ** D32 + NOT_ON_TIMER , // PC 4 ** 33 ** D33 + NOT_ON_TIMER , // PC 3 ** 34 ** D34 + NOT_ON_TIMER , // PC 2 ** 35 ** D35 + NOT_ON_TIMER , // PC 1 ** 36 ** D36 + NOT_ON_TIMER , // PC 0 ** 37 ** D37 + NOT_ON_TIMER , // PD 7 ** 38 ** D38 + NOT_ON_TIMER , // PG 2 ** 39 ** D39 + NOT_ON_TIMER , // PG 1 ** 40 ** D40 + NOT_ON_TIMER , // PG 0 ** 41 ** D41 + NOT_ON_TIMER , // PL 7 ** 42 ** D42 + NOT_ON_TIMER , // PL 6 ** 43 ** D43 + TIMER5C , // PL 5 ** 44 ** D44 + TIMER5B , // PL 4 ** 45 ** D45 + TIMER5A , // PL 3 ** 46 ** D46 + NOT_ON_TIMER , // PL 2 ** 47 ** D47 + NOT_ON_TIMER , // PL 1 ** 48 ** D48 + NOT_ON_TIMER , // PL 0 ** 49 ** D49 + NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO + NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI + NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK + NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS + NOT_ON_TIMER , // PF 0 ** 54 ** A0 + NOT_ON_TIMER , // PF 1 ** 55 ** A1 + NOT_ON_TIMER , // PF 2 ** 56 ** A2 + NOT_ON_TIMER , // PF 3 ** 57 ** A3 + NOT_ON_TIMER , // PF 4 ** 58 ** A4 + NOT_ON_TIMER , // PF 5 ** 59 ** A5 + NOT_ON_TIMER , // PF 6 ** 60 ** A6 + NOT_ON_TIMER , // PF 7 ** 61 ** A7 + NOT_ON_TIMER , // PK 0 ** 62 ** A8 + NOT_ON_TIMER , // PK 1 ** 63 ** A9 + NOT_ON_TIMER , // PK 2 ** 64 ** A10 + NOT_ON_TIMER , // PK 3 ** 65 ** A11 + NOT_ON_TIMER , // PK 4 ** 66 ** A12 + NOT_ON_TIMER , // PK 5 ** 67 ** A13 + NOT_ON_TIMER , // PK 6 ** 68 ** A14 + NOT_ON_TIMER , // PK 7 ** 69 ** A15 + NOT_ON_TIMER , // PG 4 ** 70 ** D70 + NOT_ON_TIMER , // PG 3 ** 71 ** D71 + NOT_ON_TIMER , // PJ 2 ** 72 ** D72 + NOT_ON_TIMER , // PJ 3 ** 73 ** D73 + NOT_ON_TIMER , // PJ 7 ** 74 ** D74 + NOT_ON_TIMER , // PJ 4 ** 75 ** D75 + NOT_ON_TIMER , // PJ 5 ** 76 ** D76 + NOT_ON_TIMER , // PJ 6 ** 77 ** D77 + NOT_ON_TIMER , // PE 2 ** 78 ** D78 + NOT_ON_TIMER , // PE 6 ** 79 ** D79 + NOT_ON_TIMER , // PE 7 ** 80 ** D80 + NOT_ON_TIMER , // PD 4 ** 81 ** D81 + NOT_ON_TIMER , // PD 5 ** 82 ** D82 + NOT_ON_TIMER , // PD 6 ** 83 ** D83 + NOT_ON_TIMER , // PH 2 ** 84 ** D84 + NOT_ON_TIMER , // PH 7 ** 85 ** D85 +}; + +#endif + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE Serial +#define SERIAL_PORT_HARDWARE1 Serial1 +#define SERIAL_PORT_HARDWARE2 Serial2 +#define SERIAL_PORT_HARDWARE3 Serial3 +#define SERIAL_PORT_HARDWARE_OPEN Serial1 +#define SERIAL_PORT_HARDWARE_OPEN1 Serial2 +#define SERIAL_PORT_HARDWARE_OPEN2 Serial3 + +#endif diff --git a/platformio.ini b/platformio.ini index 10990b4d2151..27b11b2aa707 100644 --- a/platformio.ini +++ b/platformio.ini @@ -406,9 +406,20 @@ src_filter = ${common.default_src_filter} + # ATmega2560 # [env:mega2560] -platform = atmelavr -extends = common_avr8 -board = megaatmega2560 +platform = atmelavr +extends = common_avr8 +board = megaatmega2560 + +# +# ATmega2560 with extended pins 70-85 defined +# +[env:mega2560ext] +platform = atmelavr +extends = mega2560 +board = megaatmega2560 +board_build.variant = megaextendedpins +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py # # ATmega1280 From 3426c7fc94beb62dedc85d5f5cd9ac9cac0859b1 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Thu, 20 Aug 2020 03:11:20 +0200 Subject: [PATCH 366/483] Configurable number of M106 fans (#18883) --- Marlin/Configuration.h | 4 ++++ Marlin/src/inc/Conditionals_post.h | 22 +++++++++++++++++++--- Marlin/src/inc/SanityCheck.h | 7 +++++++ Marlin/src/module/temperature.cpp | 2 +- Marlin/src/pins/sam/pins_CNCONTROLS_15D.h | 2 +- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 24d7c46a6899..986b9efb6508 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2275,6 +2275,10 @@ // @section extras +// Set number of user-controlled fans. Disable to use all board-defined fans. +// :[1,2,3,4,5,6,7,8] +//#define NUM_M106_FANS 1 + // Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 29ab2cfc2946..5d7322753f85 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1876,12 +1876,28 @@ #undef AUTO_POWER_CHAMBER_FAN #endif -// Other fans +// Print Cooling fans (limit) +#ifdef NUM_M106_FANS + #define MAX_FANS NUM_M106_FANS +#else + #define MAX_FANS 8 // Max supported fans +#endif + +#define _NOT_E_AUTO(N,F) (E##N##_AUTO_FAN_PIN != FAN##F##_PIN) +#define _HAS_FAN(F) (PIN_EXISTS(FAN##F) \ + && CONTROLLER_FAN_PIN != FAN##F##_PIN \ + && _NOT_E_AUTO(0,F) \ + && _NOT_E_AUTO(1,F) \ + && _NOT_E_AUTO(2,F) \ + && _NOT_E_AUTO(3,F) \ + && _NOT_E_AUTO(4,F) \ + && _NOT_E_AUTO(5,F) \ + && _NOT_E_AUTO(6,F) \ + && _NOT_E_AUTO(7,F) \ + && F < MAX_FANS) #if PIN_EXISTS(FAN) #define HAS_FAN0 1 #endif -#define _NOT_E_AUTO(N,F) (E##N##_AUTO_FAN_PIN != FAN##F##_PIN) -#define _HAS_FAN(F) (PIN_EXISTS(FAN##F) && CONTROLLER_FAN_PIN != FAN##F##_PIN && _NOT_E_AUTO(0,F) && _NOT_E_AUTO(1,F) && _NOT_E_AUTO(2,F) && _NOT_E_AUTO(3,F) && _NOT_E_AUTO(4,F) && _NOT_E_AUTO(5,F) && _NOT_E_AUTO(6,F) && _NOT_E_AUTO(7,F)) #if _HAS_FAN(1) #define HAS_FAN1 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6fcd867981de..d31a8267781f 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1106,6 +1106,13 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "FANMUX0_PIN and FANMUX1_PIN must be set before FANMUX2_PIN can be set." #endif +/** + * Limited user-controlled fans + */ +#if NUM_M106_FANS > FAN_COUNT + #error "The selected board doesn't support enough user-controlled fans. Reduce NUM_M106_FANS." +#endif + /** * Limited number of servos */ diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a217fc9ab81b..1208e4e99569 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -195,7 +195,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif #if ENABLED(ADAPTIVE_FAN_SLOWING) - uint8_t Temperature::fan_speed_scaler[FAN_COUNT] = ARRAY_N(FAN_COUNT, 128, 128, 128, 128, 128, 128); + uint8_t Temperature::fan_speed_scaler[FAN_COUNT] = ARRAY_N(FAN_COUNT, 128, 128, 128, 128, 128, 128, 128, 128); #endif /** diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h index b977ad1aba54..a2094bee4daf 100644 --- a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h +++ b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h @@ -92,7 +92,7 @@ // // Fans // -//#define FAN0_PIN 8 +//#define FAN_PIN 8 // // Auto fans From 38cd7b993884108eab13d9266ac69392be705b89 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Aug 2020 20:03:49 -0500 Subject: [PATCH 367/483] Config adjustments --- Marlin/Configuration.h | 2 +- Marlin/Configuration_adv.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 986b9efb6508..dc0416d516b4 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2359,7 +2359,7 @@ #define NEOPIXEL_PIN 4 // LED driving pin //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE //#define NEOPIXEL2_PIN 5 - #define NEOPIXEL2_INSERIES false // The default behaviour is 'false' with neopixel2 in parallel + //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 neopixel strips are used #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1c29af1f46cb..529dcc3091ae 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -825,13 +825,13 @@ //#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated -// Minimum time that a segment needs to take as the buffer gets emptied -#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. - // Default Minimum Feedrates for printing and travel moves #define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. #define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. +// Minimum time that a segment needs to take as the buffer gets emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. + // Slow down the machine if the lookahead buffer is (by default) half full. // Increase the slowdown divisor for larger buffer sizes. #define SLOWDOWN From 853aec2c9a355c262001e0a0516bbb0decfd7749 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 20 Aug 2020 01:38:22 -0500 Subject: [PATCH 368/483] Move ExtUI displays to sub-folder (#19070) --- .../anycubic_chiron_lcd.cpp} | 6 ++--- .../anycubic_i3mega_lcd.cpp} | 8 +++---- .../dgus_lcd.cpp} | 12 +++++----- .../{extui_example.cpp => extui/example.cpp} | 6 ++--- .../malyan_lcd.cpp} | 24 +++++++++---------- platformio.ini | 16 ++++++------- 6 files changed, 36 insertions(+), 36 deletions(-) rename Marlin/src/lcd/{extui_anycubic_chiron_lcd.cpp => extui/anycubic_chiron_lcd.cpp} (99%) rename Marlin/src/lcd/{extui_anycubic_i3mega_lcd.cpp => extui/anycubic_i3mega_lcd.cpp} (95%) rename Marlin/src/lcd/{extui_dgus_lcd.cpp => extui/dgus_lcd.cpp} (95%) rename Marlin/src/lcd/{extui_example.cpp => extui/example.cpp} (97%) rename Marlin/src/lcd/{extui_malyan_lcd.cpp => extui/malyan_lcd.cpp} (97%) diff --git a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp similarity index 99% rename from Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp rename to Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index 15cc96711c73..889a25b85950 100644 --- a/Marlin/src/lcd/extui_anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -21,16 +21,16 @@ */ /** - * extui_anycubic_chiron_lcd.cpp + * anycubic_chiron_lcd.cpp * * Anycubic Chiron TFT support for Marlin */ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if ENABLED(ANYCUBIC_LCD_CHIRON) -#include "extui/ui_api.h" +#include "ui_api.h" #if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if GRID_MAX_POINTS_X != 5 || GRID_MAX_POINTS_Y != 5 diff --git a/Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp similarity index 95% rename from Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp rename to Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp index 360ea75de8ea..15526d16fc21 100644 --- a/Marlin/src/lcd/extui_anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp @@ -21,15 +21,15 @@ */ /** - * extui_anycubic_i3mega_lcd.cpp + * anycubic_i3mega_lcd.cpp */ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if ENABLED(ANYCUBIC_LCD_I3MEGA) -#include "extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h" -#include "extui/ui_api.h" +#include "lib/anycubic_i3mega/anycubic_i3mega_lcd.h" +#include "ui_api.h" #include // for the ::tone() call diff --git a/Marlin/src/lcd/extui_dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp similarity index 95% rename from Marlin/src/lcd/extui_dgus_lcd.cpp rename to Marlin/src/lcd/extui/dgus_lcd.cpp index c3978eb7e187..d175b5acac9a 100644 --- a/Marlin/src/lcd/extui_dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -21,19 +21,19 @@ */ /** - * extui_dgus_lcd.cpp + * dgus_lcd.cpp * * DGUS implementation for Marlin by coldtobi, Feb-May 2019 */ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if HAS_DGUS_LCD -#include "extui/ui_api.h" -#include "extui/lib/dgus/DGUSDisplay.h" -#include "extui/lib/dgus/DGUSDisplayDef.h" -#include "extui/lib/dgus/DGUSScreenHandler.h" +#include "ui_api.h" +#include "lib/dgus/DGUSDisplay.h" +#include "lib/dgus/DGUSDisplayDef.h" +#include "lib/dgus/DGUSScreenHandler.h" extern const char NUL_STR[]; diff --git a/Marlin/src/lcd/extui_example.cpp b/Marlin/src/lcd/extui/example.cpp similarity index 97% rename from Marlin/src/lcd/extui_example.cpp rename to Marlin/src/lcd/extui/example.cpp index 5258a5b6a27d..a5ef5652bc0f 100644 --- a/Marlin/src/lcd/extui_example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -1,5 +1,5 @@ /********************* - * extui_example.cpp * + * example.cpp * *********************/ /**************************************************************************** @@ -19,11 +19,11 @@ * location: . * ****************************************************************************/ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if BOTH(EXTUI_EXAMPLE, EXTENSIBLE_UI) -#include "extui/ui_api.h" +#include "ui_api.h" // To implement a new UI, complete the functions below and // read or update Marlin's state using the methods in the diff --git a/Marlin/src/lcd/extui_malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp similarity index 97% rename from Marlin/src/lcd/extui_malyan_lcd.cpp rename to Marlin/src/lcd/extui/malyan_lcd.cpp index 38a8fbc0f99a..b5148065c7cc 100644 --- a/Marlin/src/lcd/extui_malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -21,7 +21,7 @@ */ /** - * extui_malyan_lcd.cpp + * malyan_lcd.cpp * * LCD implementation for Malyan's LCD, a separate ESP8266 MCU running * on Serial1 for the M200 board. This module outputs a pseudo-gcode @@ -41,25 +41,25 @@ * Copyright (c) 2017 Jason Nelson (xC0000005) */ -#include "../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" #if ENABLED(MALYAN_LCD) #define DEBUG_MALYAN_LCD -#include "extui/ui_api.h" +#include "ui_api.h" -#include "ultralcd.h" -#include "../sd/cardreader.h" -#include "../module/temperature.h" -#include "../module/stepper.h" -#include "../module/motion.h" -#include "../libs/duration_t.h" -#include "../module/printcounter.h" -#include "../gcode/queue.h" +#include "../ultralcd.h" +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/stepper.h" +#include "../../module/motion.h" +#include "../../libs/duration_t.h" +#include "../../module/printcounter.h" +#include "../../gcode/queue.h" #define DEBUG_OUT ENABLED(DEBUG_MALYAN_LCD) -#include "../core/debug_out.h" +#include "../../core/debug_out.h" // On the Malyan M200, this will be Serial1. On a RAMPS board, // it might not be. diff --git a/platformio.ini b/platformio.ini index 27b11b2aa707..e3ff6c152634 100644 --- a/platformio.ini +++ b/platformio.ini @@ -49,12 +49,12 @@ default_src_filter = + - - + - - - - - - - - - - + - - + - + - - - - - + - - - - @@ -241,11 +241,11 @@ HAS_MENU_TMC = src_filter=+ HAS_MENU_TOUCH_SCREEN = src_filter=+ HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_I3MEGA = src_filter=+ -HAS_DGUS_LCD = src_filter=+ + +HAS_DGUS_LCD = src_filter=+ + TOUCH_UI_FTDI_EVE = src_filter=+ -HAS_ANYCUBIC_TFT_EXTUI = src_filter=+ -EXTUI_EXAMPLE = src_filter=+ -MALYAN_LCD = src_filter=+ +HAS_ANYCUBIC_TFT_EXTUI = src_filter=+ +EXTUI_EXAMPLE = src_filter=+ +MALYAN_LCD = src_filter=+ HAS_SPI_LCD = src_filter=+ USB_FLASH_DRIVE_SUPPORT = src_filter=+ AUTO_BED_LEVELING_BILINEAR = src_filter=+ From 16e1dbbb216d79535bcc9d95a74d865fa08c23c2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 21 Aug 2020 00:11:45 +0000 Subject: [PATCH 369/483] [cron] Bump distribution date (2020-08-21) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index b48b75c9d4e7..9c750422719d 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-20" + #define STRING_DISTRIBUTION_DATE "2020-08-21" #endif /** From 28a0650cf3dcc14f8dadf0b13ccc44b506207617 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 20 Aug 2020 02:47:16 -0500 Subject: [PATCH 370/483] Add custom_verbose, custom_gcc deps flags --- .../PlatformIO/scripts/common-dependencies.py | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index d5f6fc195807..def3bf40c225 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -18,7 +18,16 @@ Import("env") -FEATURE_CONFIG = {} +#print(env.Dump()) + +try: + verbose = int(env.GetProjectOption('custom_verbose')) +except: + verbose = 0 + +def blab(str): + if verbose: + print(str) def parse_pkg_uri(spec): if PackageManager.__name__ == 'PackageSpec': @@ -27,6 +36,8 @@ def parse_pkg_uri(spec): name, _, _ = PackageManager.parse_pkg_uri(spec) return name +FEATURE_CONFIG = {} + def add_to_feat_cnf(feature, flines): feat = FEATURE_CONFIG[feature] atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') @@ -91,7 +102,8 @@ def force_ignore_unused_libs(): known_libs = get_all_known_libs() diff = (list(set(known_libs) - set(env_libs))) lib_ignore = env.GetProjectOption('lib_ignore') + diff - print("Ignore libraries:", lib_ignore) + if verbose: + print("Ignore libraries:", lib_ignore) set_env_field('lib_ignore', lib_ignore) def apply_features_config(): @@ -103,7 +115,7 @@ def apply_features_config(): feat = FEATURE_CONFIG[feature] if 'lib_deps' in feat and len(feat['lib_deps']): - print("Adding lib_deps for %s... " % feature) + blab("Adding lib_deps for %s... " % feature) # feat to add deps_to_add = {} @@ -131,11 +143,11 @@ def apply_features_config(): set_env_field('lib_deps', deps + list(deps_to_add.values())) if 'extra_scripts' in feat: - print("Running extra_scripts for %s... " % feature) + blab("Running extra_scripts for %s... " % feature) env.SConscript(feat['extra_scripts'], exports="env") if 'src_filter' in feat: - print("Adding src_filter for %s... " % feature) + blab("Adding src_filter for %s... " % feature) src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder my_srcs = re.findall( r'[+-](<.*?>)', feat['src_filter']) @@ -149,7 +161,7 @@ def apply_features_config(): env.Replace(SRC_FILTER=src_filter) if 'lib_ignore' in feat: - print("Adding lib_ignore for %s... " % feature) + blab("Adding lib_ignore for %s... " % feature) lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] set_env_field('lib_ignore', lib_ignore) @@ -159,41 +171,49 @@ def apply_features_config(): ENV_BUILD_PATH = os.path.join(env.Dictionary('PROJECT_BUILD_DIR'), env['PIOENV']) GCC_PATH_CACHE = os.path.join(ENV_BUILD_PATH, ".gcc_path") def search_compiler(): + try: + filepath = env.GetProjectOption('custom_gcc') + blab('Getting compiler from env') + return filepath + except: + pass + if os.path.exists(GCC_PATH_CACHE): - print('Getting g++ path from cache') + blab('Getting g++ path from cache') with open(GCC_PATH_CACHE, 'r') as f: return f.read() - # PlatformIO inserts the toolchain bin folder on the front of the $PATH # Find the current platform compiler by searching the $PATH + # which will be in a platformio toolchain bin folder + path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + gcc = "g++" if env['PLATFORM'] == 'win32': path_separator = ';' - path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + r'.*\\bin' - gcc = "g++.exe" + path_regex += r'.*\\bin' + gcc += ".exe" else: path_separator = ':' - path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) + r'.*/bin' - gcc = "g++" + path_regex += r'/.+/bin' # Search for the compiler - for path in env['ENV']['PATH'].split(path_separator): - if not re.search(path_regex, path, re.IGNORECASE): + for pathdir in env['ENV']['PATH'].split(path_separator): + if not re.search(path_regex, pathdir, re.IGNORECASE): continue - for file in os.listdir(path): - if not file.endswith(gcc): + for filepath in os.listdir(pathdir): + if not filepath.endswith(gcc): continue # Cache the g++ path to no search always if os.path.exists(ENV_BUILD_PATH): - print('Caching g++ for current env') + blab('Caching g++ for current env') with open(GCC_PATH_CACHE, 'w+') as f: - f.write(file) + f.write(filepath) - return file + return filepath - file = env.get('CXX') - print("Couldn't find a compiler! Fallback to", file) - return file + filepath = env.get('CXX') + blab("Couldn't find a compiler! Fallback to %s" % filepath) + return filepath # # Use the compiler to get a list of all enabled features @@ -203,7 +223,6 @@ def load_marlin_features(): return # Process defines - #print(env.Dump()) build_flags = env.get('BUILD_FLAGS') build_flags = env.ParseFlagsExtended(build_flags) @@ -221,7 +240,7 @@ def load_marlin_features(): cmd += ['-w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] cmd = ' '.join(cmd) - print(cmd) + blab(cmd) define_list = subprocess.check_output(cmd, shell=True).splitlines() marlin_features = {} for define in define_list: From 7807b613d5c0ff74a26b884c1aaf1b253467c3bf Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 20 Aug 2020 00:08:06 -0500 Subject: [PATCH 371/483] Update some comments --- Marlin/src/module/settings.cpp | 2 +- Marlin/src/module/settings.h | 4 ++++ Marlin/src/module/temperature.cpp | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 29b12e5cafc1..d5f41a324664 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -21,7 +21,7 @@ */ /** - * configuration_store.cpp + * settings.cpp * * Settings and EEPROM storage * diff --git a/Marlin/src/module/settings.h b/Marlin/src/module/settings.h index c654b11bd5ef..b213de93a433 100644 --- a/Marlin/src/module/settings.h +++ b/Marlin/src/module/settings.h @@ -21,6 +21,10 @@ */ #pragma once +// +// settings.cpp - Settings and EEPROM storage +// + #include "../inc/MarlinConfig.h" #if ENABLED(EEPROM_SETTINGS) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 1208e4e99569..e8be3dbf0173 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -361,7 +361,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif #if ENABLED(PID_EXTRUSION_SCALING) - int16_t Temperature::lpq_len; // Initialized in configuration_store + int16_t Temperature::lpq_len; // Initialized in settings.cpp #endif #if HAS_PID_HEATING From bf316d9ec5e9472d78c6548a0a9e7a5988970e2c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 02:41:33 -0500 Subject: [PATCH 372/483] Fix Select Screen cancel destination --- Marlin/src/lcd/menu/menu.cpp | 5 ++++- Marlin/src/lcd/menu/menu.h | 1 + Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 8 ++++---- Marlin/src/lcd/menu/menu_mixer.cpp | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 373051fd4eb0..3a3cd0934b9e 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -412,7 +412,10 @@ void MenuItem_confirm::select_screen( const bool ui_selection = ui.update_selection(), got_click = ui.use_click(); if (got_click || ui.should_draw()) { draw_select_screen(yes, no, ui_selection, pref, string, suff); - if (got_click) { ui_selection ? yesFunc() : noFunc(); } + if (got_click) { + selectFunc_t callFunc = ui_selection ? yesFunc : noFunc; + if (callFunc) callFunc(); else ui.goto_previous_screen(); + } ui.defer_status_screen(); } } diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 7c3df79a19e4..3a29a87d5e44 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -542,6 +542,7 @@ class MenuItem_bool : public MenuEditItemBase { #define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ if (encoderLine == _thisItemNr && ui.use_click()) { \ + ui.save_previous_screen(); \ ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ return; \ } \ diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index e41786107228..942fb675695b 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -614,7 +614,7 @@ void menu_advanced_settings() { #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) CONFIRM_ITEM(MSG_INIT_EEPROM, MSG_BUTTON_INIT, MSG_BUTTON_CANCEL, - ui.init_eeprom, ui.goto_previous_screen, + ui.init_eeprom, nullptr, GET_TEXT(MSG_INIT_EEPROM), (const char *)nullptr, PSTR("?") ); #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 26120fc5da6c..e834009f77fb 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -224,11 +224,11 @@ void menu_advanced_settings(); ACTION_ITEM(MSG_BLTOUCH_STOW, bltouch._stow); ACTION_ITEM(MSG_BLTOUCH_SW_MODE, bltouch._set_SW_mode); #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU) - CONFIRM_ITEM(MSG_BLTOUCH_5V_MODE, MSG_BLTOUCH_5V_MODE, MSG_BUTTON_CANCEL, bltouch._set_5V_mode, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); - CONFIRM_ITEM(MSG_BLTOUCH_OD_MODE, MSG_BLTOUCH_OD_MODE, MSG_BUTTON_CANCEL, bltouch._set_OD_mode, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); + CONFIRM_ITEM(MSG_BLTOUCH_5V_MODE, MSG_BLTOUCH_5V_MODE, MSG_BUTTON_CANCEL, bltouch._set_5V_mode, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); + CONFIRM_ITEM(MSG_BLTOUCH_OD_MODE, MSG_BLTOUCH_OD_MODE, MSG_BUTTON_CANCEL, bltouch._set_OD_mode, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); ACTION_ITEM(MSG_BLTOUCH_MODE_STORE, bltouch._mode_store); - CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_5V, MSG_BLTOUCH_MODE_STORE_5V, MSG_BUTTON_CANCEL, bltouch.mode_conv_5V, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); - CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_OD, MSG_BLTOUCH_MODE_STORE_OD, MSG_BUTTON_CANCEL, bltouch.mode_conv_OD, ui.goto_previous_screen, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); + CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_5V, MSG_BLTOUCH_MODE_STORE_5V, MSG_BUTTON_CANCEL, bltouch.mode_conv_5V, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); + CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_OD, MSG_BLTOUCH_MODE_STORE_OD, MSG_BUTTON_CANCEL, bltouch.mode_conv_OD, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); ACTION_ITEM(MSG_BLTOUCH_MODE_ECHO, bltouch_report); #endif END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index 3f57d257ad49..2bcde1c2867a 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -264,7 +264,7 @@ void menu_mixer() { LCD_MESSAGEPGM(MSG_VTOOLS_RESET); ui.return_to_status(); }, - ui.goto_previous_screen, + nullptr, GET_TEXT(MSG_RESET_VTOOLS), (const char *)nullptr, PSTR("?") ); From ba6c41b7985a35d9ede4ff35a65f596676a0c7e0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 02:42:50 -0500 Subject: [PATCH 373/483] Apply specific menu item types --- Marlin/src/lcd/menu/menu_main.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 9a1d2ece68e8..fd86aaf112b2 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -138,13 +138,11 @@ void menu_main() { if (card_detected) { if (!card_open) { SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); - MENU_ITEM(gcode, - #if PIN_EXISTS(SD_DETECT) - MSG_CHANGE_MEDIA, M21_STR - #else - MSG_RELEASE_MEDIA, PSTR("M22") - #endif - ); + #if PIN_EXISTS(SD_DETECT) + GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); + #else + GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); + #endif } } else { @@ -172,7 +170,7 @@ void menu_main() { #endif #if HAS_POWER_MONITOR - MENU_ITEM(submenu, MSG_POWER_MONITOR, menu_power_monitor); + SUBMENU(MSG_POWER_MONITOR, menu_power_monitor); #endif #if ENABLED(MIXING_EXTRUDER) @@ -237,13 +235,11 @@ void menu_main() { if (card_detected) { if (!card_open) { - MENU_ITEM(gcode, - #if PIN_EXISTS(SD_DETECT) - MSG_CHANGE_MEDIA, M21_STR - #else - MSG_RELEASE_MEDIA, PSTR("M22") - #endif - ); + #if PIN_EXISTS(SD_DETECT) + GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); + #else + GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); + #endif SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); } } From db8522b4112483e5d5e30151328d03b8a5dbfb16 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 02:52:05 -0500 Subject: [PATCH 374/483] Fix up mixer menu display --- Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 1 + Marlin/src/lcd/lcdprint.h | 11 +++-- Marlin/src/lcd/menu/menu_addon.h | 7 ++- Marlin/src/lcd/menu/menu_mixer.cpp | 71 ++++++++++----------------- 4 files changed, 39 insertions(+), 51 deletions(-) diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index d17c336eec24..7ebabd6950b3 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -439,6 +439,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop lcd_put_u8str(value); } } + TERN_(USE_BIG_EDIT_FONT, ui.set_font(FONT_MENU)); } inline void draw_boxed_string(const u8g_uint_t x, const u8g_uint_t y, PGM_P const pstr, const bool inv) { diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 00139808aebc..031d467bf947 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -76,8 +76,8 @@ #define INFO_FONT_HEIGHT (INFO_FONT_ASCENT + INFO_FONT_DESCENT) #define INFO_FONT_WIDTH 6 - #define SETCURSOR(col, row) lcd_moveto(col * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) - #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), (row + 1) * (MENU_FONT_HEIGHT)) + #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) + #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) #else @@ -94,12 +94,13 @@ #define LCD_PIXEL_WIDTH LCD_WIDTH #define LCD_PIXEL_HEIGHT LCD_HEIGHT - #define SETCURSOR(col, row) lcd_moveto(col, row) - #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_WIDTH - (len), row) + #define SETCURSOR(col, row) lcd_moveto(col, row) + #define SETCURSOR_RJ(len, row) SETCURSOR(LCD_WIDTH - (len), row) #endif -#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) +#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) +#define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr) #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) int lcd_glyph_height(); diff --git a/Marlin/src/lcd/menu/menu_addon.h b/Marlin/src/lcd/menu/menu_addon.h index b6eb8e163493..73e7061bf32c 100644 --- a/Marlin/src/lcd/menu/menu_addon.h +++ b/Marlin/src/lcd/menu/menu_addon.h @@ -23,8 +23,11 @@ #include "../lcdprint.h" -#define MENU_ITEM_ADDON_START(X) do{ \ +#define _MENU_ITEM_ADDON_START(N,X) do{ \ if (ui.should_draw() && _menuLineNr == _thisItemNr - 1) { \ - SETCURSOR_X(X) + N(X) + +#define MENU_ITEM_ADDON_START(X) _MENU_ITEM_ADDON_START(SETCURSOR_X, X) +#define MENU_ITEM_ADDON_START_RJ(X) _MENU_ITEM_ADDON_START(SETCURSOR_X_RJ, X) #define MENU_ITEM_ADDON_END() } }while(0) diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index 2bcde1c2867a..abb56e4c5a18 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -37,52 +37,33 @@ #if ENABLED(GRADIENT_MIX) - void lcd_mixer_gradient_z_start_edit() { + void _lcd_mixer_gradient_z_edit(const bool isend) { ui.defer_status_screen(); ENCODER_RATE_MULTIPLY(true); - if (ui.encoderPosition != 0) { - mixer.gradient.start_z += float(int32_t(ui.encoderPosition)) * 0.1; - ui.encoderPosition = 0; - NOLESS(mixer.gradient.start_z, 0); - NOMORE(mixer.gradient.start_z, Z_MAX_POS); - } - if (ui.should_draw()) { - char tmp[21]; - strcpy_P(tmp, GET_TEXT(MSG_START_Z)); - sprintf_P(tmp + strlen(tmp), PSTR(": %4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10); - SETCURSOR(2, (LCD_HEIGHT - 1) / 2); - lcd_put_u8str(tmp); - } - if (ui.lcd_clicked) { - if (mixer.gradient.start_z > mixer.gradient.end_z) - mixer.gradient.end_z = mixer.gradient.start_z; - mixer.refresh_gradient(); - ui.goto_previous_screen(); - } - } + float &zvar = isend ? mixer.gradient.end_z : mixer.gradient.start_z; - void lcd_mixer_gradient_z_end_edit() { - ui.defer_status_screen(); - ENCODER_RATE_MULTIPLY(true); - if (ui.encoderPosition != 0) { - mixer.gradient.end_z += float(int32_t(ui.encoderPosition)) * 0.1; + if (ui.encoderPosition) { + zvar += float(int32_t(ui.encoderPosition)) * 0.1; ui.encoderPosition = 0; - NOLESS(mixer.gradient.end_z, 0); - NOMORE(mixer.gradient.end_z, Z_MAX_POS); + NOLESS(zvar, 0); + NOMORE(zvar, Z_MAX_POS); } if (ui.should_draw()) { - char tmp[21]; - strcpy_P(tmp, GET_TEXT(MSG_END_Z)); - sprintf_P(tmp + strlen(tmp), PSTR(": %4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10); - SETCURSOR(2, (LCD_HEIGHT - 1) / 2); + char tmp[16]; + SETCURSOR(1, (LCD_HEIGHT - 1) / 2); + lcd_put_u8str_P(isend ? GET_TEXT(MSG_END_Z) : GET_TEXT(MSG_START_Z)); + sprintf_P(tmp, PSTR("%4d.%d mm"), int(zvar), int(zvar * 10) % 10); + SETCURSOR_RJ(9, (LCD_HEIGHT - 1) / 2); lcd_put_u8str(tmp); } if (ui.lcd_clicked) { - if (mixer.gradient.end_z < mixer.gradient.start_z) - mixer.gradient.start_z = mixer.gradient.end_z; + if (isend && zvar < mixer.gradient.start_z) + mixer.gradient.start_z = zvar; + else if (!isend && zvar > mixer.gradient.end_z) + mixer.gradient.end_z = zvar; mixer.refresh_gradient(); ui.goto_previous_screen(); } @@ -96,19 +77,21 @@ EDIT_ITEM(int8, MSG_END_VTOOL, &mixer.gradient.end_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); #if ENABLED(GRADIENT_VTOOL) - EDIT_ITEM(int8, MSG_GRADIENT_ALIAS, &mixer.gradient.vtool_index, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); + EDIT_ITEM(int8, MSG_GRADIENT_ALIAS, &mixer.gradient.vtool_index, -1, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); #endif char tmp[18]; - SUBMENU(MSG_START_Z, lcd_mixer_gradient_z_start_edit); - MENU_ITEM_ADDON_START(9); + PGM_P const slabel = GET_TEXT(MSG_START_Z); + SUBMENU_P(slabel, []{ _lcd_mixer_gradient_z_edit(false); }); + MENU_ITEM_ADDON_START_RJ(11); sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); - SUBMENU(MSG_END_Z, lcd_mixer_gradient_z_end_edit); - MENU_ITEM_ADDON_START(9); + PGM_P const elabel = GET_TEXT(MSG_END_Z); + SUBMENU_P(elabel, []{ _lcd_mixer_gradient_z_edit(true); }); + MENU_ITEM_ADDON_START_RJ(11); sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); @@ -125,7 +108,7 @@ static uint8_t v_index; char tmp[20]; // "100%_100%" sprintf_P(tmp, PSTR("%3d%% %3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); SETCURSOR(2, y); lcd_put_u8str_P(GET_TEXT(MSG_MIX)); - SETCURSOR_RJ(9, y); lcd_put_u8str(tmp); + SETCURSOR_RJ(10, y); lcd_put_u8str(tmp); } #endif @@ -157,7 +140,7 @@ void lcd_mixer_mix_edit() { #if HAS_DUAL_MIXING && !CHANNEL_MIX_EDITING // Adjust 2-channel mix from the encoder - if (ui.encoderPosition != 0) { + if (ui.encoderPosition) { mixer.mix[0] += int32_t(ui.encoderPosition); ui.encoderPosition = 0; if (mixer.mix[0] < 0) mixer.mix[0] += 101; @@ -241,9 +224,9 @@ void menu_mixer() { #if HAS_DUAL_MIXING { - char tmp[10]; + char tmp[11]; SUBMENU(MSG_MIX, lcd_mixer_mix_edit); - MENU_ITEM_ADDON_START(10); + MENU_ITEM_ADDON_START_RJ(9); mixer.update_mix_from_vtool(); sprintf_P(tmp, PSTR("%3d;%3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); lcd_put_u8str(tmp); @@ -272,7 +255,7 @@ void menu_mixer() { { char tmp[13]; SUBMENU(MSG_GRADIENT, lcd_mixer_edit_gradient_menu); - MENU_ITEM_ADDON_START(10); + MENU_ITEM_ADDON_START_RJ(9); sprintf_P(tmp, PSTR("T%i->T%i"), mixer.gradient.start_vtool, mixer.gradient.end_vtool); lcd_put_u8str(tmp); MENU_ITEM_ADDON_END(); From d10b11ad9f462d150fcb0172d67282559db41098 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 16:22:53 -0500 Subject: [PATCH 375/483] Allow 'ghtp' to set a specific remote --- buildroot/share/git/ghtp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/buildroot/share/git/ghtp b/buildroot/share/git/ghtp index 3c0e21e371b1..14afd8a27b7d 100755 --- a/buildroot/share/git/ghtp +++ b/buildroot/share/git/ghtp @@ -5,13 +5,15 @@ # Set all remotes in the current repo to HTTPS or SSH connection. # Useful when switching environments, using public wifi, etc. # +# Optionally, specify a particular remote to change. +# GH_SSH="git@github\.com:" GH_HTTPS="https:\/\/github\.com\/" case "$1" in - -[Hh]) TYPE=HTTPS ; MATCH="git@" ; FORMULA="$GH_SSH/$GH_HTTPS" ;; - -[Ss]) TYPE=SSH ; MATCH="https:" ; FORMULA="$GH_HTTPS/$GH_SSH" ;; + -[Hh]) TYPE=HTTPS ; MATCH="git@" ; REPLACE="$GH_SSH/$GH_HTTPS" ;; + -[Ss]) TYPE=SSH ; MATCH="https:" ; REPLACE="$GH_HTTPS/$GH_SSH" ;; *) echo "Usage: `basename $0` -h | -s" 1>&2 echo -e " \e[0;92m-h\e[0m to switch to HTTPS" 1>&2 @@ -22,12 +24,14 @@ esac AWK=$(which gawk || which awk) -REMOTES=$(git remote -v | egrep "\t$MATCH" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") +# Match all or specified remotes of the other type +REGEX="\t$MATCH" ; [[ $# > 1 ]] && REGEX="^$2$REGEX" + +REMOTES=$(git remote -v | egrep "$REGEX" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$REPLACE/") -if [[ -z $REMOTES ]]; then - echo "Nothing to do." ; exit -fi +[[ -z $REMOTES ]] && { echo "Nothing to do." ; exit ; } +# Update a remote for each results pair echo "$REMOTES" | xargs -n2 git remote set-url echo -n "Remotes set to $TYPE: " From 7e65464dd7812479042a3c1fd0e75a0a8cd15b1b Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 21 Aug 2020 15:04:32 -0700 Subject: [PATCH 376/483] Fix M512 comment (#19108) --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index dc0416d516b4..7f7931ae7db9 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1667,7 +1667,7 @@ #define PASSWORD_LENGTH 4 // (#) Number of digits (1-9). 3 or 4 is recommended #define PASSWORD_ON_STARTUP #define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P command. Disable to prevent brute-force attack. - #define PASSWORD_CHANGE_GCODE // Change the password with M512 P N. + #define PASSWORD_CHANGE_GCODE // Change the password with M512 P S. //#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent gcodes from running //#define PASSWORD_AFTER_SD_PRINT_END //#define PASSWORD_AFTER_SD_PRINT_ABORT From e2ee05c97683e9b88b8979590144ee0bfdc1e23b Mon Sep 17 00:00:00 2001 From: BigTreeTech <38851044+bigtreetech@users.noreply.github.com> Date: Sat, 22 Aug 2020 06:06:51 +0800 Subject: [PATCH 377/483] Broadcast SD Print Completion (#19102) --- Marlin/src/gcode/sd/M1001.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 54bc452f97de..b28429f6315d 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -75,7 +75,10 @@ void GcodeSuite::M1001() { TERN_(POWER_LOSS_RECOVERY, recovery.purge()); // Announce SD file completion - SERIAL_ECHOLNPGM(STR_FILE_PRINTED); + { + PORT_REDIRECT(SERIAL_BOTH); + SERIAL_ECHOLNPGM(STR_FILE_PRINTED); + } // Update the status LED color #if HAS_LEDS_OFF_FLAG From 4f67642122059a9270f9e3690978248355f88e72 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 05:21:34 -0500 Subject: [PATCH 378/483] Header for individual menus --- Marlin/src/lcd/menu/menu.cpp | 11 - Marlin/src/lcd/menu/menu.h | 449 +----------------- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_backlash.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 2 +- Marlin/src/lcd/menu/menu_cancelobject.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/lcd/menu/menu_custom.cpp | 2 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 +- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_game.cpp | 2 +- Marlin/src/lcd/menu/menu_info.cpp | 2 +- Marlin/src/lcd/menu/menu_item.h | 450 +++++++++++++++++++ Marlin/src/lcd/menu/menu_job_recovery.cpp | 2 +- Marlin/src/lcd/menu/menu_led.cpp | 2 +- Marlin/src/lcd/menu/menu_main.cpp | 2 +- Marlin/src/lcd/menu/menu_media.cpp | 2 +- Marlin/src/lcd/menu/menu_mixer.cpp | 2 +- Marlin/src/lcd/menu/menu_mmu2.cpp | 2 +- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_password.cpp | 2 +- Marlin/src/lcd/menu/menu_power_monitor.cpp | 2 +- Marlin/src/lcd/menu/menu_spindle_laser.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 2 +- Marlin/src/lcd/menu/menu_tmc.cpp | 2 +- Marlin/src/lcd/menu/menu_touch_screen.cpp | 2 +- Marlin/src/lcd/menu/menu_tune.cpp | 2 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 5 +- Marlin/src/lcd/ultralcd.cpp | 2 + Marlin/src/lcd/ultralcd.h | 3 + 32 files changed, 494 insertions(+), 478 deletions(-) create mode 100644 Marlin/src/lcd/menu/menu_item.h diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 3a3cd0934b9e..309ad06a4c9f 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -99,12 +99,6 @@ void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_b return_to_status(); } -//////////////////////////////////////////// -/////////// Common Menu Actions //////////// -//////////////////////////////////////////// - -void MenuItem_gcode::action(PGM_P const, PGM_P const pgcode) { queue.inject_P(pgcode); } - //////////////////////////////////////////// /////////// Menu Editing Actions /////////// //////////////////////////////////////////// @@ -193,11 +187,6 @@ DEFINE_MENU_EDIT_ITEM(float52sign); // +123.45 DEFINE_MENU_EDIT_ITEM(long5); // 12345 right-justified DEFINE_MENU_EDIT_ITEM(long5_25); // 12345 right-justified (25 increment) -void MenuItem_bool::action(PGM_P const, bool * const ptr, screenFunc_t callback) { - *ptr ^= true; ui.refresh(); - if (callback) (*callback)(); -} - //////////////////////////////////////////// ///////////////// Menu Tree //////////////// //////////////////////////////////////////// diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 3a29a87d5e44..c457eaf295dc 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -43,14 +43,6 @@ typedef void (*selectFunc_t)(); void _lcd_zoffset_overlay_gfx(const float zvalue); #endif -#if HAS_BED_PROBE - #if Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 - #define LCD_Z_OFFSET_TYPE float43 // Values from -9.000 to +9.000 - #else - #define LCD_Z_OFFSET_TYPE float42_52 // Values from -99.99 to 99.99 - #endif -#endif - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) && Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 #define BABYSTEP_TO_STR(N) ftostr43sign(N) #elif ENABLED(BABYSTEPPING) @@ -81,13 +73,14 @@ class MenuItemBase { } }; +// STATIC_ITEM(LABEL,...) class MenuItem_static : public MenuItemBase { public: static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const vstr=nullptr); }; -// CONFIRM_ITEM(LABEL,Y,N,FY,FN,V...), -// YESNO_ITEM(LABEL,FY,FN,V...) +// CONFIRM_ITEM(LABEL,Y,N,FY,FN,...), +// YESNO_ITEM(LABEL,FY,FN,...) class MenuItem_confirm : public MenuItemBase { public: FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { @@ -123,60 +116,6 @@ class MenuItem_confirm : public MenuItemBase { } }; -// BACK_ITEM(LABEL) -class MenuItem_back : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { - _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); - } - // Back Item action goes back one step in history - FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } -}; - -// SUBMENU(LABEL, screen_handler) -class MenuItem_submenu : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]); - } - static inline void action(PGM_P const, const screenFunc_t func) { ui.save_previous_screen(); ui.goto_screen(func); } -}; - -// Any menu item that invokes an immediate action -class MenuItem_button : public MenuItemBase { - public: - // Button-y Items are selectable lines with no other indicator - static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', ' '); - } -}; - -// GCODES_ITEM(LABEL, GCODES) -class MenuItem_gcode : public MenuItem_button { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', ' '); - } - static void action(PGM_P const, const char * const pgcode); - static inline void action(PGM_P const pstr, const uint8_t, const char * const pgcode) { action(pstr, pgcode); } -}; - -// ACTION_ITEM(LABEL, FUNC) -class MenuItem_function : public MenuItem_button { - public: - //static inline void action(PGM_P const, const uint8_t, const menuAction_t func) { (*func)(); }; - static inline void action(PGM_P const, const menuAction_t func) { (*func)(); }; -}; - -#if ENABLED(SDSUPPORT) - class CardReader; - class MenuItem_sdbase { - public: - // Implemented for HD44780 and DOGM - static void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard, const bool isDir); - }; -#endif - //////////////////////////////////////////// ///////////// Edit Menu Items ////////////// //////////////////////////////////////////// @@ -233,361 +172,15 @@ class MenuEditItemBase : public MenuItemBase { static inline void draw_edit_screen(const char* const value) { draw_edit_screen(editLabel, value); } }; -// Template for specific Menu Edit Item Types -template -class TMenuEditItem : MenuEditItemBase { - private: - typedef typename NAME::type_t type_t; - static inline float scale(const float value) { return NAME::scale(value); } - static inline float unscale(const float value) { return NAME::unscale(value); } - static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } - static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); } - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t * const data, ...) { - MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(*(data))); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t (*pget)(), ...) { - MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(pget())); - } - // Edit screen for this type of item - static void edit_screen() { MenuEditItemBase::edit_screen(to_string, load); } - static void action( - PGM_P const pstr, // Edit label - type_t * const ptr, // Value pointer - const type_t minValue, // Value range - const type_t maxValue, - const screenFunc_t callback=nullptr, // Value update callback - const bool live=false // Callback during editing - ) { - // Make sure minv and maxv fit within int32_t - const int32_t minv = _MAX(scale(minValue), INT32_MIN), - maxv = _MIN(scale(maxValue), INT32_MAX); - goto_edit_screen(pstr, ptr, minv, maxv - minv, scale(*ptr) - minv, - edit_screen, callback, live); - } -}; - -// Provide a set of Edit Item Types which encompass a primitive -// type, a string function, and a scale factor for edit and display. -// These items call the Edit Item draw method passing the prepared string. -#define __DOFIXfloat PROBE() -#define _DOFIX(TYPE,V) TYPE(TERN(IS_PROBE(__DOFIX##TYPE),FIXFLOAT(V),(V))) -#define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, V...) \ - struct MenuEditItemInfo_##NAME { \ - typedef TYPE type_t; \ - static inline float scale(const float value) { return value * (SCALE) + (V+0); } \ - static inline float unscale(const float value) { return value / (SCALE) + (V+0); } \ - static inline const char* strfunc(const float value) { return STRFUNC(_DOFIX(TYPE,value)); } \ - }; \ - typedef TMenuEditItem MenuItem_##NAME - -// NAME TYPE STRFUNC SCALE +ROUND -DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, 0.5f); // 100% right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint8 ,uint8_t ,ui8tostr3rj , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_3 ,uint16_t ,ui16tostr3rj , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_4 ,uint16_t ,ui16tostr4rj , 0.1f ); // 1234 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3 , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 ); // _2.34, 12.34, -2.34 or 123.45, -23.45 -DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); // -1.234, _1.234, +1.234 -DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) -DEFINE_MENU_EDIT_ITEM_TYPE(float51 ,float ,ftostr51rj , 10 ); // 1234.5 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 ); // +12.3 -DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 ); // +123.4 -DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 ); // +1234.5 -DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 ); // +123.45 -DEFINE_MENU_EDIT_ITEM_TYPE(long5 ,uint32_t ,ftostr5rj , 0.01f ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(long5_25 ,uint32_t ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) - -class MenuItem_bool : public MenuEditItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const bool onoff) { - MenuEditItemBase::draw(sel, row, pstr, onoff ? GET_TEXT(MSG_LCD_ON) : GET_TEXT(MSG_LCD_OFF), true); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, bool * const data, ...) { - draw(sel, row, pstr, *data); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, PGM_P const, bool (*pget)(), ...) { - draw(sel, row, pstr, pget()); - } - static void action(PGM_P const pstr, bool * const ptr, const screenFunc_t callbackFunc=nullptr); -}; - -//////////////////////////////////////////// -//////////// Menu System Macros //////////// -//////////////////////////////////////////// - -/** - * Marlin's native menu screens work by running a loop from the top visible line index - * to the bottom visible line index (according to how much the screen has been scrolled). - * This complete loop is done on every menu screen call. - * - * The menu system is highly dynamic, so it doesn't know ahead of any menu loop which - * items will be visible or hidden, so menu items don't have a fixed index number. - * - * During the loop, each menu item checks to see if its line is the current one. If it is, - * then it checks to see if a click has arrived so it can run its action. If the action - * doesn't redirect to another screen then the menu item calls its draw method. - * - * Menu item add-ons can do whatever they like. - * - * This mixture of drawing and processing inside a loop has the advantage that a single - * line can be used to represent a menu item, and that is the rationale for this design. - * - * One of the pitfalls of this method is that DOGM displays call the screen handler 2x, - * 4x, or 8x per screen update to draw just one segment of the screen. As a result, any - * menu item that exists in two screen segments is drawn and processed twice per screen - * update. With each item processed 5, 10, 20, or 40 times the logic has to be simple. - * - * To avoid repetition and side-effects, function calls for testing menu item conditions - * should be done before the menu loop (START_MENU / START_SCREEN). - */ - -/** - * SCREEN_OR_MENU_LOOP generates header code for a screen or menu - * - * encoderTopLine is the top menu line to display - * _lcdLineNr is the index of the LCD line (e.g., 0-3) - * _menuLineNr is the menu item to draw and process - * _thisItemNr is the index of each MENU_ITEM or STATIC_ITEM - */ -#define SCREEN_OR_MENU_LOOP(IS_MENU) \ - scroll_screen(IS_MENU ? 1 : LCD_HEIGHT, IS_MENU); \ - int8_t _menuLineNr = encoderTopLine, _thisItemNr = 0; \ - bool _skipStatic = IS_MENU; UNUSED(_thisItemNr); \ - for (int8_t _lcdLineNr = 0; _lcdLineNr < LCD_HEIGHT; _lcdLineNr++, _menuLineNr++) { \ - _thisItemNr = 0 - -/** - * START_SCREEN Opening code for a screen having only static items. - * Do simplified scrolling of the entire screen. - * - * START_MENU Opening code for a screen with menu items. - * Scroll as-needed to keep the selected line in view. - */ -#define START_SCREEN() SCREEN_OR_MENU_LOOP(false) -#define START_MENU() SCREEN_OR_MENU_LOOP(true) -#define NEXT_ITEM() (++_thisItemNr) -#define SKIP_ITEM() NEXT_ITEM() -#define END_SCREEN() } screen_items = _thisItemNr -#define END_MENU() END_SCREEN(); UNUSED(_skipStatic) - -#if ENABLED(ENCODER_RATE_MULTIPLIER) - #define ENCODER_RATE_MULTIPLY(F) (ui.encoderRateMultiplierEnabled = F) - #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) do{ if (USE_MULTIPLIER) ui.enable_encoder_multiplier(true); }while(0) - //#define ENCODER_RATE_MULTIPLIER_DEBUG // If defined, output the encoder steps per second value -#else - #define ENCODER_RATE_MULTIPLY(F) NOOP - #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) +#if ENABLED(SDSUPPORT) + class CardReader; + class MenuItem_sdbase { + public: + // Implemented for HD44780 and DOGM + static void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard, const bool isDir); + }; #endif -/** - * MENU_ITEM generates draw & handler code for a menu item, potentially calling: - * - * MenuItem_::draw(sel, row, label, arg3...) - * MenuItem_::action(arg3...) - * - * Examples: - * BACK_ITEM(MSG_INFO_SCREEN) - * MenuItem_back::action(plabel, ...) - * MenuItem_back::draw(sel, row, plabel, ...) - * - * ACTION_ITEM(MSG_PAUSE_PRINT, lcd_sdcard_pause) - * MenuItem_function::action(plabel, lcd_sdcard_pause) - * MenuItem_function::draw(sel, row, plabel, lcd_sdcard_pause) - * - * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) - * MenuItem_int3::action(plabel, &feedrate_percentage, 10, 999) - * MenuItem_int3::draw(sel, row, plabel, &feedrate_percentage, 10, 999) - */ - -#define _MENU_INNER_P(TYPE, USE_MULTIPLIER, PLABEL, V...) do { \ - PGM_P const plabel = PLABEL; \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ - MenuItem_##TYPE::action(plabel, ##V); \ - if (ui.screen_changed) return; \ - } \ - if (ui.should_draw()) \ - MenuItem_##TYPE::draw \ - (encoderLine == _thisItemNr, _lcdLineNr, plabel, ##V); \ -}while(0) - -#define _MENU_ITEM_P(TYPE, V...) do { \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value and optional data -#define _MENU_ITEM_N_S_P(TYPE, N, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::init(N, S); \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _MENU_ITEM_N_P(TYPE, N, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::itemIndex = N; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Items with a unique string -#define _MENU_ITEM_S_P(TYPE, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::itemString = S; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// STATIC_ITEM draws a styled string with no highlight. -// Parameters: label [, style [, char *value] ] - -#define STATIC_ITEM_INNER_P(PLABEL, V...) do{ \ - if (_skipStatic && encoderLine <= _thisItemNr) { \ - ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ - ++encoderLine; \ - } \ - if (ui.should_draw()) \ - MenuItem_static::draw(_lcdLineNr, PLABEL, ##V); \ -} while(0) - -#define STATIC_ITEM_P(PLABEL, V...) do{ \ - if (_menuLineNr == _thisItemNr) \ - STATIC_ITEM_INNER_P(PLABEL, ##V); \ - NEXT_ITEM(); \ -} while(0) - -#define STATIC_ITEM_N_P(PLABEL, N, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - MenuItemBase::init(N); \ - STATIC_ITEM_INNER_P(PLABEL, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) -#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) - -#define MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, false, PLABEL, ##V) -#define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, false, PLABEL, ##V) -#define MENU_ITEM_S(TYPE, S, LABEL, V...) MENU_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, false, PLABEL, ##V) -#define MENU_ITEM_N(TYPE, N, LABEL, V...) MENU_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) -#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) - -#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) - -#define ACTION_ITEM_N_S_P(N, S, PLABEL, ACTION) MENU_ITEM_N_S_P(function, N, S, PLABEL, ACTION) -#define ACTION_ITEM_N_S(N, S, LABEL, ACTION) ACTION_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_S_P(S, PLABEL, ACTION) MENU_ITEM_S_P(function, S, PLABEL, ACTION) -#define ACTION_ITEM_S(S, LABEL, ACTION) ACTION_ITEM_S_P(S, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_N_P(N, PLABEL, ACTION) MENU_ITEM_N_P(function, N, PLABEL, ACTION) -#define ACTION_ITEM_N(N, LABEL, ACTION) ACTION_ITEM_N_P(N, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_P(PLABEL, ACTION) MENU_ITEM_P(function, PLABEL, ACTION) -#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_P(GET_TEXT(LABEL), ACTION) - -#define GCODES_ITEM_N_S_P(N, S, PLABEL, GCODES) MENU_ITEM_N_S_P(gcode, N, S, PLABEL, GCODES) -#define GCODES_ITEM_N_S(N, S, LABEL, GCODES) GCODES_ITEM_N_S_P(N, S, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_S_P(S, PLABEL, GCODES) MENU_ITEM_S_P(gcode, S, PLABEL, GCODES) -#define GCODES_ITEM_S(S, LABEL, GCODES) GCODES_ITEM_S_P(S, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_N_P(N, PLABEL, GCODES) MENU_ITEM_N_P(gcode, N, PLABEL, GCODES) -#define GCODES_ITEM_N(N, LABEL, GCODES) GCODES_ITEM_N_P(N, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_P(PLABEL, GCODES) MENU_ITEM_P(gcode, PLABEL, GCODES) -#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_P(GET_TEXT(LABEL), GCODES) - -#define SUBMENU_N_S_P(N, S, PLABEL, DEST) MENU_ITEM_N_S_P(submenu, N, S, PLABEL, DEST) -#define SUBMENU_N_S(N, S, LABEL, DEST) SUBMENU_N_S_P(N, S, GET_TEXT(LABEL), DEST) -#define SUBMENU_S_P(S, PLABEL, DEST) MENU_ITEM_S_P(submenu, S, PLABEL, DEST) -#define SUBMENU_S(S, LABEL, DEST) SUBMENU_S_P(S, GET_TEXT(LABEL), DEST) -#define SUBMENU_N_P(N, PLABEL, DEST) MENU_ITEM_N_P(submenu, N, PLABEL, DEST) -#define SUBMENU_N(N, LABEL, DEST) SUBMENU_N_P(N, GET_TEXT(LABEL), DEST) -#define SUBMENU_P(PLABEL, DEST) MENU_ITEM_P(submenu, PLABEL, DEST) -#define SUBMENU(LABEL, DEST) SUBMENU_P(GET_TEXT(LABEL), DEST) - -#define EDIT_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, ##V) -#define EDIT_ITEM_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_S_P(TYPE, S, PLABEL, V...) MENU_ITEM_S_P(TYPE, S, PLABEL, ##V) -#define EDIT_ITEM_S(TYPE, S, LABEL, V...) EDIT_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_N_P(TYPE, N, PLABEL, V...) MENU_ITEM_N_P(TYPE, N, PLABEL, ##V) -#define EDIT_ITEM_N(TYPE, N, LABEL, V...) EDIT_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_P(TYPE, PLABEL, V...) MENU_ITEM_P(TYPE, PLABEL, ##V) -#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) - -#define EDIT_ITEM_FAST_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_FAST_N_S_P(TYPE, N, S, true, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_S(TYPE, S, LABEL, V...) EDIT_ITEM_FAST_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_N(TYPE, N, LABEL, V...) EDIT_ITEM_FAST_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, true, PLABEL, ##V) -#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_P(TYPE, GET_TEXT(LABEL), ##V) - -#define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - ui.save_previous_screen(); \ - ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ - return; \ - } \ - if (ui.should_draw()) MenuItem_confirm::draw \ - (encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ##V); \ -}while(0) - -// Indexed items set a global index value and optional data -#define _CONFIRM_ITEM_P(PLABEL, V...) do { \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _CONFIRM_ITEM_N_S_P(N, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::init(N, S); \ - _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _CONFIRM_ITEM_N_P(N, V...) _CONFIRM_ITEM_N_S_P(N, nullptr, V) - -#define CONFIRM_ITEM_P(PLABEL,A,B,V...) _CONFIRM_ITEM_P(PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM(LABEL, V...) CONFIRM_ITEM_P(GET_TEXT(LABEL), ##V) - -#define YESNO_ITEM_P(PLABEL, V...) _CONFIRM_ITEM_P(PLABEL, ##V) -#define YESNO_ITEM(LABEL, V...) YESNO_ITEM_P(GET_TEXT(LABEL), ##V) - -#define CONFIRM_ITEM_N_S_P(N,S,PLABEL,A,B,V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM_N_S(N,S,LABEL,V...) CONFIRM_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) -#define CONFIRM_ITEM_N_P(N,PLABEL,A,B,V...) _CONFIRM_ITEM_N_P(N, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM_N(N,LABEL, V...) CONFIRM_ITEM_N_P(N, GET_TEXT(LABEL), ##V) - -#define YESNO_ITEM_N_S_P(N,S,PLABEL, V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, ##V) -#define YESNO_ITEM_N_S(N,S,LABEL, V...) YESNO_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) -#define YESNO_ITEM_N_P(N,PLABEL, V...) _CONFIRM_ITEM_N_P(N, PLABEL, ##V) -#define YESNO_ITEM_N(N,LABEL, V...) YESNO_ITEM_N_P(N, GET_TEXT(LABEL), ##V) - //////////////////////////////////////////// /////////////// Menu Screens /////////////// //////////////////////////////////////////// @@ -599,20 +192,10 @@ void menu_move(); void menu_media(); #endif -// First Fan Speed title in "Tune" and "Control>Temperature" menus -#if HAS_FAN && HAS_FAN0 - #if FAN_COUNT > 1 - #define FAN_SPEED_1_SUFFIX " 1" - #else - #define FAN_SPEED_1_SUFFIX "" - #endif -#endif - //////////////////////////////////////////// //////// Menu Item Helper Functions //////// //////////////////////////////////////////// -void lcd_move_z(); void _lcd_draw_homing(); #define HAS_LINE_TO_Z ANY(DELTA, PROBE_MANUALLY, MESH_BED_LEVELING, LEVEL_BED_CORNERS) @@ -625,10 +208,6 @@ void _lcd_draw_homing(); void _lcd_zoffset_overlay_gfx(const float zvalue); #endif -#if ENABLED(LEVEL_BED_CORNERS) - void _lcd_level_bed_corners(); -#endif - #if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) void _lcd_toggle_bed_leveling(); #endif @@ -651,11 +230,3 @@ void _lcd_draw_homing(); #endif #endif - -#if ENABLED(POWER_LOSS_RECOVERY) - void menu_job_recovery(); -#endif - -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - void touch_screen_calibration(); -#endif diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 942fb675695b..9978bc7eabef 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #include "../../module/planner.h" #if DISABLED(NO_VOLUMETRICS) diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp index 2aad9a415f0c..0e1bfb591099 100644 --- a/Marlin/src/lcd/menu/menu_backlash.cpp +++ b/Marlin/src/lcd/menu/menu_backlash.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, BACKLASH_GCODE) -#include "menu.h" +#include "menu_item.h" #include "../../feature/backlash.h" diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 6dbe7c6d1801..16f9992c1852 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, LEVEL_BED_CORNERS) -#include "menu.h" +#include "menu_item.h" #include "../../module/motion.h" #include "../../module/planner.h" diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 3796f44ff612..6841561c1bf8 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -28,7 +28,7 @@ #if ENABLED(LCD_BED_LEVELING) -#include "menu.h" +#include "menu_item.h" #include "../../module/planner.h" #include "../../feature/bedlevel/bedlevel.h" diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp index 55b88c45b033..a8ced05759bd 100644 --- a/Marlin/src/lcd/menu/menu_cancelobject.cpp +++ b/Marlin/src/lcd/menu/menu_cancelobject.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, CANCEL_OBJECTS) -#include "menu.h" +#include "menu_item.h" #include "menu_addon.h" #include "../../feature/cancel_object.h" diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index e834009f77fb..32fedce23747 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #if HAS_FILAMENT_SENSOR #include "../../feature/runout.h" diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp index 729254cda4a3..7c54ec6e2616 100644 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ b/Marlin/src/lcd/menu/menu_custom.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, CUSTOM_USER_MENUS) -#include "menu.h" +#include "menu_item.h" #include "../../gcode/queue.h" #ifdef USER_SCRIPT_DONE diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index 6b99355a60c6..705ec4161120 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) -#include "menu.h" +#include "menu_item.h" #include "../../module/delta.h" #include "../../module/motion.h" diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 1b11438f4c38..316b2bc782c5 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) -#include "menu.h" +#include "menu_item.h" #include "../../module/temperature.h" #include "../../feature/pause.h" #include "../../gcode/queue.h" diff --git a/Marlin/src/lcd/menu/menu_game.cpp b/Marlin/src/lcd/menu/menu_game.cpp index 21e101404a52..fa56d7eee266 100644 --- a/Marlin/src/lcd/menu/menu_game.cpp +++ b/Marlin/src/lcd/menu/menu_game.cpp @@ -24,7 +24,7 @@ #if HAS_GAME_MENU -#include "menu.h" +#include "menu_item.h" #include "game/game.h" void menu_game() { diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index b94be2e53f2f..2fe8ccbab699 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, LCD_INFO_MENU) -#include "menu.h" +#include "menu_item.h" #if HAS_GAMES #include "game/game.h" diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h new file mode 100644 index 000000000000..66ed0e402d94 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_item.h @@ -0,0 +1,450 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "menu.h" +#include "../ultralcd.h" +#include "../../gcode/queue.h" // for inject_P + +#include "../../inc/MarlinConfigPre.h" + +void lcd_move_z(); + +//////////////////////////////////////////// +///////////// Base Menu Items ////////////// +//////////////////////////////////////////// + +// BACK_ITEM(LABEL) +class MenuItem_back : public MenuItemBase { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { + _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); + } + // Back Item action goes back one step in history + FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } +}; + +// SUBMENU(LABEL, screen_handler) +class MenuItem_submenu : public MenuItemBase { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { + _draw(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]); + } + static inline void action(PGM_P const, const screenFunc_t func) { ui.save_previous_screen(); ui.goto_screen(func); } +}; + +// Any menu item that invokes an immediate action +class MenuItem_button : public MenuItemBase { + public: + // Button-y Items are selectable lines with no other indicator + static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { + _draw(sel, row, pstr, '>', ' '); + } +}; + +// ACTION_ITEM(LABEL, FUNC) +class MenuItem_function : public MenuItem_button { + public: + //static inline void action(PGM_P const, const uint8_t, const menuAction_t func) { (*func)(); }; + static inline void action(PGM_P const, const menuAction_t func) { (*func)(); }; +}; + +// GCODES_ITEM(LABEL, GCODES) +class MenuItem_gcode : public MenuItem_button { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { + _draw(sel, row, pstr, '>', ' '); + } + static void action(PGM_P const, PGM_P const pgcode) { queue.inject_P(pgcode); } + static inline void action(PGM_P const pstr, const uint8_t, const char * const pgcode) { action(pstr, pgcode); } +}; + +//////////////////////////////////////////// +///////////// Edit Menu Items ////////////// +//////////////////////////////////////////// + +// Template for specific Menu Edit Item Types +template +class TMenuEditItem : MenuEditItemBase { + private: + typedef typename NAME::type_t type_t; + static inline float scale(const float value) { return NAME::scale(value); } + static inline float unscale(const float value) { return NAME::unscale(value); } + static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } + static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); } + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t * const data, ...) { + MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(*(data))); + } + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t (*pget)(), ...) { + MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(pget())); + } + // Edit screen for this type of item + static void edit_screen() { MenuEditItemBase::edit_screen(to_string, load); } + static void action( + PGM_P const pstr, // Edit label + type_t * const ptr, // Value pointer + const type_t minValue, // Value range + const type_t maxValue, + const screenFunc_t callback=nullptr, // Value update callback + const bool live=false // Callback during editing + ) { + // Make sure minv and maxv fit within int32_t + const int32_t minv = _MAX(scale(minValue), INT32_MIN), + maxv = _MIN(scale(maxValue), INT32_MAX); + goto_edit_screen(pstr, ptr, minv, maxv - minv, scale(*ptr) - minv, + edit_screen, callback, live); + } +}; + +// Provide a set of Edit Item Types which encompass a primitive +// type, a string function, and a scale factor for edit and display. +// These items call the Edit Item draw method passing the prepared string. +#define __DOFIXfloat PROBE() +#define _DOFIX(TYPE,V) TYPE(TERN(IS_PROBE(__DOFIX##TYPE),FIXFLOAT(V),(V))) +#define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, V...) \ + struct MenuEditItemInfo_##NAME { \ + typedef TYPE type_t; \ + static inline float scale(const float value) { return value * (SCALE) + (V+0); } \ + static inline float unscale(const float value) { return value / (SCALE) + (V+0); } \ + static inline const char* strfunc(const float value) { return STRFUNC(_DOFIX(TYPE,value)); } \ + }; \ + typedef TMenuEditItem MenuItem_##NAME + +// NAME TYPE STRFUNC SCALE +ROUND +DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, 0.5f); // 100% right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint8 ,uint8_t ,ui8tostr3rj , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_3 ,uint16_t ,ui16tostr3rj , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_4 ,uint16_t ,ui16tostr4rj , 0.1f ); // 1234 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3 , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 ); // _2.34, 12.34, -2.34 or 123.45, -23.45 +DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); // -1.234, _1.234, +1.234 +DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) +DEFINE_MENU_EDIT_ITEM_TYPE(float51 ,float ,ftostr51rj , 10 ); // 1234.5 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 ); // +12.3 +DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 ); // +123.4 +DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 ); // +1234.5 +DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 ); // +123.45 +DEFINE_MENU_EDIT_ITEM_TYPE(long5 ,uint32_t ,ftostr5rj , 0.01f ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(long5_25 ,uint32_t ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) + +#if HAS_BED_PROBE + #if Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 + #define LCD_Z_OFFSET_TYPE float43 // Values from -9.000 to +9.000 + #else + #define LCD_Z_OFFSET_TYPE float42_52 // Values from -99.99 to 99.99 + #endif +#endif + +class MenuItem_bool : public MenuEditItemBase { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const bool onoff) { + MenuEditItemBase::draw(sel, row, pstr, onoff ? GET_TEXT(MSG_LCD_ON) : GET_TEXT(MSG_LCD_OFF), true); + } + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, bool * const data, ...) { + draw(sel, row, pstr, *data); + } + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, PGM_P const, bool (*pget)(), ...) { + draw(sel, row, pstr, pget()); + } + static void action(PGM_P const pstr, bool * const ptr, const screenFunc_t callbackFunc=nullptr) { + *ptr ^= true; ui.refresh(); + if (callbackFunc) (*callbackFunc)(); + } +}; + +/** + * //////////////////////////////////////////// + * //////////// Menu System Macros //////////// + * //////////////////////////////////////////// + * + * Marlin's native menu screens work by running a loop from the top visible line index + * to the bottom visible line index (according to how much the screen has been scrolled). + * This complete loop is done on every menu screen call. + * + * The menu system is highly dynamic, so it doesn't know ahead of any menu loop which + * items will be visible or hidden, so menu items don't have a fixed index number. + * + * During the loop, each menu item checks to see if its line is the current one. If it is, + * then it checks to see if a click has arrived so it can run its action. If the action + * doesn't redirect to another screen then the menu item calls its draw method. + * + * Menu item add-ons can do whatever they like. + * + * This mixture of drawing and processing inside a loop has the advantage that a single + * line can be used to represent a menu item, and that is the rationale for this design. + * + * One of the pitfalls of this method is that DOGM displays call the screen handler 2x, + * 4x, or 8x per screen update to draw just one segment of the screen. As a result, any + * menu item that exists in two screen segments is drawn and processed twice per screen + * update. With each item processed 5, 10, 20, or 40 times the logic has to be simple. + * + * To avoid repetition and side-effects, function calls for testing menu item conditions + * should be done before the menu loop (START_MENU / START_SCREEN). + */ + +/** + * SCREEN_OR_MENU_LOOP generates header code for a screen or menu + * + * encoderTopLine is the top menu line to display + * _lcdLineNr is the index of the LCD line (e.g., 0-3) + * _menuLineNr is the menu item to draw and process + * _thisItemNr is the index of each MENU_ITEM or STATIC_ITEM + */ +#define SCREEN_OR_MENU_LOOP(IS_MENU) \ + scroll_screen(IS_MENU ? 1 : LCD_HEIGHT, IS_MENU); \ + int8_t _menuLineNr = encoderTopLine, _thisItemNr = 0; \ + bool _skipStatic = IS_MENU; UNUSED(_thisItemNr); \ + for (int8_t _lcdLineNr = 0; _lcdLineNr < LCD_HEIGHT; _lcdLineNr++, _menuLineNr++) { \ + _thisItemNr = 0 + +/** + * START_SCREEN Opening code for a screen having only static items. + * Do simplified scrolling of the entire screen. + * + * START_MENU Opening code for a screen with menu items. + * Scroll as-needed to keep the selected line in view. + */ +#define START_SCREEN() SCREEN_OR_MENU_LOOP(false) +#define START_MENU() SCREEN_OR_MENU_LOOP(true) +#define NEXT_ITEM() (++_thisItemNr) +#define SKIP_ITEM() NEXT_ITEM() +#define END_SCREEN() } screen_items = _thisItemNr +#define END_MENU() END_SCREEN(); UNUSED(_skipStatic) + +/** + * MENU_ITEM generates draw & handler code for a menu item, potentially calling: + * + * MenuItem_::draw(sel, row, label, arg3...) + * MenuItem_::action(arg3...) + * + * Examples: + * BACK_ITEM(MSG_INFO_SCREEN) + * MenuItem_back::action(plabel, ...) + * MenuItem_back::draw(sel, row, plabel, ...) + * + * ACTION_ITEM(MSG_PAUSE_PRINT, lcd_sdcard_pause) + * MenuItem_function::action(plabel, lcd_sdcard_pause) + * MenuItem_function::draw(sel, row, plabel, lcd_sdcard_pause) + * + * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) + * MenuItem_int3::action(plabel, &feedrate_percentage, 10, 999) + * MenuItem_int3::draw(sel, row, plabel, &feedrate_percentage, 10, 999) + */ + +#if ENABLED(ENCODER_RATE_MULTIPLIER) + #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) do{ if (USE_MULTIPLIER) ui.enable_encoder_multiplier(true); }while(0) +#else + #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) +#endif + +#define _MENU_INNER_P(TYPE, USE_MULTIPLIER, PLABEL, V...) do { \ + PGM_P const plabel = PLABEL; \ + if (encoderLine == _thisItemNr && ui.use_click()) { \ + _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ + MenuItem_##TYPE::action(plabel, ##V); \ + if (ui.screen_changed) return; \ + } \ + if (ui.should_draw()) \ + MenuItem_##TYPE::draw \ + (encoderLine == _thisItemNr, _lcdLineNr, plabel, ##V); \ +}while(0) + +#define _MENU_ITEM_P(TYPE, V...) do { \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Indexed items set a global index value and optional data +#define _MENU_ITEM_N_S_P(TYPE, N, S, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + MenuItemBase::init(N, S); \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Indexed items set a global index value +#define _MENU_ITEM_N_P(TYPE, N, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + MenuItemBase::itemIndex = N; \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Items with a unique string +#define _MENU_ITEM_S_P(TYPE, S, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + MenuItemBase::itemString = S; \ + _MENU_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// STATIC_ITEM draws a styled string with no highlight. +// Parameters: label [, style [, char *value] ] + +#define STATIC_ITEM_INNER_P(PLABEL, V...) do{ \ + if (_skipStatic && encoderLine <= _thisItemNr) { \ + ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ + ++encoderLine; \ + } \ + if (ui.should_draw()) \ + MenuItem_static::draw(_lcdLineNr, PLABEL, ##V); \ +} while(0) + +#define STATIC_ITEM_P(PLABEL, V...) do{ \ + if (_menuLineNr == _thisItemNr) \ + STATIC_ITEM_INNER_P(PLABEL, ##V); \ + NEXT_ITEM(); \ +} while(0) + +#define STATIC_ITEM_N_P(PLABEL, N, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + MenuItemBase::init(N); \ + STATIC_ITEM_INNER_P(PLABEL, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) +#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) + +#define MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, false, PLABEL, ##V) +#define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, false, PLABEL, ##V) +#define MENU_ITEM_S(TYPE, S, LABEL, V...) MENU_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, false, PLABEL, ##V) +#define MENU_ITEM_N(TYPE, N, LABEL, V...) MENU_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) +#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) + +#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) + +#define ACTION_ITEM_N_S_P(N, S, PLABEL, ACTION) MENU_ITEM_N_S_P(function, N, S, PLABEL, ACTION) +#define ACTION_ITEM_N_S(N, S, LABEL, ACTION) ACTION_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_S_P(S, PLABEL, ACTION) MENU_ITEM_S_P(function, S, PLABEL, ACTION) +#define ACTION_ITEM_S(S, LABEL, ACTION) ACTION_ITEM_S_P(S, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_N_P(N, PLABEL, ACTION) MENU_ITEM_N_P(function, N, PLABEL, ACTION) +#define ACTION_ITEM_N(N, LABEL, ACTION) ACTION_ITEM_N_P(N, GET_TEXT(LABEL), ACTION) +#define ACTION_ITEM_P(PLABEL, ACTION) MENU_ITEM_P(function, PLABEL, ACTION) +#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_P(GET_TEXT(LABEL), ACTION) + +#define GCODES_ITEM_N_S_P(N, S, PLABEL, GCODES) MENU_ITEM_N_S_P(gcode, N, S, PLABEL, GCODES) +#define GCODES_ITEM_N_S(N, S, LABEL, GCODES) GCODES_ITEM_N_S_P(N, S, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_S_P(S, PLABEL, GCODES) MENU_ITEM_S_P(gcode, S, PLABEL, GCODES) +#define GCODES_ITEM_S(S, LABEL, GCODES) GCODES_ITEM_S_P(S, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_N_P(N, PLABEL, GCODES) MENU_ITEM_N_P(gcode, N, PLABEL, GCODES) +#define GCODES_ITEM_N(N, LABEL, GCODES) GCODES_ITEM_N_P(N, GET_TEXT(LABEL), GCODES) +#define GCODES_ITEM_P(PLABEL, GCODES) MENU_ITEM_P(gcode, PLABEL, GCODES) +#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_P(GET_TEXT(LABEL), GCODES) + +#define SUBMENU_N_S_P(N, S, PLABEL, DEST) MENU_ITEM_N_S_P(submenu, N, S, PLABEL, DEST) +#define SUBMENU_N_S(N, S, LABEL, DEST) SUBMENU_N_S_P(N, S, GET_TEXT(LABEL), DEST) +#define SUBMENU_S_P(S, PLABEL, DEST) MENU_ITEM_S_P(submenu, S, PLABEL, DEST) +#define SUBMENU_S(S, LABEL, DEST) SUBMENU_S_P(S, GET_TEXT(LABEL), DEST) +#define SUBMENU_N_P(N, PLABEL, DEST) MENU_ITEM_N_P(submenu, N, PLABEL, DEST) +#define SUBMENU_N(N, LABEL, DEST) SUBMENU_N_P(N, GET_TEXT(LABEL), DEST) +#define SUBMENU_P(PLABEL, DEST) MENU_ITEM_P(submenu, PLABEL, DEST) +#define SUBMENU(LABEL, DEST) SUBMENU_P(GET_TEXT(LABEL), DEST) + +#define EDIT_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, ##V) +#define EDIT_ITEM_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_S_P(TYPE, S, PLABEL, V...) MENU_ITEM_S_P(TYPE, S, PLABEL, ##V) +#define EDIT_ITEM_S(TYPE, S, LABEL, V...) EDIT_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_N_P(TYPE, N, PLABEL, V...) MENU_ITEM_N_P(TYPE, N, PLABEL, ##V) +#define EDIT_ITEM_N(TYPE, N, LABEL, V...) EDIT_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_P(TYPE, PLABEL, V...) MENU_ITEM_P(TYPE, PLABEL, ##V) +#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) + +#define EDIT_ITEM_FAST_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_FAST_N_S_P(TYPE, N, S, true, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_S(TYPE, S, LABEL, V...) EDIT_ITEM_FAST_S_P(TYPE, S, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, true, PLABEL, ##V) +#define EDIT_ITEM_FAST_N(TYPE, N, LABEL, V...) EDIT_ITEM_FAST_N_P(TYPE, N, GET_TEXT(LABEL), ##V) +#define EDIT_ITEM_FAST_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, true, PLABEL, ##V) +#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_P(TYPE, GET_TEXT(LABEL), ##V) + +#define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ + if (encoderLine == _thisItemNr && ui.use_click()) { \ + ui.save_previous_screen(); \ + ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ + return; \ + } \ + if (ui.should_draw()) MenuItem_confirm::draw \ + (encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ##V); \ +}while(0) + +// Indexed items set a global index value and optional data +#define _CONFIRM_ITEM_P(PLABEL, V...) do { \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Indexed items set a global index value +#define _CONFIRM_ITEM_N_S_P(N, S, V...) do{ \ + if (_menuLineNr == _thisItemNr) { \ + _skipStatic = false; \ + MenuItemBase::init(N, S); \ + _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +// Indexed items set a global index value +#define _CONFIRM_ITEM_N_P(N, V...) _CONFIRM_ITEM_N_S_P(N, nullptr, V) + +#define CONFIRM_ITEM_P(PLABEL,A,B,V...) _CONFIRM_ITEM_P(PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) +#define CONFIRM_ITEM(LABEL, V...) CONFIRM_ITEM_P(GET_TEXT(LABEL), ##V) + +#define YESNO_ITEM_P(PLABEL, V...) _CONFIRM_ITEM_P(PLABEL, ##V) +#define YESNO_ITEM(LABEL, V...) YESNO_ITEM_P(GET_TEXT(LABEL), ##V) + +#define CONFIRM_ITEM_N_S_P(N,S,PLABEL,A,B,V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) +#define CONFIRM_ITEM_N_S(N,S,LABEL,V...) CONFIRM_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) +#define CONFIRM_ITEM_N_P(N,PLABEL,A,B,V...) _CONFIRM_ITEM_N_P(N, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) +#define CONFIRM_ITEM_N(N,LABEL, V...) CONFIRM_ITEM_N_P(N, GET_TEXT(LABEL), ##V) + +#define YESNO_ITEM_N_S_P(N,S,PLABEL, V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, ##V) +#define YESNO_ITEM_N_S(N,S,LABEL, V...) YESNO_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) +#define YESNO_ITEM_N_P(N,PLABEL, V...) _CONFIRM_ITEM_N_P(N, PLABEL, ##V) +#define YESNO_ITEM_N(N,LABEL, V...) YESNO_ITEM_N_P(N, GET_TEXT(LABEL), ##V) + +#if ENABLED(LEVEL_BED_CORNERS) + void _lcd_level_bed_corners(); +#endif diff --git a/Marlin/src/lcd/menu/menu_job_recovery.cpp b/Marlin/src/lcd/menu/menu_job_recovery.cpp index a2743ef58b5d..7cd2949d627c 100644 --- a/Marlin/src/lcd/menu/menu_job_recovery.cpp +++ b/Marlin/src/lcd/menu/menu_job_recovery.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, POWER_LOSS_RECOVERY) -#include "menu.h" +#include "menu_item.h" #include "../../gcode/queue.h" #include "../../sd/cardreader.h" #include "../../feature/powerloss.h" diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index b117e0baa1dd..61ffbfd66399 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) -#include "menu.h" +#include "menu_item.h" #if ENABLED(LED_CONTROL_MENU) #include "../../feature/leds/leds.h" diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index fd86aaf112b2..8908f49fb22f 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #include "../../module/temperature.h" #include "../../gcode/queue.h" #include "../../module/printcounter.h" diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index c22314fa9f0a..3c0c6532f034 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, SDSUPPORT) -#include "menu.h" +#include "menu_item.h" #include "../../sd/cardreader.h" void lcd_sd_updir() { diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index abb56e4c5a18..8010239336ab 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, MIXING_EXTRUDER) -#include "menu.h" +#include "menu_item.h" #include "menu_addon.h" #include "../../feature/mixing.h" diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index 304e95887784..0a63d90c6370 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -26,7 +26,7 @@ #include "../../feature/mmu2/mmu2.h" #include "menu_mmu2.h" -#include "menu.h" +#include "menu_item.h" uint8_t currentTool; bool mmuMenuWait; diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 622cd091c061..914b229008d9 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #include "menu_addon.h" #include "../../module/motion.h" diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp index f8e0b567218c..c3924b568699 100644 --- a/Marlin/src/lcd/menu/menu_password.cpp +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -30,7 +30,7 @@ #include "../../feature/password/password.h" -#include "menu.h" +#include "menu_item.h" #include "menu_addon.h" void menu_advanced_settings(); diff --git a/Marlin/src/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp index bacf7f379f30..e88bdb28d8c8 100644 --- a/Marlin/src/lcd/menu/menu_power_monitor.cpp +++ b/Marlin/src/lcd/menu/menu_power_monitor.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && HAS_POWER_MONITOR -#include "menu.h" +#include "menu_item.h" #include "../../feature/power_monitor.h" void menu_power_monitor() { diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp index 00a98d12444a..04b999eaf620 100644 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && HAS_CUTTER - #include "menu.h" + #include "menu_item.h" #include "../../feature/spindle_laser.h" diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 4be98f132d1b..141a8138b595 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && HAS_TEMPERATURE -#include "menu.h" +#include "menu_item.h" #include "../../module/temperature.h" #if FAN_COUNT > 1 || ENABLED(SINGLENOZZLE) diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index f2f26886fc87..402ee41a1b45 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU && HAS_TRINAMIC_CONFIG -#include "menu.h" +#include "menu_item.h" #include "../../module/stepper/indirection.h" #include "../../feature/tmc_util.h" diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp index 71fb7b75568e..96eae2298e6c 100644 --- a/Marlin/src/lcd/menu/menu_touch_screen.cpp +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -24,7 +24,7 @@ #if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) -#include "menu.h" +#include "menu_item.h" #include "../ultralcd.h" void touch_screen_calibration() { diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 2d40318156e4..c02906f7f946 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -28,7 +28,7 @@ #if HAS_LCD_MENU -#include "menu.h" +#include "menu_item.h" #include "../../module/motion.h" #include "../../module/planner.h" #include "../../module/temperature.h" diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index d1c1e6dd0a5f..d034de095215 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -28,7 +28,7 @@ #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) -#include "menu.h" +#include "menu_item.h" #include "../../gcode/gcode.h" #include "../../gcode/queue.h" #include "../../module/motion.h" diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 69f4ada86f27..00c7439a5816 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -23,8 +23,9 @@ #include "touch.h" -#include "../ultralcd.h" -#include "../menu/menu.h" +#include "../ultralcd.h" // for ui methods +#include "../menu/menu.h" // for touch_screen_calibration + #include "../../module/temperature.h" #include "../../module/planner.h" diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 670c916dd766..6fa3006fb71f 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -938,6 +938,8 @@ void MarlinUI::update() { if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100; else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; + // Enable to output the encoder steps per second value + //#define ENCODER_RATE_MULTIPLIER_DEBUG #if ENABLED(ENCODER_RATE_MULTIPLIER_DEBUG) SERIAL_ECHO_START(); SERIAL_ECHOPAIR("Enc Step Rate: ", encoderStepRate); diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index 662adef0c5e2..d6a9f31e6c77 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -514,6 +514,9 @@ class MarlinUI { static bool encoderRateMultiplierEnabled; static millis_t lastEncoderMovementMillis; static void enable_encoder_multiplier(const bool onoff); + #define ENCODER_RATE_MULTIPLY(F) (ui.encoderRateMultiplierEnabled = F) + #else + #define ENCODER_RATE_MULTIPLY(F) NOOP #endif // Manual Movement From b8c4098de24c7876fe48f27a69aaa96f3557a7e2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 05:21:55 -0500 Subject: [PATCH 379/483] Remove extraneous defines --- Marlin/src/lcd/menu/menu.cpp | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 309ad06a4c9f..e6739a135cbf 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -163,30 +163,6 @@ void MenuEditItemBase::goto_edit_screen( liveEdit = le; } -// TODO: Remove these but test build size with and without -#define DEFINE_MENU_EDIT_ITEM(NAME) template class TMenuEditItem - -DEFINE_MENU_EDIT_ITEM(percent); // 100% right-justified -DEFINE_MENU_EDIT_ITEM(int3); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM(int4); // 1234, -123 right-justified -DEFINE_MENU_EDIT_ITEM(int8); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM(uint8); // 123 right-justified -DEFINE_MENU_EDIT_ITEM(uint16_3); // 123 right-justified -DEFINE_MENU_EDIT_ITEM(uint16_4); // 1234 right-justified -DEFINE_MENU_EDIT_ITEM(uint16_5); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM(float3); // 123 right-justified -DEFINE_MENU_EDIT_ITEM(float42_52); // _2.34, 12.34, -2.34 or 123.45, -23.45 -DEFINE_MENU_EDIT_ITEM(float43); // 1.234 -DEFINE_MENU_EDIT_ITEM(float5); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM(float5_25); // 12345 right-justified (25 increment) -DEFINE_MENU_EDIT_ITEM(float51); // 1234.5 right-justified -DEFINE_MENU_EDIT_ITEM(float31sign); // +12.3 -DEFINE_MENU_EDIT_ITEM(float41sign); // +123.4 -DEFINE_MENU_EDIT_ITEM(float51sign); // +1234.5 -DEFINE_MENU_EDIT_ITEM(float52sign); // +123.45 -DEFINE_MENU_EDIT_ITEM(long5); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM(long5_25); // 12345 right-justified (25 increment) - //////////////////////////////////////////// ///////////////// Menu Tree //////////////// //////////////////////////////////////////// From a37cf2490054ece3c16f0caca26a02c3d33057c8 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 21 Aug 2020 20:54:21 -0300 Subject: [PATCH 380/483] Emulated DOGM via HAL TFT, XPT IO (#19017) --- .../STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp | 331 ------------------ .../STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp | 236 ------------- Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h | 4 +- Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp | 2 +- Marlin/src/HAL/STM32F1/tft/tft_spi.cpp | 30 +- Marlin/src/HAL/STM32F1/tft/xpt2046.cpp | 2 +- Marlin/src/HAL/STM32F1/tft/xpt2046.h | 20 +- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 9 +- Marlin/src/inc/SanityCheck.h | 6 + Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 15 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 169 +++++---- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp | 39 +-- Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h | 8 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 6 +- .../extui/lib/mks_ui/mks_hardware_test.cpp | 2 - .../lib/mks_ui/tft_lvgl_configuration.cpp | 30 +- Marlin/src/lcd/scaled_tft.h | 28 +- Marlin/src/lcd/touch/touch_buttons.cpp | 112 ++++++ .../lcd/touch/{xpt2046.h => touch_buttons.h} | 24 +- Marlin/src/lcd/touch/xpt2046.cpp | 251 ------------- Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 131 +++---- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 147 +++----- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 20 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 100 +++--- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 203 +++++------ buildroot/share/scripts/pinsformat.js | 41 ++- 28 files changed, 594 insertions(+), 1376 deletions(-) delete mode 100644 Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp delete mode 100644 Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp create mode 100644 Marlin/src/lcd/touch/touch_buttons.cpp rename Marlin/src/lcd/touch/{xpt2046.h => touch_buttons.h} (56%) delete mode 100644 Marlin/src/lcd/touch/xpt2046.cpp diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp deleted file mode 100644 index 445e53b67f54..000000000000 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_fsmc.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * u8g_com_stm32duino_fsmc.cpp - * - * Communication interface for FSMC - */ - -#include "../../../inc/MarlinConfig.h" - -#if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs - -#if HAS_GRAPHICAL_LCD - -#include -#include -#include -#include -#include - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif - -/* Timing configuration */ -#define FSMC_ADDRESS_SETUP_TIME 15 // AddressSetupTime -#define FSMC_DATA_SETUP_TIME 15 // DataSetupTime - -void LCD_IO_Init(uint8_t cs, uint8_t rs); -void LCD_IO_WriteData(uint16_t RegValue); -void LCD_IO_WriteReg(uint16_t Reg); -uint16_t LCD_IO_ReadData(uint16_t RegValue); -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); -#ifdef LCD_USE_DMA_FSMC - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); -#endif - -static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT - -uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - if (msgInitCount) { - if (msg == U8G_COM_MSG_INIT) msgInitCount--; - if (msgInitCount) return -1; - } - - static uint8_t isCommand; - - switch (msg) { - case U8G_COM_MSG_STOP: break; - case U8G_COM_MSG_INIT: - u8g_SetPIOutput(u8g, U8G_PI_RESET); - - #ifdef LCD_USE_DMA_FSMC - dma_init(FSMC_DMA_DEV); - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); - #endif - - LCD_IO_Init(u8g->pin_list[U8G_PI_CS], u8g->pin_list[U8G_PI_A0]); - u8g_Delay(50); - - if (arg_ptr) { - *((uint32_t *)arg_ptr) = LCD_IO_ReadData(0x0000); - if (*((uint32_t *)arg_ptr) == 0) - *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3); - } - isCommand = 0; - break; - - case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) - isCommand = arg_val == 0 ? 1 : 0; - break; - - case U8G_COM_MSG_RESET: - u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_WRITE_BYTE: - if (isCommand) - LCD_IO_WriteReg(arg_val); - else - LCD_IO_WriteData((uint16_t)arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: - for (uint8_t i = 0; i < arg_val; i += 2) - LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); - break; - } - return 1; -} - -/** - * FSMC LCD IO - */ -#define __ASM __asm -#define __STATIC_INLINE static inline - -__attribute__((always_inline)) __STATIC_INLINE void __DSB() { - __ASM volatile ("dsb 0xF":::"memory"); -} - -#define FSMC_CS_NE1 PD7 - -#if ENABLED(STM32_XL_DENSITY) - #define FSMC_CS_NE2 PG9 - #define FSMC_CS_NE3 PG10 - #define FSMC_CS_NE4 PG12 - - #define FSMC_RS_A0 PF0 - #define FSMC_RS_A1 PF1 - #define FSMC_RS_A2 PF2 - #define FSMC_RS_A3 PF3 - #define FSMC_RS_A4 PF4 - #define FSMC_RS_A5 PF5 - #define FSMC_RS_A6 PF12 - #define FSMC_RS_A7 PF13 - #define FSMC_RS_A8 PF14 - #define FSMC_RS_A9 PF15 - #define FSMC_RS_A10 PG0 - #define FSMC_RS_A11 PG1 - #define FSMC_RS_A12 PG2 - #define FSMC_RS_A13 PG3 - #define FSMC_RS_A14 PG4 - #define FSMC_RS_A15 PG5 -#endif - -#define FSMC_RS_A16 PD11 -#define FSMC_RS_A17 PD12 -#define FSMC_RS_A18 PD13 -#define FSMC_RS_A19 PE3 -#define FSMC_RS_A20 PE4 -#define FSMC_RS_A21 PE5 -#define FSMC_RS_A22 PE6 -#define FSMC_RS_A23 PE2 - -#if ENABLED(STM32_XL_DENSITY) - #define FSMC_RS_A24 PG13 - #define FSMC_RS_A25 PG14 -#endif - -static uint8_t fsmcInit = 0; - -typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; -} LCD_CONTROLLER_TypeDef; - -LCD_CONTROLLER_TypeDef *LCD; - -void LCD_IO_Init(uint8_t cs, uint8_t rs) { - uint32_t controllerAddress; - struct fsmc_nor_psram_reg_map* fsmcPsramRegion; - - if (fsmcInit) return; - fsmcInit = 1; - - switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; - #endif - default: return; - } - - #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) - - switch (rs) { - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A0: _ORADDR( 1); break; - case FSMC_RS_A1: _ORADDR( 2); break; - case FSMC_RS_A2: _ORADDR( 3); break; - case FSMC_RS_A3: _ORADDR( 4); break; - case FSMC_RS_A4: _ORADDR( 5); break; - case FSMC_RS_A5: _ORADDR( 6); break; - case FSMC_RS_A6: _ORADDR( 7); break; - case FSMC_RS_A7: _ORADDR( 8); break; - case FSMC_RS_A8: _ORADDR( 9); break; - case FSMC_RS_A9: _ORADDR(10); break; - case FSMC_RS_A10: _ORADDR(11); break; - case FSMC_RS_A11: _ORADDR(12); break; - case FSMC_RS_A12: _ORADDR(13); break; - case FSMC_RS_A13: _ORADDR(14); break; - case FSMC_RS_A14: _ORADDR(15); break; - case FSMC_RS_A15: _ORADDR(16); break; - #endif - case FSMC_RS_A16: _ORADDR(17); break; - case FSMC_RS_A17: _ORADDR(18); break; - case FSMC_RS_A18: _ORADDR(19); break; - case FSMC_RS_A19: _ORADDR(20); break; - case FSMC_RS_A20: _ORADDR(21); break; - case FSMC_RS_A21: _ORADDR(22); break; - case FSMC_RS_A22: _ORADDR(23); break; - case FSMC_RS_A23: _ORADDR(24); break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A24: _ORADDR(25); break; - case FSMC_RS_A25: _ORADDR(26); break; - #endif - default: return; - } - - rcc_clk_enable(RCC_FSMC); - - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); // FSMC_D02 - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); // FSMC_D03 - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); // FSMC_D04 - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); // FSMC_D05 - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); // FSMC_D06 - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); // FSMC_D13 - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); // FSMC_D14 - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 - - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // FSMC_NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // FSMC_NWE - - gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx - gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - - fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - - afio_remap(AFIO_REMAP_FSMC_NADV); - - LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; -} - -void LCD_IO_WriteData(uint16_t RegValue) { - LCD->RAM = RegValue; - __DSB(); -} - -void LCD_IO_WriteReg(uint16_t Reg) { - LCD->REG = Reg; - __DSB(); -} - -uint16_t LCD_IO_ReadData(uint16_t RegValue) { - LCD->REG = RegValue; - __DSB(); - - return LCD->RAM; -} - -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - volatile uint32_t data; - LCD->REG = RegValue; - __DSB(); - - data = LCD->RAM; // dummy read - data = LCD->RAM & 0x00FF; - - while (--ReadSize) { - data <<= 8; - data |= (LCD->RAM & 0x00FF); - } - return uint32_t(data); -} - -#ifdef LCD_USE_DMA_FSMC - -void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) { - while (count > 0) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, &color, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, count > 65535 ? 65535 : count); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - count = count > 65535 ? count - 65535 : 0; - } -} - -void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); -} - -void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); -} - -void LCD_IO_WaitSequence_Async() { - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); -} - -#endif // LCD_USE_DMA_FSMC - -#endif // HAS_GRAPHICAL_LCD -#endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp deleted file mode 100644 index 206c3fda3d3f..000000000000 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_hwspi.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __STM32F1__ - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(SPI_GRAPHICAL_TFT) && DISABLED(FORCE_SOFT_SPI) - -#include "../HAL.h" -#include -#include - -#define SPI_TFT_CS_H OUT_WRITE(SPI_TFT_CS_PIN, HIGH) -#define SPI_TFT_CS_L OUT_WRITE(SPI_TFT_CS_PIN, LOW) - -#define SPI_TFT_DC_H OUT_WRITE(SPI_TFT_DC_PIN, HIGH) -#define SPI_TFT_DC_L OUT_WRITE(SPI_TFT_DC_PIN, LOW) - -#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) -#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) - -#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) -#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) - -void LCD_IO_Init(uint8_t cs, uint8_t rs); -void LCD_IO_WriteData(uint16_t RegValue); -void LCD_IO_WriteReg(uint16_t Reg); -uint16_t LCD_IO_ReadData(uint16_t RegValue); -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); -#ifdef LCD_USE_DMA_SPI - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count); - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); -#endif - -void LCD_WR_REG(uint8_t cmd) { - SPI_TFT_CS_L; - SPI_TFT_DC_L; - SPI.send(cmd); - SPI_TFT_CS_H; -} -void LCD_WR_DATA(uint8_t data) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.send(data); - SPI_TFT_CS_H; -} - -void spi1Init(uint8_t spiRate) { - SPI_TFT_CS_H; - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(1); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -} - -void LCD_IO_Init(uint8_t cs, uint8_t rs) { - spi1Init(SPI_FULL_SPEED); -} - -void LCD_IO_WriteData(uint16_t RegValue) { - LCD_WR_DATA(RegValue); -} - -void LCD_IO_WriteReg(uint16_t Reg) { - LCD_WR_REG(Reg); -} - -uint16_t LCD_IO_ReadData(uint16_t RegValue) { - uint16_t d = 0; - SPI_TFT_CS_L; - - SPI_TFT_DC_L; - SPI.send(RegValue); - SPI_TFT_DC_H; - - SPI.read((uint8_t*)&d, 1); //dummy read - SPI.read((uint8_t*)&d, 1); - - SPI_TFT_CS_H; - return d >> 7; -} - -uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) { - uint32_t data = 0; - uint8_t d = 0; - SPI_TFT_CS_L; - - SPI_TFT_DC_L; - SPI.send(RegValue); - SPI_TFT_DC_H; - - SPI.read((uint8_t*)&d, 1); //dummy read - SPI.read((uint8_t*)&d, 1); - data = d; - while (--ReadSize) { - data <<= 8; - SPI.read((uint8_t*)&d, 1); - data |= (d & 0xFF); - } - - SPI_TFT_CS_H; - return uint32_t(data >> 7); -} - -#ifdef LCD_USE_DMA_SPI - void LCD_IO_WriteMultiple(uint16_t data, uint32_t count) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - count *= 2; - } - while (count > 0) { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(&data, 1, true); - SPI_TFT_CS_H; - count--; - } - } - - void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - length *= 2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSend(data, length, true); - SPI_TFT_CS_H; - } - - void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) { - if (SPI.getDataSize() == DATA_SIZE_8BIT) { - length *= 2; - } - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSendAsync(data, length, true); - SPI_TFT_CS_H; - } - - void LCD_IO_WaitSequence_Async() { - SPI_TFT_CS_L; - SPI_TFT_DC_H; - SPI.dmaSendAsync(NULL, 0, true); - SPI_TFT_CS_H; - } -#endif - -static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif - -uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - if (msgInitCount) { - if (msg == U8G_COM_MSG_INIT) msgInitCount--; - if (msgInitCount) return -1; - } - - static uint8_t isCommand; - - LCD_IO_Init(-1, -1); - - switch (msg) { - case U8G_COM_MSG_STOP: break; - case U8G_COM_MSG_INIT: - u8g_SetPIOutput(u8g, U8G_PI_RESET); - - u8g_Delay(50); - - if (arg_ptr) { - spi1Init(SPI_EIGHTH_SPEED); - *((uint32_t *)arg_ptr) = (LCD_READ_ID << 24) | LCD_IO_ReadData(LCD_READ_ID, 3); - spi1Init(SPI_FULL_SPEED); - } - isCommand = 0; - break; - - case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) - isCommand = arg_val == 0 ? 1 : 0; - break; - - case U8G_COM_MSG_RESET: - u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_WRITE_BYTE: - if (isCommand) - LCD_IO_WriteReg(arg_val); - else - LCD_IO_WriteData((uint16_t)arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: - for (uint8_t i = 0; i < arg_val; i += 2) - LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); - break; - - } - return 1; -} - -#endif // SPI_GRAPHICAL_TFT && !FORCE_SOFT_SPI -#endif // STM32F1 diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h index 09d79030b53e..25110d7c80e4 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -26,8 +26,8 @@ #undef SD_CHECK_AND_RETRY #endif -// This platform has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) && !HAS_FSMC_TFT && !HAS_SPI_TFT +// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT #undef TOUCH_SCREEN #undef TOUCH_SCREEN_CALIBRATION #define HAS_TOUCH_XPT2046 1 diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp index e0047e7d5910..bc1b012dc788 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_FSMC_TFT || ENABLED(TFT_LVGL_UI_FSMC) +#if HAS_FSMC_TFT #include "tft_fsmc.h" #include diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp index 2610262b0f2c..1095389946ad 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_SPI_TFT || ENABLED(TFT_LVGL_UI_SPI) +#if HAS_SPI_TFT #include "tft_spi.h" @@ -30,32 +30,32 @@ SPIClass TFT_SPI::SPIx(1); -#define SPI_TFT_CS_H OUT_WRITE(TFT_CS_PIN, HIGH) -#define SPI_TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW) +#define TFT_CS_H OUT_WRITE(TFT_CS_PIN, HIGH) +#define TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW) -#define SPI_TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH) -#define SPI_TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW) +#define TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH) +#define TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW) -#define SPI_TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH) -#define SPI_TFT_RST_L OUT_WRITE(TFT_RST_PIN, LOW) +#define TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH) +#define TFT_RST_L OUT_WRITE(TFT_RST_PIN, LOW) -#define SPI_TFT_BLK_H OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH) -#define SPI_TFT_BLK_L OUT_WRITE(TFT_BACKLIGHT_PIN, LOW) +#define TFT_BLK_H OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH) +#define TFT_BLK_L OUT_WRITE(TFT_BACKLIGHT_PIN, LOW) void TFT_SPI::Init() { #if PIN_EXISTS(TFT_RESET) // OUT_WRITE(TFT_RESET_PIN, HIGH); - SPI_TFT_RST_H; + TFT_RST_H; delay(100); #endif #if PIN_EXISTS(TFT_BACKLIGHT) // OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - SPI_TFT_BLK_H; + TFT_BLK_H; #endif - SPI_TFT_DC_H; - SPI_TFT_CS_H; + TFT_DC_H; + TFT_CS_H; /** * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz @@ -87,7 +87,7 @@ void TFT_SPI::Init() { void TFT_SPI::DataTransferBegin(uint16_t DataSize) { SPIx.setDataSize(DataSize); SPIx.begin(); - SPI_TFT_CS_L; + TFT_CS_L; } uint32_t TFT_SPI::GetID() { @@ -135,7 +135,7 @@ void TFT_SPI::Transmit(uint16_t Data) { void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { DataTransferBegin(); - SPI_TFT_DC_H; + TFT_DC_H; if (MemoryIncrease == DMA_MINC_ENABLE) { SPIx.dmaSend(Data, Count, true); } diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp index e06cace7419a..616d05fead15 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -19,7 +19,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_TFT_XPT2046 +#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046 #include "xpt2046.h" #include diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h index d2b7ad29b03e..019f75efce12 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h @@ -24,16 +24,18 @@ #include #endif -#if !PIN_EXISTS(TOUCH_MISO) - #error "TOUCH_MISO_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_MOSI) - #error "TOUCH_MOSI_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_SCK) - #error "TOUCH_SCK_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_CS) - #error "TOUCH_CS_PIN is not defined." +#ifndef TOUCH_MISO_PIN + #define TOUCH_MISO_PIN MISO_PIN +#endif +#ifndef TOUCH_MOSI_PIN + #define TOUCH_MOSI_PIN MOSI_PIN +#endif +#ifndef TOUCH_SCK_PIN + #define TOUCH_SCK_PIN SCK_PIN +#endif +#ifndef TOUCH_CS_PIN + #define TOUCH_CS_PIN CS_PIN #endif - #ifndef TOUCH_INT_PIN #define TOUCH_INT_PIN -1 #endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 30b6fbe3d59d..3544a8840f63 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -57,7 +57,7 @@ #include "lcd/ultralcd.h" #if HAS_TOUCH_XPT2046 - #include "lcd/touch/xpt2046.h" + #include "lcd/touch/touch_buttons.h" #endif #if HAS_TFT_LVGL_UI diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index d8c8103a4214..ccafd413cfcb 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -286,14 +286,15 @@ #define DELAYED_BACKLIGHT_INIT #endif -// FSMC/SPI TFT Panels (HAL STM32) -#if EITHER(TFT_320x240, TFT_480x320) +// FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h +#if ANY(TFT_320x240, TFT_480x320, TFT_LVGL_UI_FSMC, FSMC_GRAPHICAL_TFT) #define HAS_FSMC_TFT 1 -#elif EITHER(TFT_320x240_SPI, TFT_480x320_SPI) +#elif ANY(TFT_320x240_SPI, TFT_480x320_SPI, TFT_LVGL_UI_SPI, SPI_GRAPHICAL_TFT) #define HAS_SPI_TFT 1 #endif -#if HAS_FSMC_TFT || HAS_SPI_TFT +// Color UI +#if ANY(TFT_320x240, TFT_480x320, TFT_320x240_SPI, TFT_480x320_SPI) #define HAS_GRAPHICAL_TFT 1 #define IS_ULTIPANEL #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d31a8267781f..01243219c239 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -515,6 +515,12 @@ #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." #elif defined(TOUCH_BUTTONS) #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." +#elif defined(LCD_FULL_PIXEL_HEIGHT) + #error "LCD_FULL_PIXEL_HEIGHT is deprecated and should be removed. Please update your Configuration.h." +#elif defined(LCD_FULL_PIXEL_WIDTH) + #error "LCD_FULL_PIXEL_WIDTH is deprecated and should be removed. Please update your Configuration.h." +#elif defined(FSMC_UPSCALE) + #error "FSMC_UPSCALE is now GRAPHICAL_TFT_UPSCALE. Please update your Configuration.h." #elif defined(ANYCUBIC_TFT_MODEL) #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." #elif defined(EVENT_GCODE_SD_STOP) diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index 1f9621e9c05e..455fc2388ee9 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -82,14 +82,9 @@ #define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn - #if PIN_EXISTS(FSMC_CS) - uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_fsmc_fn - #endif - - #if ENABLED(SPI_GRAPHICAL_TFT) - uint8_t u8g_com_stm32duino_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_FSMC_FN u8g_com_stm32duino_spi_fn + #if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) + uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_TFT_FN u8g_com_stm32duino_tft_fn #endif #elif defined(TARGET_LPC1768) @@ -122,6 +117,6 @@ #ifndef U8G_COM_SSD_I2C_HAL #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn #endif -#ifndef U8G_COM_HAL_FSMC_FN - #define U8G_COM_HAL_FSMC_FN u8g_com_null_fn +#ifndef U8G_COM_HAL_TFT_FN + #define U8G_COM_HAL_TFT_FN u8g_com_null_fn #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index e42faf025527..dc8fbc53facf 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -67,28 +67,24 @@ #define HAS_LCD_IO 1 #endif -#if HAS_LCD_IO - extern void LCD_IO_Init(uint8_t cs, uint8_t rs); - extern uint16_t LCD_IO_ReadData(uint16_t Reg); - extern uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize); - extern void LCD_IO_WriteReg(uint16_t Reg); - extern void LCD_IO_WriteData(uint16_t RegValue); - extern void LCD_IO_WriteSequence(uint16_t *data, uint16_t length); - extern void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length); - extern void LCD_IO_WaitSequence_Async(); - extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count); +#if ENABLED(SPI_GRAPHICAL_TFT) + #include HAL_PATH(../../HAL, tft/tft_spi.h) +#elif ENABLED(FSMC_GRAPHICAL_TFT) + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) #endif +TFT_IO tftio; + #define WIDTH LCD_PIXEL_WIDTH #define HEIGHT LCD_PIXEL_HEIGHT #define PAGE_HEIGHT 8 #include "../scaled_tft.h" -#define UPSCALE0(M) ((M) * (FSMC_UPSCALE)) +#define UPSCALE0(M) ((M) * (GRAPHICAL_TFT_UPSCALE)) #define UPSCALE(A,M) (UPSCALE0(M) + (A)) -#define X_HI (UPSCALE(LCD_PIXEL_OFFSET_X, WIDTH) - 1) -#define Y_HI (UPSCALE(LCD_PIXEL_OFFSET_Y, HEIGHT) - 1) +#define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) +#define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) // see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html @@ -156,7 +152,8 @@ static uint32_t lcd_id = 0; static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { #if HAS_LCD_IO - #define IO_REG_DATA(R,D) do { LCD_IO_WriteReg(R); LCD_IO_WriteData(D); }while(0) + tftio.DataTransferBegin(DATASIZE_8BIT); + #define IO_REG_DATA(R,D) do { tftio.WriteReg(R); tftio.WriteData(D); }while(0) #else #define IO_REG_DATA(R,D) do { u8g_WriteByte(u8g, dev, R); u8g_WriteSequence(u8g, dev, 2, (uint8_t *)&D); }while(0) #endif @@ -174,7 +171,8 @@ static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_ IO_REG_DATA(ILI9328_VASET, Xmin); #if HAS_LCD_IO - LCD_IO_WriteReg(ILI9328_WRITE_RAM); + tftio.WriteReg(ILI9328_WRITE_RAM); + tftio.DataTransferEnd(); #else u8g_WriteByte(u8g, dev, ILI9328_WRITE_RAM); u8g_SetAddress(u8g, dev, 1); @@ -183,19 +181,21 @@ static void setWindow_ili9328(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_ static void setWindow_st7789v(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { #if HAS_LCD_IO - LCD_IO_WriteReg(ST7789V_CASET); - LCD_IO_WriteData((Xmin >> 8) & 0xFF); - LCD_IO_WriteData(Xmin & 0xFF); - LCD_IO_WriteData((Xmax >> 8) & 0xFF); - LCD_IO_WriteData(Xmax & 0xFF); - - LCD_IO_WriteReg(ST7789V_RASET); - LCD_IO_WriteData((Ymin >> 8) & 0xFF); - LCD_IO_WriteData(Ymin & 0xFF); - LCD_IO_WriteData((Ymax >> 8) & 0xFF); - LCD_IO_WriteData(Ymax & 0xFF); - - LCD_IO_WriteReg(ST7789V_WRITE_RAM); + tftio.DataTransferBegin(DATASIZE_8BIT); + tftio.WriteReg(ST7789V_CASET); + tftio.WriteData((Xmin >> 8) & 0xFF); + tftio.WriteData(Xmin & 0xFF); + tftio.WriteData((Xmax >> 8) & 0xFF); + tftio.WriteData(Xmax & 0xFF); + + tftio.WriteReg(ST7789V_RASET); + tftio.WriteData((Ymin >> 8) & 0xFF); + tftio.WriteData(Ymin & 0xFF); + tftio.WriteData((Ymax >> 8) & 0xFF); + tftio.WriteData(Ymax & 0xFF); + + tftio.WriteReg(ST7789V_WRITE_RAM); + tftio.DataTransferEnd(); #else u8g_SetAddress(u8g, dev, 0); u8g_WriteByte(u8g, dev, ST7789V_CASET); u8g_SetAddress(u8g, dev, 1); u8g_WriteByte(u8g, dev, (Xmin >> 8) & 0xFF); @@ -227,17 +227,17 @@ void (*setWindow)(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint for (;;) { data = *sequence++; if (data != 0xFFFF) { - LCD_IO_WriteData(data); + tftio.WriteData(data); continue; } data = *sequence++; if (data == 0x7FFF) return; if (data == 0xFFFF) { - LCD_IO_WriteData(data); + tftio.WriteData(data); } else if (data & 0x8000) { delay(data & 0x7FFF); } else if ((data & 0xFF00) == 0) { - LCD_IO_WriteReg(data); + tftio.WriteReg(data); } } } @@ -591,7 +591,7 @@ static const uint16_t st7796_init[] = { #define BUTTON_Y_HI (UPSCALE(BUTTON_Y_LO, BUTTON_SIZE_Y) - 1) void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) { - uint16_t buffer[BUTTON_SIZE_X * sq(FSMC_UPSCALE)]; + uint16_t buffer[BUTTON_SIZE_X * sq(GRAPHICAL_TFT_UPSCALE)]; if (length > BUTTON_SIZE_X) return; @@ -603,16 +603,16 @@ static const uint16_t st7796_init[] = { v = color; else v = TFT_MARLINBG_COLOR; - LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = v; + LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = v; } #if HAS_LCD_IO - LOOP_S_L_N(n, 1, FSMC_UPSCALE) + LOOP_S_L_N(n, 1, GRAPHICAL_TFT_UPSCALE) for (uint16_t l = 0; l < UPSCALE0(length); l++) buffer[l + n * UPSCALE0(length)] = buffer[l]; - LCD_IO_WriteSequence(buffer, length * sq(FSMC_UPSCALE)); + tftio.WriteSequence(buffer, length * sq(GRAPHICAL_TFT_UPSCALE)); #else - for (uint8_t i = FSMC_UPSCALE; i--;) + for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); #endif } @@ -632,22 +632,17 @@ static uint8_t page; uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - #if ENABLED(SPI_GRAPHICAL_TFT) - LCD_IO_Init(-1, -1); - #endif - #if HAS_LCD_IO - static uint16_t bufferA[WIDTH * sq(FSMC_UPSCALE)], bufferB[WIDTH * sq(FSMC_UPSCALE)]; + static uint16_t bufferA[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)], bufferB[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)]; uint16_t* buffer = &bufferA[0]; - bool allow_async = DISABLED(SPI_GRAPHICAL_TFT); #else - uint16_t buffer[WIDTH * FSMC_UPSCALE]; // 16-bit RGB 565 pixel line buffer + uint16_t buffer[WIDTH * GRAPHICAL_TFT_UPSCALE]; // 16-bit RGB 565 pixel line buffer #endif switch (msg) { case U8G_DEV_MSG_INIT: dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, &lcd_id); - + tftio.DataTransferBegin(DATASIZE_8BIT); switch (lcd_id & 0xFFFF) { case 0x8552: // ST7789V WRITE_ESC_SEQUENCE(st7789v_init); @@ -682,6 +677,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u setWindow = (lcd_id & 0xFF000000) ? setWindow_st7789v : setWindow_ili9328; break; } + tftio.DataTransferEnd(); if (preinit) { preinit = false; @@ -689,13 +685,13 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u } // Clear Screen - setWindow(u8g, dev, 0, 0, (LCD_FULL_PIXEL_WIDTH) - 1, (LCD_FULL_PIXEL_HEIGHT) - 1); + setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); #if HAS_LCD_IO - LCD_IO_WriteMultiple(TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); + tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); #else - memset2(buffer, TFT_MARLINBG_COLOR, (LCD_FULL_PIXEL_WIDTH) / 2); - for (uint16_t i = 0; i < (LCD_FULL_PIXEL_HEIGHT) * sq(FSMC_UPSCALE); i++) - u8g_WriteSequence(u8g, dev, LCD_FULL_PIXEL_WIDTH / 2, (uint8_t *)buffer); + memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2); + for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++) + u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer); #endif // Bottom buttons @@ -719,7 +715,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u case U8G_DEV_MSG_PAGE_FIRST: page = 0; - setWindow(u8g, dev, LCD_PIXEL_OFFSET_X, LCD_PIXEL_OFFSET_Y, X_HI, Y_HI); + setWindow(u8g, dev, TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI); break; case U8G_DEV_MSG_PAGE_NEXT: @@ -733,26 +729,18 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { const uint8_t b = *(((uint8_t *)pb->buf) + i); const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR; - LOOP_L_N(n, FSMC_UPSCALE) buffer[k++] = c; + LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = c; } #if HAS_LCD_IO - LOOP_S_L_N(n, 1, FSMC_UPSCALE) + LOOP_S_L_N(n, 1, GRAPHICAL_TFT_UPSCALE) for (uint16_t l = 0; l < UPSCALE0(WIDTH); l++) buffer[l + n * UPSCALE0(WIDTH)] = buffer[l]; - if (allow_async) { - if (y > 0 || page > 1) LCD_IO_WaitSequence_Async(); - if (y == 7 && page == 8) - LCD_IO_WriteSequence(buffer, COUNT(bufferA)); // last line of last page - else - LCD_IO_WriteSequence_Async(buffer, COUNT(bufferA)); - } - else - LCD_IO_WriteSequence(buffer, COUNT(bufferA)); + tftio.WriteSequence(buffer, COUNT(bufferA)); #else uint8_t* bufptr = (uint8_t*) buffer; - for (uint8_t i = FSMC_UPSCALE; i--;) { - LOOP_S_L_N(n, 0, FSMC_UPSCALE * 2) { + for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) { + LOOP_S_L_N(n, 0, GRAPHICAL_TFT_UPSCALE * 2) { u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH * n]); } } @@ -770,6 +758,59 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); } -U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_FSMC_FN); +static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT + +uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + if (msgInitCount) { + if (msg == U8G_COM_MSG_INIT) msgInitCount--; + if (msgInitCount) return -1; + } + + static uint8_t isCommand; + + switch (msg) { + case U8G_COM_MSG_STOP: break; + case U8G_COM_MSG_INIT: + u8g_SetPIOutput(u8g, U8G_PI_RESET); + + u8g_Delay(50); + + tftio.Init(); + + if (arg_ptr) { + *((uint32_t *)arg_ptr) = tftio.GetID(); + } + isCommand = 0; + break; + + case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) + isCommand = arg_val == 0 ? 1 : 0; + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + tftio.DataTransferBegin(DATASIZE_8BIT); + if (isCommand) + tftio.WriteReg(arg_val); + else + tftio.WriteData((uint16_t)arg_val); + tftio.DataTransferEnd(); + break; + + case U8G_COM_MSG_WRITE_SEQ: + tftio.DataTransferBegin(DATASIZE_8BIT); + for (uint8_t i = 0; i < arg_val; i += 2) + tftio.WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); + tftio.DataTransferEnd(); + break; + + } + return 1; +} + +U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_TFT_FN); #endif // HAS_GRAPHICAL_LCD && FSMC_CS diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp index 607090ba391d..ea94d6c1a571 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -33,25 +33,6 @@ TFT SPI_TFT; -#ifndef SPI_TFT_MISO_PIN - #define SPI_TFT_MISO_PIN PA6 -#endif -#ifndef SPI_TFT_MOSI_PIN - #define SPI_TFT_MOSI_PIN PA7 -#endif -#ifndef SPI_TFT_SCK_PIN - #define SPI_TFT_SCK_PIN PA5 -#endif -#ifndef SPI_TFT_CS_PIN - #define SPI_TFT_CS_PIN PD11 -#endif -#ifndef SPI_TFT_DC_PIN - #define SPI_TFT_DC_PIN PD10 -#endif -#ifndef SPI_TFT_RST_PIN - #define SPI_TFT_RST_PIN PC6 -#endif - // use SPI1 for the spi tft. void TFT::spi_init(uint8_t spiRate) { tftio.Init(); @@ -93,11 +74,11 @@ void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { } void TFT::LCD_init() { - SPI_TFT_RST_H; + TFT_RST_H; delay(150); - SPI_TFT_RST_L; + TFT_RST_L; delay(150); - SPI_TFT_RST_H; + TFT_RST_H; tftio.DataTransferBegin(DATASIZE_8BIT); @@ -176,22 +157,22 @@ void TFT::LCD_init() { LCD_clear(0x0000); // LCD_Draw_Logo(); - SPI_TFT_BLK_H; + TFT_BLK_H; delay(2000); } void TFT::LCD_clear(uint16_t color) { - SetWindows(0, 0, (LCD_FULL_PIXEL_WIDTH) - 1, (LCD_FULL_PIXEL_HEIGHT) - 1); - tftio.WriteMultiple(color, (uint32_t)(LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); + SetWindows(0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); + tftio.WriteMultiple(color, (uint32_t)(TFT_WIDTH) * (TFT_HEIGHT)); } extern unsigned char bmp_public_buf[17 * 1024]; void TFT::LCD_Draw_Logo() { - SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); - for (uint16_t i = 0; i < (LCD_FULL_PIXEL_HEIGHT); i ++) { - Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (LCD_FULL_PIXEL_WIDTH) * 2); - tftio.WriteSequence((uint16_t *)bmp_public_buf, LCD_FULL_PIXEL_WIDTH); + SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); + for (uint16_t i = 0; i < (TFT_HEIGHT); i ++) { + Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); + tftio.WriteSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h index c4b04e1c2183..e40039fe8649 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -29,11 +29,11 @@ #include HAL_PATH(../../HAL, tft/tft_fsmc.h) #endif -#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH) -#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW) +#define TFT_RST_H OUT_WRITE(TFT_RESET_PIN, HIGH) +#define TFT_RST_L OUT_WRITE(TFT_RESET_PIN, LOW) -#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) -#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) +#define TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH) +#define TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW) class TFT { public: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index dc5e4910e939..ff9d0518d378 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -653,10 +653,10 @@ char *creat_title_text() { i += 2; if (*p_index == 0x0000) *p_index = 0xC318; } - SPI_TFT_CS_L; - SPI_TFT_DC_H; + TFT_CS_L; + TFT_DC_H; SPI.dmaSend(bmp_public_buf, 400, true); - SPI_TFT_CS_H; + TFT_CS_H; #else for (i = 0; i < 400;) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp index a2795e933bcf..297ba723de8f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -34,8 +34,6 @@ #include "pic_manager.h" #include -#include "../../../touch/xpt2046.h" - #include "../../../../MarlinCore.h" #include "../../../../module/temperature.h" #include "../../../../sd/cardreader.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index 391e12ba3fc7..23072d27c750 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -51,11 +51,11 @@ XPT2046 touch; #include -#ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 +#ifndef TFT_WIDTH + #define TFT_WIDTH 480 #endif -#ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 #endif #if HAS_SPI_FLASH_FONT @@ -135,7 +135,7 @@ void LCD_WriteRAM_Prepare(void) { void tft_set_point(uint16_t x, uint16_t y, uint16_t point) { //if (DeviceCode == 0x9488) { - if (x > (LCD_FULL_PIXEL_WIDTH) || y > (LCD_FULL_PIXEL_HEIGHT)) return; + if (x > (TFT_WIDTH) || y > (TFT_HEIGHT)) return; //} tft_set_cursor(x, y); @@ -196,8 +196,8 @@ void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16 LCD_WriteReg(0x0053, yEnd);*/ LCD_WriteReg(0x0050, StartY); // Specify the start/end positions of the window address in the horizontal direction by an address unit LCD_WriteReg(0x0051, yEnd); // Specify the start positions of the window address in the vertical direction by an address unit - LCD_WriteReg(0x0052, (LCD_FULL_PIXEL_HEIGHT) - xEnd); - LCD_WriteReg(0x0053, (LCD_FULL_PIXEL_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit + LCD_WriteReg(0x0052, (TFT_HEIGHT) - xEnd); + LCD_WriteReg(0x0053, (TFT_HEIGHT) - StartX - 1); // Specify the end positions of the window address in the vertical direction by an address unit } else { @@ -231,16 +231,16 @@ void LCD_Clear(uint16_t Color) { if (DeviceCode == 0x9488) { tft_set_cursor(0, 0); - ili9320_SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); + ili9320_SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); LCD_WriteRAM_Prepare(); #ifdef LCD_USE_DMA_FSMC - LCD_IO_WriteMultiple(Color, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); + LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); #else - //index = (LCD_FULL_PIXEL_HEIGHT) / 2 * (LCD_FULL_PIXEL_WIDTH); - for (index = 0; index < (LCD_FULL_PIXEL_HEIGHT) * (LCD_FULL_PIXEL_WIDTH); index++) + //index = (TFT_HEIGHT) / 2 * (TFT_WIDTH); + for (index = 0; index < (TFT_HEIGHT) * (TFT_WIDTH); index++) LCD_IO_WriteData(Color); #endif - //LCD_IO_WriteMultiple(Color, (LCD_FULL_PIXEL_WIDTH) * (LCD_FULL_PIXEL_HEIGHT)); + //LCD_IO_WriteMultiple(Color, (TFT_WIDTH) * (TFT_HEIGHT)); //while(index --) LCD_IO_WriteData(Color); } else if (DeviceCode == 0x5761) { @@ -378,7 +378,7 @@ void init_tft() { for (i = 0; i < 65535; i++); LCD_IO_WriteReg(0x0029); - ili9320_SetWindows(0, 0, LCD_FULL_PIXEL_WIDTH, LCD_FULL_PIXEL_HEIGHT); + ili9320_SetWindows(0, 0, TFT_WIDTH, TFT_HEIGHT); LCD_Clear(0x0000); OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); @@ -522,8 +522,8 @@ static bool get_point(int16_t *x, int16_t *y) { } #if ENABLED(GRAPHICAL_TFT_ROTATE_180) - x = (LCD_FULL_PIXEL_WIDTH) - x; - y = (LCD_FULL_PIXEL_HEIGHT) - y; + x = (TFT_WIDTH) - x; + y = (TFT_HEIGHT) - y; #endif return is_touched; diff --git a/Marlin/src/lcd/scaled_tft.h b/Marlin/src/lcd/scaled_tft.h index f22bdf696ad9..be846f70a9dd 100644 --- a/Marlin/src/lcd/scaled_tft.h +++ b/Marlin/src/lcd/scaled_tft.h @@ -23,28 +23,28 @@ #include "../inc/MarlinConfig.h" -#ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 2 +#ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 2 #endif -#ifndef LCD_FULL_PIXEL_WIDTH - #if FSMC_UPSCALE == 3 - #define LCD_FULL_PIXEL_WIDTH 480 +#ifndef TFT_WIDTH + #if GRAPHICAL_TFT_UPSCALE == 3 + #define TFT_WIDTH 480 #else - #define LCD_FULL_PIXEL_WIDTH 320 + #define TFT_WIDTH 320 #endif #endif -#ifndef LCD_FULL_PIXEL_HEIGHT - #if FSMC_UPSCALE == 3 - #define LCD_FULL_PIXEL_HEIGHT 320 +#ifndef TFT_HEIGHT + #if GRAPHICAL_TFT_UPSCALE == 3 + #define TFT_HEIGHT 320 #else - #define LCD_FULL_PIXEL_HEIGHT 240 + #define TFT_HEIGHT 240 #endif #endif -#ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 48 +#ifndef TFT_PIXEL_OFFSET_X + #define TFT_PIXEL_OFFSET_X 48 #endif -#ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 48 +#ifndef TFT_PIXEL_OFFSET_Y + #define TFT_PIXEL_OFFSET_Y 48 #endif diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp new file mode 100644 index 000000000000..8eae73df1194 --- /dev/null +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -0,0 +1,112 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_TOUCH_XPT2046 + +#include "touch_buttons.h" +#include "../scaled_tft.h" + +#include HAL_PATH(../../HAL, tft/xpt2046.h) +XPT2046 touchIO; + +#include "../../lcd/ultralcd.h" // For EN_C bit mask + +/** + * Draw and Touch processing + * + * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. + * TOUCH_SENSOR_WIDTH/HEIGHT (320x240) is the Touch Area resolution. + * TFT_WIDTH/HEIGHT (320x240 or 480x320) is the Actual (FSMC) Display resolution. + * + * - All native (u8g) drawing is done in LCD_PIXEL_* (128x64) + * - The DOGM pixels are is upscaled 2-3x (as needed) for display. + * - Touch coordinates use TOUCH_SENSOR_* resolution and are converted to + * click and scroll-wheel events (emulating of a common DOGM display). + * + * TOUCH_SCREEN resolution exists to fit our calibration values. The original touch code was made + * and originally calibrated for 320x240. If you decide to change the resolution of the touch code, + * new calibration values will be needed. + * + * The Marlin menus are drawn scaled in the upper region of the screen. The bottom region (in a + * fixed location in TOUCH_SCREEN* coordinate space) is used for 4 general-purpose buttons to + * navigate and select menu items. Both regions are touchable. + * + * The Marlin screen touchable area starts at TFT_PIXEL_OFFSET_X/Y (translated to SCREEN_PCT_LEFT/TOP) + * and spans LCD_PIXEL_WIDTH/HEIGHT (scaled to SCREEN_PCT_WIDTH/HEIGHT). + */ + +// Touch sensor resolution independent of display resolution +#define TOUCH_SENSOR_WIDTH 320 +#define TOUCH_SENSOR_HEIGHT 240 + +#define SCREEN_PCT_WIDE(X) ((X) * (TOUCH_SENSOR_WIDTH) / (TFT_WIDTH)) +#define SCREEN_PCT_HIGH(Y) ((Y) * (TOUCH_SENSOR_HEIGHT) / (TFT_HEIGHT)) + +#define SCREEN_PCT_LEFT SCREEN_PCT_WIDE(TFT_PIXEL_OFFSET_X) +#define SCREEN_PCT_TOP SCREEN_PCT_HIGH(TFT_PIXEL_OFFSET_Y) +#define SCREEN_PCT_WIDTH SCREEN_PCT_WIDE((GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_WIDTH)) +#define SCREEN_PCT_HEIGHT SCREEN_PCT_HIGH((GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_HEIGHT)) + +// Coordinates in terms of 240-unit-tall touch area +#define BUTTON_AREA_TOP 175 +#define BUTTON_AREA_BOT 234 + +TouchButtons touch; + +void TouchButtons::init() { touchIO.Init(); } + +uint8_t TouchButtons::read_buttons() { + #ifdef HAS_SPI_LCD + int16_t x, y; + + if (!touchIO.getRawPoint(&x, &y)) return 0; + + x = uint16_t((uint32_t(x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; + y = uint16_t((uint32_t(y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; + + #if ENABLED(GRAPHICAL_TFT_ROTATE_180) + x = TOUCH_SENSOR_WIDTH - x; + y = TOUCH_SENSOR_HEIGHT - y; + #endif + + // Touch within the button area simulates an encoder button + if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) + return WITHIN(x, 14, 77) ? EN_D + : WITHIN(x, 90, 153) ? EN_A + : WITHIN(x, 166, 229) ? EN_B + : WITHIN(x, 242, 305) ? EN_C + : 0; + + if ( !WITHIN(x, SCREEN_PCT_LEFT, SCREEN_PCT_LEFT + SCREEN_PCT_WIDTH) + || !WITHIN(y, SCREEN_PCT_TOP, SCREEN_PCT_TOP + SCREEN_PCT_HEIGHT) + ) return 0; + + // Column and row above BUTTON_AREA_TOP + int8_t col = (x - (SCREEN_PCT_LEFT)) * (LCD_WIDTH) / (SCREEN_PCT_WIDTH), + row = (y - (SCREEN_PCT_TOP)) * (LCD_HEIGHT) / (SCREEN_PCT_HEIGHT); + + // Send the touch to the UI (which will simulate the encoder wheel) + MarlinUI::screen_click(row, col, x, y); + #endif + return 0; +} + +#endif // HAS_TOUCH_XPT2046 diff --git a/Marlin/src/lcd/touch/xpt2046.h b/Marlin/src/lcd/touch/touch_buttons.h similarity index 56% rename from Marlin/src/lcd/touch/xpt2046.h rename to Marlin/src/lcd/touch/touch_buttons.h index 467317901b2b..451e5a5a37ca 100644 --- a/Marlin/src/lcd/touch/xpt2046.h +++ b/Marlin/src/lcd/touch/touch_buttons.h @@ -20,30 +20,10 @@ #include -// Relies on XPT2046-compatible mode of ADS7843, -// hence no Z1 / Z2 measurements are possible. - -#define XPT2046_DFR_MODE 0x00 -#define XPT2046_SER_MODE 0x04 -#define XPT2046_CONTROL 0x80 - -enum XPTCoordinate : uint8_t { - XPT2046_X = 0x10, - XPT2046_Y = 0x50, - XPT2046_Z1 = 0x30, - XPT2046_Z2 = 0x40 -}; - -class XPT2046 { +class TouchButtons { public: static void init(); static uint8_t read_buttons(); - bool getTouchPoint(uint16_t &x, uint16_t &y); - static bool isTouched(); - inline void waitForRelease() { while (isTouched()) { /* nada */ } } - inline void waitForTouch(uint16_t &x, uint16_t &y) { while (!getTouchPoint(x, y)) { /* nada */ } } -private: - static uint16_t getInTouch(const XPTCoordinate coordinate); }; -extern XPT2046 touch; +extern TouchButtons touch; diff --git a/Marlin/src/lcd/touch/xpt2046.cpp b/Marlin/src/lcd/touch/xpt2046.cpp deleted file mode 100644 index 4407d945d351..000000000000 --- a/Marlin/src/lcd/touch/xpt2046.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_TOUCH_XPT2046 - -#include "xpt2046.h" -#include "../scaled_tft.h" - -#ifndef XPT2046_Z1_THRESHOLD - #define XPT2046_Z1_THRESHOLD 10 -#endif - -/** - * Draw and Touch processing - * - * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. - * TOUCH_SENSOR_WIDTH/HEIGHT (320x240) is the Touch Area resolution. - * LCD_FULL_PIXEL_WIDTH/HEIGHT (320x240 or 480x320) is the Actual (FSMC) Display resolution. - * - * - All native (u8g) drawing is done in LCD_PIXEL_* (128x64) - * - The DOGM pixels are is upscaled 2-3x (as needed) for display. - * - Touch coordinates use TOUCH_SENSOR_* resolution and are converted to - * click and scroll-wheel events (emulating of a common DOGM display). - * - * TOUCH_SCREEN resolution exists to fit our calibration values. The original touch code was made - * and originally calibrated for 320x240. If you decide to change the resolution of the touch code, - * new calibration values will be needed. - * - * The Marlin menus are drawn scaled in the upper region of the screen. The bottom region (in a - * fixed location in TOUCH_SCREEN* coordinate space) is used for 4 general-purpose buttons to - * navigate and select menu items. Both regions are touchable. - * - * The Marlin screen touchable area starts at LCD_PIXEL_OFFSET_X/Y (translated to SCREEN_START_LEFT/TOP) - * and spans LCD_PIXEL_WIDTH/HEIGHT (scaled to SCREEN_WIDTH/HEIGHT). - */ - -// Coordinates in terms of touch area -#define BUTTON_AREA_TOP 175 -#define BUTTON_AREA_BOT 234 - -// Touch sensor resolution independent of display resolution -#define TOUCH_SENSOR_WIDTH 320 -#define TOUCH_SENSOR_HEIGHT 240 - -#define SCREEN_WIDTH_PCT(X) ((X) * (TOUCH_SENSOR_WIDTH) / (LCD_FULL_PIXEL_WIDTH)) -#define SCREEN_HEIGHT_PCT(Y) ((Y) * (TOUCH_SENSOR_HEIGHT) / (LCD_FULL_PIXEL_HEIGHT)) - -#define SCREEN_START_LEFT SCREEN_WIDTH_PCT(LCD_PIXEL_OFFSET_X) -#define SCREEN_START_TOP SCREEN_HEIGHT_PCT(LCD_PIXEL_OFFSET_Y) -#define SCREEN_WIDTH SCREEN_WIDTH_PCT((LCD_PIXEL_WIDTH) * (FSMC_UPSCALE)) -#define SCREEN_HEIGHT SCREEN_HEIGHT_PCT((LCD_PIXEL_HEIGHT) * (FSMC_UPSCALE)) - -#define TOUCHABLE_X_WIDTH SCREEN_WIDTH -#define TOUCHABLE_Y_HEIGHT SCREEN_HEIGHT - -#ifndef TOUCH_INT_PIN - #define TOUCH_INT_PIN -1 -#endif -#ifndef TOUCH_MISO_PIN - #define TOUCH_MISO_PIN MISO_PIN -#endif -#ifndef TOUCH_MOSI_PIN - #define TOUCH_MOSI_PIN MOSI_PIN -#endif -#ifndef TOUCH_SCK_PIN - #define TOUCH_SCK_PIN SCK_PIN -#endif -#ifndef TOUCH_CS_PIN - #define TOUCH_CS_PIN CS_PIN -#endif - -XPT2046 touch; - -void XPT2046::init() { - SET_INPUT(TOUCH_MISO_PIN); - SET_OUTPUT(TOUCH_MOSI_PIN); - SET_OUTPUT(TOUCH_SCK_PIN); - OUT_WRITE(TOUCH_CS_PIN, HIGH); - - #if PIN_EXISTS(TOUCH_INT) - // Optional Pendrive interrupt pin - SET_INPUT(TOUCH_INT_PIN); - #endif - - // Read once to enable pendrive status pin - getInTouch(XPT2046_X); -} - -#include "../../lcd/ultralcd.h" // For EN_C bit mask - -uint8_t XPT2046::read_buttons() { - #ifdef HAS_SPI_LCD - int16_t tsoffsets[4] = { 0 }; - - if (tsoffsets[0] + tsoffsets[1] == 0) { - // Not yet set, so use defines as fallback... - tsoffsets[0] = XPT2046_X_CALIBRATION; - tsoffsets[1] = XPT2046_X_OFFSET; - tsoffsets[2] = XPT2046_Y_CALIBRATION; - tsoffsets[3] = XPT2046_Y_OFFSET; - } - - // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible. - - if (!isTouched()) return 0; - uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1], - y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3]; - if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read. - - #if ENABLED(GRAPHICAL_TFT_ROTATE_180) - x = TOUCH_SENSOR_WIDTH - x; - y = TOUCH_SENSOR_HEIGHT - y; - #endif - - // Touch within the button area simulates an encoder button - if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) - return WITHIN(x, 14, 77) ? EN_D - : WITHIN(x, 90, 153) ? EN_A - : WITHIN(x, 166, 229) ? EN_B - : WITHIN(x, 242, 305) ? EN_C - : 0; - - if ( !WITHIN(x, SCREEN_START_LEFT, SCREEN_START_LEFT + SCREEN_WIDTH) - || !WITHIN(y, SCREEN_START_TOP, SCREEN_START_TOP + SCREEN_HEIGHT) - ) return 0; - - // Column and row above BUTTON_AREA_TOP - int8_t col = (x - (SCREEN_START_LEFT)) * (LCD_WIDTH) / (TOUCHABLE_X_WIDTH), - row = (y - (SCREEN_START_TOP)) * (LCD_HEIGHT) / (TOUCHABLE_Y_HEIGHT); - - // Send the touch to the UI (which will simulate the encoder wheel) - MarlinUI::screen_click(row, col, x, y); - #endif - return 0; -} - -bool XPT2046::isTouched() { - return ( - #if PIN_EXISTS(TOUCH_INT) - READ(TOUCH_INT_PIN) != HIGH - #else - getInTouch(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD - #endif - ); -} - -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - - #include - - static void touch_spi_init(uint8_t spiRate) { - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - } -#endif // TOUCH_BUTTONS_HW_SPI - -uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) { - uint16_t data[3]; - const uint8_t coord = uint8_t(coordinate) | XPT2046_CONTROL | XPT2046_DFR_MODE; - - #if ENABLED(TOUCH_BUTTONS_HW_SPI) - - touch_spi_init(SPI_SPEED_6); - for (uint16_t i = 0; i < 3; i++) { - OUT_WRITE(TOUCH_CS_PIN, LOW); - SPI.transfer(coord); - data[i] = (((SPI.transfer(0xFF) << 8) | SPI.transfer(0xFF)) >> 3) & 0x0FFF; - WRITE(TOUCH_CS_PIN, HIGH); - } - - #else // !TOUCH_BUTTONS_HW_SPI - - OUT_WRITE(TOUCH_CS_PIN, LOW); - for (uint16_t i = 0; i < 3; i++) { - for (uint8_t j = 0x80; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - WRITE(TOUCH_MOSI_PIN, bool(coord & j)); - WRITE(TOUCH_SCK_PIN, HIGH); - } - - data[i] = 0; - for (uint16_t j = 0x8000; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - if (READ(TOUCH_MISO_PIN)) data[i] |= j; - WRITE(TOUCH_SCK_PIN, HIGH); - } - WRITE(TOUCH_SCK_PIN, LOW); - data[i] >>= 4; - } - WRITE(TOUCH_CS_PIN, HIGH); - - #endif // !TOUCH_BUTTONS_HW_SPI - - uint16_t delta01 = _MAX(data[0], data[1]) - _MIN(data[0], data[1]), - delta02 = _MAX(data[0], data[2]) - _MIN(data[0], data[2]), - delta12 = _MAX(data[1], data[2]) - _MIN(data[1], data[2]); - - if (delta01 <= delta02 && delta01 <= delta12) - return (data[0] + data[1]) >> 1; - - if (delta02 <= delta12) - return (data[0] + data[2]) >> 1; - - return (data[1] + data[2]) >> 1; -} - -bool XPT2046::getTouchPoint(uint16_t &x, uint16_t &y) { - if (isTouched()) { - x = getInTouch(XPT2046_X); - y = getInTouch(XPT2046_Y); - } - return isTouched(); -} - -#endif // HAS_TOUCH_XPT2046 diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 6fa3006fb71f..f30d9c68cff7 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -150,7 +150,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; volatile uint8_t MarlinUI::slow_buttons; #endif #if HAS_TOUCH_XPT2046 - #include "touch/xpt2046.h" + #include "touch/touch_buttons.h" bool MarlinUI::on_edit_screen = false; #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index e4f0014417b1..5267888f441d 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -44,7 +44,7 @@ #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif // @@ -104,49 +104,6 @@ //#define POWER_LOSS_PIN -1 #define FIL_RUNOUT_PIN PA15 -// -// TronXY TFT Support -// -//#define FSMC_GRAPHICAL_TFT -//#define HAS_TOUCH_XPT2046 1 - -#if ENABLED(FSMC_GRAPHICAL_TFT) - #define FSMC_UPSCALE 3 - - #define LCD_RESET_PIN PF11 - #define LCD_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens - #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif - - #endif -#endif - // SPI Flash #define SPI_FLASH_SIZE 0x200000 // 2MB #define HAS_SPI_FLASH 1 @@ -157,28 +114,18 @@ #define W25QXX_MISO_PIN PB14 #define W25QXX_SCK_PIN PB13 -#if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 1 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 1 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 +// +// TronXY TFT Support +// + +#if HAS_FSMC_TFT + + // Shared FSMC #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - //#define TOUCH_INT_PIN PB6 - - #if ENABLED(TFT_LVGL_UI_SPI) - #define SPI_TFT_CS_PIN TOUCH_CS_PIN - #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN - #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN - #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN - #define SPI_TFT_DC_PIN PB6 - #define SPI_TFT_RST_PIN PF11 - #endif #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -191,12 +138,23 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_PIXEL_WIDTH 480 - #define LCD_PIXEL_HEIGHT 320 - #define LCD_FULL_PIXEL_WIDTH LCD_PIXEL_WIDTH - #define LCD_FULL_PIXEL_HEIGHT LCD_PIXEL_HEIGHT - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_PIXEL_OFFSET_Y 48 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_PIXEL_OFFSET_X 48 + #define TFT_PIXEL_OFFSET_Y 32 + +#endif + +#if HAS_TFT_LVGL_UI + + // LVGL + + #define HAS_SPI_FLASH_FONT 1 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 1 + #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 #define XPT2046_X_CALIBRATION -17181 #define XPT2046_Y_CALIBRATION 11434 @@ -204,31 +162,38 @@ #define XPT2046_Y_OFFSET -9 #elif ENABLED(TFT_480x320) - #define TFT_RESET_PIN PF11 - #define TFT_BACKLIGHT_PIN PD13 - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 + // Color UI + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #define XPT2046_X_CALIBRATION -17181 #define XPT2046_Y_CALIBRATION 11434 #define XPT2046_X_OFFSET 501 #define XPT2046_Y_OFFSET -9 - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI +#elif ENABLED(FSMC_GRAPHICAL_TFT) - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 + // Emulated DOGM + + #define GRAPHICAL_TFT_UPSCALE 3 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available -// We nee to use the SPI2 +// Needs to use SPI2 #define ENABLE_SPI2 #define SCK_PIN PB13 #define MISO_PIN PB14 @@ -240,5 +205,5 @@ // #define SDIO_SUPPORT #define SD_DETECT_PIN -1 // PF0, but it isn't connected -#define SDIO_CLOCK 4500000 -#define SDIO_READ_RETRIES 16 +#define SDIO_CLOCK 4500000 +#define SDIO_READ_RETRIES 16 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 3d36de82424f..d128d4e1ae00 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -48,7 +48,7 @@ #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif // @@ -96,7 +96,7 @@ // #define HEATER_0_PIN PG12 // HEATER1 #define HEATER_BED_PIN PG11 // HOT BED -//#define HEATER_BED_INVERTING true +//#define HEATER_BED_INVERTING true // // Fans @@ -119,71 +119,9 @@ #define FIL_RUNOUT2_PIN PF13 #endif -// -// TronXY TFT Support -// -#if ENABLED(FSMC_GRAPHICAL_TFT) - #define FSMC_UPSCALE 3 - - #define LCD_RESET_PIN PF11 - #define LCD_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens - #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif - #endif - -#elif ENABLED(TFT_480x320) - #define TFT_RESET_PIN PF11 - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define XPT2046_X_CALIBRATION -17181 - #define XPT2046_Y_CALIBRATION 11434 - #define XPT2046_X_OFFSET 501 - #define XPT2046_Y_OFFSET -9 - - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 -#endif - // SPI Flash -#define SPI_FLASH_SIZE 0x200000 // 2MB -#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x200000 // 2MB +#define HAS_SPI_FLASH 1 // SPI 2 #define W25QXX_CS_PIN PB12 @@ -191,28 +129,16 @@ #define W25QXX_MISO_PIN PB14 #define W25QXX_SCK_PIN PB13 -#if HAS_TFT_LVGL_UI - #define HAS_SPI_FLASH_FONT 0 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 0 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 +// +// TronXY TFT Support +// +// Shared FSMC Configs +#if HAS_FSMC_TFT #define TOUCH_CS_PIN PB7 // SPI1_NSS #define TOUCH_SCK_PIN PA5 // SPI1_SCK #define TOUCH_MISO_PIN PA6 // SPI1_MISO #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - //#define TOUCH_INT_PIN PB6 - - #if ENABLED(TFT_LVGL_UI_SPI) - #define SPI_TFT_CS_PIN TOUCH_CS_PIN - #define SPI_TFT_SCK_PIN TOUCH_SCK_PIN - #define SPI_TFT_MISO_PIN TOUCH_MISO_PIN - #define SPI_TFT_MOSI_PIN TOUCH_MOSI_PIN - #define SPI_TFT_DC_PIN PB6 - #define SPI_TFT_RST_PIN PF11 - #endif #define LCD_RESET_PIN PF11 #define LCD_BACKLIGHT_PIN PD13 @@ -225,17 +151,56 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define LCD_PIXEL_WIDTH 480 - #define LCD_PIXEL_HEIGHT 320 - #define LCD_FULL_PIXEL_WIDTH LCD_PIXEL_WIDTH - #define LCD_FULL_PIXEL_HEIGHT LCD_PIXEL_HEIGHT - #define LCD_PIXEL_OFFSET_X 48 - #define LCD_PIXEL_OFFSET_Y 48 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_PIXEL_OFFSET_X 48 + #define TFT_PIXEL_OFFSET_Y 32 + +#endif + +// LVGL Configs +#if HAS_TFT_LVGL_UI + + #define HAS_SPI_FLASH_FONT 1 + #define HAS_GCODE_PREVIEW 1 + #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 + #define HAS_LANG_SELECT_SCREEN 1 + #define HAS_BAK_VIEW_IN_FLASH 0 + #define HAS_LOGO_IN_FLASH 0 #define XPT2046_X_CALIBRATION -17181 #define XPT2046_Y_CALIBRATION 11434 #define XPT2046_X_OFFSET 501 #define XPT2046_Y_OFFSET -9 + +// Color UI Configs +#elif ENABLED(TFT_480x320) + + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 + + #define XPT2046_X_CALIBRATION -17181 + #define XPT2046_Y_CALIBRATION 11434 + #define XPT2046_X_OFFSET 501 + #define XPT2046_Y_OFFSET -9 + +// Emulated DOGM +#elif ENABLED(FSMC_GRAPHICAL_TFT) + #define GRAPHICAL_TFT_UPSCALE 3 + + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12316 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8981 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 340 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -20 + #endif + #endif // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available @@ -251,5 +216,5 @@ // #define SDIO_SUPPORT #define SD_DETECT_PIN -1 // PF0, but it isn't connected -#define SDIO_CLOCK 4500000 -#define SDIO_READ_RETRIES 16 +#define SDIO_CLOCK 4500000 +#define SDIO_READ_RETRIES 16 diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 490fb617d17d..32e7e2993c75 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -86,8 +86,8 @@ #define FAN_PIN PA15 // pin 77 (4cm Fan) #define FAN_SOFT_PWM // Required to avoid issues with heating or STLink -#define FAN_MIN_PWM 35 // Fan will not start in 1-30 range -#define FAN_MAX_PWM 255 +#define FAN_MIN_PWM 35 // Fan will not start in 1-30 range +#define FAN_MAX_PWM 255 //#define BEEPER_PIN PD13 // pin 60 (Servo PWM output 5V/GND on Board V0G+) made for BL-Touch sensor // Can drive a PC Buzzer, if connected between PWM and 5V pins @@ -130,11 +130,11 @@ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 -#define FSMC_UPSCALE 2 -#define LCD_FULL_PIXEL_WIDTH 320 -#define LCD_FULL_PIXEL_HEIGHT 240 -#define LCD_PIXEL_OFFSET_X 32 -#define LCD_PIXEL_OFFSET_Y 32 +#define GRAPHICAL_TFT_UPSCALE 2 +#define TFT_WIDTH 320 +#define TFT_HEIGHT 240 +#define TFT_PIXEL_OFFSET_X 32 +#define TFT_PIXEL_OFFSET_Y 32 /** * Note: Alfawise U20/U30 boards DON'T use SPI2, as the hardware designer @@ -160,12 +160,12 @@ #if ENABLED(SPI_EEPROM) // SPI1 EEPROM Winbond W25Q64 (8MB/64Mbits) - #define SPI_CHAN_EEPROM1 1 + #define SPI_CHAN_EEPROM1 1 #define SPI_EEPROM1_CS PC5 // pin 34 #define EEPROM_SCK BOARD_SPI1_SCK_PIN // PA5 pin 30 #define EEPROM_MISO BOARD_SPI1_MISO_PIN // PA6 pin 31 #define EEPROM_MOSI BOARD_SPI1_MOSI_PIN // PA7 pin 32 - #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) + #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64KB for now... #elif ENABLED(FLASH_EEPROM_EMULATION) // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) @@ -173,5 +173,5 @@ #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE (EEPROM_PAGE_SIZE) #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 948663f6f059..6a015a470977 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -127,10 +127,10 @@ #define PS_ON_PIN PA3 // PW_OFF //#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define SUICIDE_PIN_INVERTING false +//#define SUICIDE_PIN_INVERTING false //#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY +//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY #define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY @@ -138,7 +138,7 @@ #define MT_DET_1_PIN PA4 #define MT_DET_2_PIN PE6 -#define MT_DET_PIN_INVERTING false +#define MT_DET_PIN_INVERTING false #define WIFI_IO0_PIN PC13 @@ -150,7 +150,7 @@ #endif #define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SDIO_CLOCK 4500000 // 4.5 MHz #define SD_DETECT_PIN PD12 #define ONBOARD_SD_CS_PIN PC11 @@ -165,8 +165,8 @@ * to let the bootloader init the screen. */ -#if ENABLED(TFT_LVGL_UI_FSMC) - +// Shared FSMC Configs +#if HAS_FSMC_TFT #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 @@ -175,12 +175,11 @@ #define TOUCH_MISO_PIN PB14 // SPI2_MISO #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 - #define XPT2046_X_CALIBRATION 17880 - #define XPT2046_Y_CALIBRATION -12234 - #define XPT2046_X_OFFSET -45 - #define XPT2046_Y_OFFSET 349 + #define TFT_RESET_PIN PC6 // FSMC_RST + #define TFT_BACKLIGHT_PIN PD13 #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_CS_PIN PD7 @@ -188,71 +187,66 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 +#endif + +// LVGL Configs +#if ENABLED(TFT_LVGL_UI_FSMC) + + #define XPT2046_X_CALIBRATION 17880 + #define XPT2046_Y_CALIBRATION -12234 + #define XPT2046_X_OFFSET -45 + #define XPT2046_Y_OFFSET 349 + +// Emulated DOGM Configs #elif ENABLED(FSMC_GRAPHICAL_TFT) #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h #define DOGLCD_SCK -1 - #ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 3 + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 #endif - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 + #ifndef TFT_WIDTH + #define TFT_WIDTH 480 #endif - #ifndef LCD_PIXEL_OFFSET_X - #define LCD_PIXEL_OFFSET_X 48 + #ifndef TFT_PIXEL_OFFSET_X + #define TFT_PIXEL_OFFSET_X 48 #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 + #ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 #endif - #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 + #ifndef TFT_PIXEL_OFFSET_Y + #define TFT_PIXEL_OFFSET_Y 32 #endif - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define LCD_RESET_PIN PC6 // FSMC_RST - #define LCD_BACKLIGHT_PIN PD13 - - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 12149 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -8746 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -35 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 256 #endif #elif ENABLED(TFT_480x320) - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - #define XPT2046_X_CALIBRATION 17880 #define XPT2046_Y_CALIBRATION -12234 #define XPT2046_X_OFFSET -45 #define XPT2046_Y_OFFSET 349 - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV #endif -#define HAS_SPI_FLASH 1 -#define SPI_FLASH_SIZE 0x1000000 // 16MB +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index feac729c73b2..0f9e6eb371b7 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -29,6 +29,8 @@ #error "Oops! Select an STM32F1 board in 'Tools > Board.'" #elif HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." +#elif HAS_FSMC_TFT + #error "MKS Robin nano v2 doesn't support FSMC-based TFT displays." #endif #define BOARD_INFO_NAME "MKS Robin nano V2.0" @@ -47,13 +49,13 @@ #if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM // EEPROM on I2C-0 - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // // Note: MKS Robin board is using SPI2 interface. // -//#define SPI_MODULE 2 +//#define SPI_MODULE 2 #define ENABLE_SPI2 // @@ -162,7 +164,7 @@ #define E1_SERIAL_RX_PIN PD8 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // TMC2208 || TMC2209 // @@ -194,10 +196,10 @@ #define PS_ON_PIN PA3 // PW_OFF //#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define SUICIDE_PIN_INVERTING false +//#define SUICIDE_PIN_INVERTING false //#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY -//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY +//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY #define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY @@ -205,7 +207,7 @@ #define MT_DET_1_PIN PA4 #define MT_DET_2_PIN PE6 -#define MT_DET_PIN_INVERTING false +#define MT_DET_PIN_INVERTING false #ifndef FIL_RUNOUT_PIN #define FIL_RUNOUT_PIN MT_DET_1_PIN @@ -224,7 +226,7 @@ #endif #define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz +#define SDIO_CLOCK 4500000 // 4.5 MHz #define SD_DETECT_PIN PD12 #define ONBOARD_SD_CS_PIN PC11 @@ -241,14 +243,9 @@ * to let the bootloader init the screen. */ -#if ENABLED(TFT_LVGL_UI_SPI) +#if HAS_SPI_TFT - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 + // Shared SPI TFT #define LCD_BACKLIGHT_PIN PD13 @@ -261,132 +258,102 @@ #define BTN_EN2 PE11 #define BTN_ENC PE13 - #define TFT_CS_PIN PD11 - #define TFT_SCK_PIN PA5 - #define TFT_MISO_PIN PA6 - #define TFT_MOSI_PIN PA7 - #define TFT_DC_PIN PD10 - #define TFT_RST_PIN PC6 - #define TFT_A0_PIN TFT_DC_PIN - - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 - - #define XPT2046_X_CALIBRATION -17253 - #define XPT2046_Y_CALIBRATION 11579 - #define XPT2046_X_OFFSET 514 - #define XPT2046_Y_OFFSET -24 + #define TFT_CS_PIN PD11 + #define TFT_SCK_PIN PA5 + #define TFT_MISO_PIN PA6 + #define TFT_MOSI_PIN PA7 + #define TFT_DC_PIN PD10 + #define TFT_RST_PIN PC6 + #define TFT_A0_PIN TFT_DC_PIN + + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - #ifndef LCD_FULL_PIXEL_WIDTH - #define LCD_FULL_PIXEL_WIDTH 480 + #ifndef TFT_WIDTH + #define TFT_WIDTH 480 #endif - #ifndef LCD_FULL_PIXEL_HEIGHT - #define LCD_FULL_PIXEL_HEIGHT 320 + #ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 #endif -#endif + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI -#if HAS_SPI_LCD - - #if ENABLED(SPI_GRAPHICAL_TFT) // Emulated DOGM SPI - #define SPI_TFT_CS_PIN PD11 - #define SPI_TFT_SCK_PIN PA5 - #define SPI_TFT_MISO_PIN PA6 - #define SPI_TFT_MOSI_PIN PA7 - #define SPI_TFT_DC_PIN PD10 - #define SPI_TFT_RST_PIN PC6 - - #define LCD_BACKLIGHT_PIN PD13 - - #define LCD_READ_ID 0xD3 - #define LCD_USE_DMA_SPI - - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - - //#define TOUCH_SCREEN - #if EITHER(TOUCH_SCREEN, NEED_TOUCH_PINS) - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -5481 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 4000 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 343 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 0 - #endif - #endif +#endif - #ifndef FSMC_UPSCALE - #define FSMC_UPSCALE 3 - #endif - #ifndef LCD_PIXEL_OFFSET_Y - #define LCD_PIXEL_OFFSET_Y 32 - #endif +#if ENABLED(TFT_LVGL_UI_SPI) - #define BTN_ENC PE13 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 + // LVGL - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 + #define XPT2046_X_CALIBRATION -17253 + #define XPT2046_Y_CALIBRATION 11579 + #define XPT2046_X_OFFSET 514 + #define XPT2046_Y_OFFSET -24 - #elif ENABLED(MKS_MINI_12864) +#elif ENABLED(SPI_GRAPHICAL_TFT) - // MKS MINI12864 and MKS LCD12864B - // If using MKS LCD12864A (Need to remove RPK2 resistor) + // Emulated DOGM SPI - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PD11 - #define DOGLCD_CS PE15 - #define DOGLCD_SCK PA5 - #define DOGLCD_MOSI PA7 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11386 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8684 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 339 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -18 + #endif - // Required for MKS_MINI_12864 with this board - #define MKS_LCD12864B - #undef SHOW_BOOTSCREEN + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 + #endif + #ifndef TFT_PIXEL_OFFSET_Y + #define TFT_PIXEL_OFFSET_Y 32 + #endif - #elif ENABLED(TFT_480x320_SPI) - #define TFT_CS_PIN PD11 - #define TFT_SCK_PIN PA5 - #define TFT_MISO_PIN PA6 - #define TFT_MOSI_PIN PA7 - #define TFT_DC_PIN PD10 - #define TFT_RST_PIN PC6 - #define TFT_A0_PIN TFT_DC_PIN + #define BTN_ENC PE13 + #define BTN_EN1 PE8 + #define BTN_EN2 PE11 - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 + #define LCD_PINS_ENABLE PD13 + #define LCD_PINS_RS PC6 +#elif ENABLED(TFT_480x320_SPI) #define XPT2046_X_CALIBRATION -17253 #define XPT2046_Y_CALIBRATION 11579 #define XPT2046_X_OFFSET 514 #define XPT2046_Y_OFFSET -24 - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - #define TFT_DRIVER ST7796 #define TFT_BUFFER_SIZE 14400 - #define LCD_READ_ID 0xD3 - #define LCD_USE_DMA_SPI +#endif + +#if HAS_SPI_LCD && !HAS_SPI_TFT + + // NON TFT Displays - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + #if ENABLED(MKS_MINI_12864) + + // MKS MINI12864 and MKS LCD12864B + // If using MKS LCD12864A (Need to remove RPK2 resistor) + + #define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN -1 + #define DOGLCD_A0 PD11 + #define DOGLCD_CS PE15 + #define DOGLCD_SCK PA5 + #define DOGLCD_MOSI PA7 + + // Required for MKS_MINI_12864 with this board + #define MKS_LCD12864B + #undef SHOW_BOOTSCREEN #else // !MKS_MINI_12864 @@ -409,10 +376,10 @@ #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD +#endif // HAS_SPI_LCD && !HAS_SPI_TFT -#define HAS_SPI_FLASH 1 -#define SPI_FLASH_SIZE 0x1000000 // 16MB +#define HAS_SPI_FLASH 1 +#define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 #define W25QXX_MOSI_PIN PB15 diff --git a/buildroot/share/scripts/pinsformat.js b/buildroot/share/scripts/pinsformat.js index 3e2a57b556dc..a82c2f2659f0 100755 --- a/buildroot/share/scripts/pinsformat.js +++ b/buildroot/share/scripts/pinsformat.js @@ -38,10 +38,12 @@ for (let m of mpatt) mexpr.push(new RegExp('^' + m + '$')); const argv = process.argv.slice(2), argc = argv.length; -var src_file = 0, src_name = 'STDIN', dst_file; +var src_file = 0, src_name = 'STDIN', dst_file, do_log = false; if (argc > 0) { - src_file = src_name = argv[0]; - dst_file = argv[argc > 1 ? 1 : 0]; + let ind = 0; + if (argv[0] == '-v') { do_log = true; ind++; } + dst_file = src_file = src_name = argv[ind++]; + if (ind < argc) dst_file = argv[ind]; } // Read from file or STDIN until it terminates @@ -81,7 +83,7 @@ function process_text(txt) { aliasPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([A-Z_][A-Z0-9_()]+)\\s*(//.*)?$'), switchPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'), undefPatt = new RegExp('^(\\s*(//)?#undef)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'), - defPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(\\w+)\\s*(//.*)?$'), + defPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([-_\\w]+)\\s*(//.*)?$'), condPatt = new RegExp('^(\\s*(//)?#(if|ifn?def|else|elif)(\\s+\\S+)*)\\s+(//.*)$'), commPatt = new RegExp('^\\s{20,}(//.*)?$'); const col_value_lj = col_comment - patt.pad - 2; @@ -98,6 +100,7 @@ function process_text(txt) { // // #define MY_PIN [pin] // + if (do_log) console.log("pin:", line); const pinnum = r[4].charAt(0) == 'P' ? r[4] : r[4].lpad(patt.pad); line = r[1] + ' ' + r[3]; line = line.rpad(col_value_lj) + pinnum; @@ -107,31 +110,57 @@ function process_text(txt) { // // #define MY_PIN -1 // + if (do_log) console.log("pin -1:", line); line = r[1] + ' ' + r[3]; line = line.rpad(col_value_lj) + '-1'; if (r[5]) line = line.rpad(col_comment) + r[5]; } else if ((r = skipPatt.exec(line)) !== null) { + // + // #define SKIP_ME + // + if (do_log) console.log("skip:", line); } else if ((r = aliasPatt.exec(line)) !== null) { + // + // #define ALIAS OTHER + // + if (do_log) console.log("alias:", line); line = r[1] + ' ' + r[3]; line += r[4].lpad(col_value_rj + 1 - line.length); if (r[5]) line = line.rpad(col_comment) + r[5]; } else if ((r = switchPatt.exec(line)) !== null) { + // + // #define SWITCH + // + if (do_log) console.log("switch:", line); line = r[1] + ' ' + r[3]; if (r[4]) line = line.rpad(col_comment) + r[4]; check_comment_next = true; } else if ((r = defPatt.exec(line)) !== null) { - line = r[1] + ' ' + r[3] + ' ' + r[4]; - if (r[5]) line = line.rpad(col_comment) + r[5]; + // + // #define ... + // + if (do_log) console.log("def:", line); + line = r[1] + ' ' + r[3] + ' '; + line += r[4].lpad(col_value_rj + 1 - line.length); + if (r[5]) line = line.rpad(col_comment - 1) + ' ' + r[5]; } else if ((r = undefPatt.exec(line)) !== null) { + // + // #undef ... + // + if (do_log) console.log("undef:", line); line = r[1] + ' ' + r[3]; if (r[4]) line = line.rpad(col_comment) + r[4]; } else if ((r = condPatt.exec(line)) !== null) { + // + // #if ... + // + if (do_log) console.log("cond:", line); line = r[1].rpad(col_comment) + r[5]; check_comment_next = true; } From 45d22d4f0946ea3d7f9c97675bda63ae9ccf7801 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 22 Aug 2020 00:11:44 +0000 Subject: [PATCH 381/483] [cron] Bump distribution date (2020-08-22) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 9c750422719d..d5e0e2a820e4 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-21" + #define STRING_DISTRIBUTION_DATE "2020-08-22" #endif /** From bb8606ac2991f00ad3887c6b59c38a9d460e75b5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 20:26:16 -0500 Subject: [PATCH 382/483] Menu headers followup --- Marlin/src/lcd/menu/menu.h | 5 +++++ Marlin/src/lcd/tft/touch.cpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index c457eaf295dc..1dff9d94fc4b 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -196,6 +196,7 @@ void menu_move(); //////// Menu Item Helper Functions //////// //////////////////////////////////////////// +void lcd_move_z(); void _lcd_draw_homing(); #define HAS_LINE_TO_Z ANY(DELTA, PROBE_MANUALLY, MESH_BED_LEVELING, LEVEL_BED_CORNERS) @@ -230,3 +231,7 @@ void _lcd_draw_homing(); #endif #endif + +#if ENABLED(TOUCH_SCREEN_CALIBRATION) + void touch_screen_calibration(); +#endif diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 00c7439a5816..d2b860ab155f 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -24,7 +24,7 @@ #include "touch.h" #include "../ultralcd.h" // for ui methods -#include "../menu/menu.h" // for touch_screen_calibration +#include "../menu/menu_item.h" // for touch_screen_calibration #include "../../module/temperature.h" #include "../../module/planner.h" From 6b549e19719e855555c1a9db5e3c0453516afb28 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 22 Aug 2020 04:20:30 +0200 Subject: [PATCH 383/483] Optional homing in LCD Repeatability Test (#19104) --- Marlin/src/gcode/calibrate/M48.cpp | 175 +++++++++++++------------- Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/language/language_it.h | 1 + Marlin/src/lcd/menu/menu_motion.cpp | 2 +- 4 files changed, 93 insertions(+), 86 deletions(-) diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 47c72eece7f4..fc9d22957b1a 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -27,13 +27,10 @@ #include "../gcode.h" #include "../../module/motion.h" #include "../../module/probe.h" +#include "../../lcd/ultralcd.h" #include "../../feature/bedlevel/bedlevel.h" -#if HAS_SPI_LCD - #include "../../lcd/ultralcd.h" -#endif - #if HAS_LEVELING #include "../../module/planner.h" #endif @@ -77,61 +74,85 @@ void GcodeSuite::M48() { const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - xy_float_t next_pos = current_position; - - const xy_pos_t probe_pos = { - parser.linearval('X', next_pos.x + probe.offset_xy.x), // If no X use the probe's current X position - parser.linearval('Y', next_pos.y + probe.offset_xy.y) // If no Y, ditto + // Test at the current position by default, overridden by X and Y + const xy_pos_t test_position = { + parser.linearval('X', current_position.x + probe.offset_xy.x), // If no X use the probe's current X position + parser.linearval('Y', current_position.y + probe.offset_xy.y) // If no Y, ditto }; - if (!probe.can_reach(probe_pos)) { + if (!probe.can_reach(test_position)) { + ui.set_status_P(GET_TEXT(MSG_M48_OUT_OF_BOUNDS), 99); SERIAL_ECHOLNPGM("? (X,Y) out of bounds."); return; } + // Get the number of leg moves per test-point bool seen_L = parser.seen('L'); uint8_t n_legs = seen_L ? parser.value_byte() : 0; if (n_legs > 15) { - SERIAL_ECHOLNPGM("?Number of legs in movement not plausible (0-15)."); + SERIAL_ECHOLNPGM("?Legs of movement implausible (0-15)."); return; } if (n_legs == 1) n_legs = 2; + // Schizoid motion as an optional stress-test const bool schizoid_flag = parser.boolval('S'); if (schizoid_flag && !seen_L) n_legs = 7; - /** - * Now get everything to the specified probe point So we can safely do a - * probe to get us close to the bed. If the Z-Axis is far from the bed, - * we don't want to use that as a starting point for each probe. - */ if (verbose_level > 2) SERIAL_ECHOLNPGM("Positioning the probe..."); - // Disable bed level correction in M48 because we want the raw data when we probe + // Always disable Bed Level correction before probing... #if HAS_LEVELING const bool was_enabled = planner.leveling_active; set_bed_leveling_enabled(false); #endif + // Work with reasonable feedrates remember_feedrate_scaling_off(); - float mean = 0.0, sigma = 0.0, min = 99999.9, max = -99999.9, sample_set[n_samples]; + // Working variables + float mean = 0.0, // The average of all points so far, used to calculate deviation + sigma = 0.0, // Standard deviation of all points so far + min = 99999.9, // Smallest value sampled so far + max = -99999.9, // Largest value sampled so far + sample_set[n_samples]; // Storage for sampled values + + auto dev_report = [](const bool verbose, const float &mean, const float &sigma, const float &min, const float &max, const bool final=false) { + if (verbose) { + SERIAL_ECHOPAIR_F("Mean: ", mean, 6); + if (!final) SERIAL_ECHOPAIR_F(" Sigma: ", sigma, 6); + SERIAL_ECHOPAIR_F(" Min: ", min, 3); + SERIAL_ECHOPAIR_F(" Max: ", max, 3); + SERIAL_ECHOPAIR_F(" Range: ", max-min, 3); + if (final) SERIAL_EOL(); + } + if (final) { + SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); + SERIAL_EOL(); + } + }; // Move to the first point, deploy, and probe - const float t = probe.probe_at_point(probe_pos, raise_after, verbose_level); + const float t = probe.probe_at_point(test_position, raise_after, verbose_level); bool probing_good = !isnan(t); if (probing_good) { randomSeed(millis()); + float sample_sum = 0.0; + LOOP_L_N(n, n_samples) { #if HAS_SPI_LCD // Display M48 progress in the status bar ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); #endif + + // When there are "legs" of movement move around the point before probing if (n_legs) { + + // Pick a random direction, starting angle, and radius const int dir = (random(0, 10) > 5.0) ? -1 : 1; // clockwise or counter clockwise float angle = random(0, 360); const float radius = random( @@ -142,48 +163,51 @@ void GcodeSuite::M48() { int(5), int(0.125 * _MIN(X_BED_SIZE, Y_BED_SIZE)) #endif ); - if (verbose_level > 3) { SERIAL_ECHOPAIR("Start radius:", radius, " angle:", angle, " dir:"); if (dir > 0) SERIAL_CHAR('C'); SERIAL_ECHOLNPGM("CW"); } + // Move from leg to leg in rapid succession LOOP_L_N(l, n_legs - 1) { - float delta_angle; + // Move some distance around the perimeter + float delta_angle; if (schizoid_flag) { - // The points of a 5 point star are 72 degrees apart. We need to - // skip a point and go to the next one on the star. + // The points of a 5 point star are 72 degrees apart. + // Skip a point and go to the next one on the star. delta_angle = dir * 2.0 * 72.0; } else { - // If we do this line, we are just trying to move further - // around the circle. - delta_angle = dir * (float) random(25, 45); + // Just move further along the perimeter. + delta_angle = dir * (float)random(25, 45); } - angle += delta_angle; - while (angle > 360.0) angle -= 360.0; // We probably do not need to keep the angle between 0 and 2*PI, but the - // Arduino documentation says the trig functions should not be given values - while (angle < 0.0) angle += 360.0; // outside of this range. It looks like they behave correctly with - // numbers outside of the range, but just to be safe we clamp them. - const xy_pos_t noz_pos = probe_pos - probe.offset_xy; - next_pos.set(noz_pos.x + cos(RADIANS(angle)) * radius, - noz_pos.y + sin(RADIANS(angle)) * radius); + // Trig functions work without clamping, but just to be safe... + while (angle > 360.0) angle -= 360.0; + while (angle < 0.0) angle += 360.0; - #if DISABLED(DELTA) - LIMIT(next_pos.x, X_MIN_POS, X_MAX_POS); - LIMIT(next_pos.y, Y_MIN_POS, Y_MAX_POS); - #else - // If we have gone out too far, we can do a simple fix and scale the numbers - // back in closer to the origin. + // Choose the next position as an offset to chosen test position + const xy_pos_t noz_pos = test_position - probe.offset_xy; + xy_pos_t next_pos = { + noz_pos.x + cos(RADIANS(angle)) * radius, + noz_pos.y + sin(RADIANS(angle)) * radius + }; + + #if ENABLED(DELTA) + // If the probe can't reach the point on a round bed... + // Simply scale the numbers to bring them closer to origin. while (!probe.can_reach(next_pos)) { next_pos *= 0.8f; if (verbose_level > 3) SERIAL_ECHOLNPAIR_P(PSTR("Moving inward: X"), next_pos.x, SP_Y_STR, next_pos.y); } + #else + // For a rectangular bed just keep the probe in bounds + LIMIT(next_pos.x, X_MIN_POS, X_MAX_POS); + LIMIT(next_pos.y, Y_MIN_POS, Y_MAX_POS); #endif if (verbose_level > 3) @@ -194,45 +218,35 @@ void GcodeSuite::M48() { } // n_legs // Probe a single point - sample_set[n] = probe.probe_at_point(probe_pos, raise_after, 0); + const float pz = probe.probe_at_point(test_position, raise_after, 0); // Break the loop if the probe fails - probing_good = !isnan(sample_set[n]); + probing_good = !isnan(pz); if (!probing_good) break; - /** - * Get the current mean for the data points we have so far - */ - float sum = 0.0; - LOOP_LE_N(j, n) sum += sample_set[j]; - mean = sum / (n + 1); - - NOMORE(min, sample_set[n]); - NOLESS(max, sample_set[n]); - - /** - * Now, use that mean to calculate the standard deviation for the - * data points we have so far - */ - sum = 0.0; - LOOP_LE_N(j, n) - sum += sq(sample_set[j] - mean); - - sigma = SQRT(sum / (n + 1)); - if (verbose_level > 0) { - if (verbose_level > 1) { - SERIAL_ECHO(n + 1); - SERIAL_ECHOPAIR(" of ", int(n_samples)); - SERIAL_ECHOPAIR_F(": z: ", sample_set[n], 3); - if (verbose_level > 2) { - SERIAL_ECHOPAIR_F(" mean: ", mean, 4); - SERIAL_ECHOPAIR_F(" sigma: ", sigma, 6); - SERIAL_ECHOPAIR_F(" min: ", min, 3); - SERIAL_ECHOPAIR_F(" max: ", max, 3); - SERIAL_ECHOPAIR_F(" range: ", max-min, 3); - } - SERIAL_EOL(); - } + // Store the new sample + sample_set[n] = pz; + + // Keep track of the largest and smallest samples + NOMORE(min, pz); + NOLESS(max, pz); + + // Get the mean value of all samples thus far + sample_sum += pz; + mean = sample_sum / (n + 1); + + // Calculate the standard deviation so far. + // The value after the last sample will be the final output. + float dev_sum = 0.0; + LOOP_LE_N(j, n) dev_sum += sq(sample_set[j] - mean); + sigma = SQRT(dev_sum / (n + 1)); + + if (verbose_level > 1) { + SERIAL_ECHO(n + 1); + SERIAL_ECHOPAIR(" of ", int(n_samples)); + SERIAL_ECHOPAIR_F(": z: ", pz, 3); + dev_report(verbose_level > 2, mean, sigma, min, max); + SERIAL_EOL(); } } // n_samples loop @@ -242,16 +256,7 @@ void GcodeSuite::M48() { if (probing_good) { SERIAL_ECHOLNPGM("Finished!"); - - if (verbose_level > 0) { - SERIAL_ECHOPAIR_F("Mean: ", mean, 6); - SERIAL_ECHOPAIR_F(" Min: ", min, 3); - SERIAL_ECHOPAIR_F(" Max: ", max, 3); - SERIAL_ECHOLNPAIR_F(" Range: ", max-min, 3); - } - - SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); - SERIAL_EOL(); + dev_report(verbose_level > 0, mean, sigma, min, max, true); #if HAS_SPI_LCD // Display M48 results in the status bar diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 3791a4ad180d..5aa0d76a84a2 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -124,6 +124,7 @@ namespace Language_en { PROGMEM Language_Str MSG_USER_MENU = _UxGT("Custom Commands"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Probe out of bounds"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviation"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mode"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 1a5bdb22e98e..43765d7c3ac3 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -122,6 +122,7 @@ namespace Language_it { PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz."); PROGMEM Language_Str MSG_M48_TEST = _UxGT("Test sonda M48"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("Punto M48"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviazione"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Strumenti Offsets"); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 914b229008d9..027be4029d05 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -386,7 +386,7 @@ void menu_motion() { #endif #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - GCODES_ITEM(MSG_M48_TEST, PSTR("G28\nM48 P10")); + GCODES_ITEM(MSG_M48_TEST, PSTR("G28 O\nM48 P10")); #endif // From 04909a201002cee986ad2d86b910f13196f0088d Mon Sep 17 00:00:00 2001 From: ellensp Date: Sat, 22 Aug 2020 14:56:18 +1200 Subject: [PATCH 384/483] Creality3D v4.2.7 (#19088) --- Marlin/src/core/boards.h | 3 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 40 ++++++++++++---- Marlin/src/pins/stm32f1/pins_CREALITY_V427.h | 48 ++++++++++++++++++++ 4 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 Marlin/src/pins/stm32f1/pins_CREALITY_V427.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 32b9168a6229..cadbc714211f 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -313,7 +313,8 @@ #define BOARD_CHITU3D_V5 4031 // Chitu3D TronXY X5SA V5 Board #define BOARD_CHITU3D_V6 4032 // Chitu3D TronXY X5SA V5 Board #define BOARD_CREALITY_V4 4033 // Creality v4.x (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4034 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_CREALITY_V427 4034 // Creality v4.2.7 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4035 // Trigorilla Pro (STM32F103ZET6) // // ARM Cortex-M4F diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 9b6be5a6e106..f2aec72c4605 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -550,6 +550,8 @@ #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 #elif MB(CREALITY_V4) #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality +#elif MB(CREALITY_V427) + #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality #elif MB(TRIGORILLA_PRO) #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 5aab757129da..f42d78669555 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -32,8 +32,12 @@ #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "CREALITY V4" -#define DEFAULT_MACHINE_NAME "Ender 3 V2" +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Creality V4" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "Ender 3 V2" +#endif // // EEPROM @@ -90,20 +94,36 @@ // Steppers // #define X_ENABLE_PIN PC3 -#define X_STEP_PIN PC2 -#define X_DIR_PIN PB9 +#ifndef X_STEP_PIN + #define X_STEP_PIN PC2 +#endif +#ifndef X_DIR_PIN + #define X_DIR_PIN PB9 +#endif #define Y_ENABLE_PIN PC3 -#define Y_STEP_PIN PB8 -#define Y_DIR_PIN PB7 +#ifndef Y_STEP_PIN + #define Y_STEP_PIN PB8 +#endif +#ifndef Y_DIR_PIN + #define Y_DIR_PIN PB7 +#endif #define Z_ENABLE_PIN PC3 -#define Z_STEP_PIN PB6 -#define Z_DIR_PIN PB5 +#ifndef Z_STEP_PIN + #define Z_STEP_PIN PB6 +#endif +#ifndef Z_DIR_PIN + #define Z_DIR_PIN PB5 +#endif #define E0_ENABLE_PIN PC3 -#define E0_STEP_PIN PB4 -#define E0_DIR_PIN PB3 +#ifndef E0_STEP_PIN + #define E0_STEP_PIN PB4 +#endif +#ifndef E0_DIR_PIN + #define E0_DIR_PIN PB3 +#endif // // Release PB4 (Y_ENABLE_PIN) from JTAG NRST role diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h new file mode 100644 index 000000000000..9453a6d515b2 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * CREALITY v4.2.7 (STM32F103) board pin assignments + */ + +#ifndef __STM32F1__ + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Creality v4.2.7" +#define DEFAULT_MACHINE_NAME "Creality3D" + +// +// Steppers +// +#define X_STEP_PIN PB9 +#define X_DIR_PIN PC2 +#define Y_STEP_PIN PB7 + +#define Y_DIR_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB6 + +#define E0_STEP_PIN PB3 +#define E0_DIR_PIN PB4 + +#include "pins_CREALITY_V4.h" From ec02aee46cb2349646b4fcb4f069f50e8696ccbb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 21:59:59 -0500 Subject: [PATCH 385/483] More menu header fu --- Marlin/src/lcd/menu/menu.h | 10 ++++++++++ Marlin/src/lcd/menu/menu_item.h | 10 ---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 1dff9d94fc4b..d69214446481 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -79,6 +79,16 @@ class MenuItem_static : public MenuItemBase { static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const vstr=nullptr); }; +// BACK_ITEM(LABEL) +class MenuItem_back : public MenuItemBase { + public: + FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { + _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); + } + // Back Item action goes back one step in history + FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } +}; + // CONFIRM_ITEM(LABEL,Y,N,FY,FN,...), // YESNO_ITEM(LABEL,FY,FN,...) class MenuItem_confirm : public MenuItemBase { diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 66ed0e402d94..b322246e50d1 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -33,16 +33,6 @@ void lcd_move_z(); ///////////// Base Menu Items ////////////// //////////////////////////////////////////// -// BACK_ITEM(LABEL) -class MenuItem_back : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { - _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); - } - // Back Item action goes back one step in history - FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } -}; - // SUBMENU(LABEL, screen_handler) class MenuItem_submenu : public MenuItemBase { public: From d6574a03a113167f28ac8ddd2ad3558ac06c983f Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 22 Aug 2020 00:03:32 -0300 Subject: [PATCH 386/483] CI with PIO-dev (#19058) --- .github/workflows/test-builds.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 1467f1b33fc4..fdb81fbdc9d2 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -106,7 +106,7 @@ jobs: - name: Install PlatformIO run: | - pip install -U https://github.com/platformio/platformio-core/archive/master.zip + pip install -U https://github.com/platformio/platformio-core/archive/develop.zip platformio update - name: Check out the PR From 02ea13b5119ff519ed7adcb08923d8b34ae381c9 Mon Sep 17 00:00:00 2001 From: mmajoor Date: Sat, 22 Aug 2020 05:04:31 +0200 Subject: [PATCH 387/483] GRAPHICAL_TFT_ROTATE_180 for ST7789V (#19042) --- Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index dc8fbc53facf..b8bfdb293a97 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -298,7 +298,7 @@ static const uint16_t st7789v_init[] = { ESC_REG(0x0010), ESC_DELAY(10), ESC_REG(0x0001), ESC_DELAY(200), ESC_REG(0x0011), ESC_DELAY(120), - ESC_REG(0x0036), 0x00A0, + ESC_REG(0x0036), TERN(GRAPHICAL_TFT_ROTATE_180, 0x0060, 0x00A0), ESC_REG(0x003A), 0x0055, ESC_REG(0x002A), 0x0000, 0x0000, 0x0001, 0x003F, ESC_REG(0x002B), 0x0000, 0x0000, 0x0000, 0x00EF, From 93167afaf5eb81526a1192fd70d3390af6c48425 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Aug 2020 22:50:45 -0500 Subject: [PATCH 388/483] Update copy_marlin_variant_to_framework.py --- .../scripts/copy_marlin_variant_to_framework.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index b66ba27fa646..f7d3f0d03ab7 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -1,7 +1,19 @@ import os,shutil from SCons.Script import DefaultEnvironment from platformio import util -from platformio.managers.package import PackageManager +try: + # PIO < 4.4 + from platformio.managers.package import PackageManager +except ImportError: + # PIO >= 4.4 + from platformio.package.meta import PackageSpec as PackageManager + +def parse_pkg_uri(spec): + if PackageManager.__name__ == 'PackageSpec': + return PackageManager(spec).name + else: + name, _, _ = PackageManager.parse_pkg_uri(spec) + return name def copytree(src, dst, symlinks=False, ignore=None): for item in os.listdir(src): @@ -26,7 +38,7 @@ def copytree(src, dst, symlinks=False, ignore=None): if len(platform_packages) == 0: platform_name = framewords[platform.__class__.__name__] else: - platform_name, _, _ = PackageManager.parse_pkg_uri(platform_packages[0]) + platform_name = parse_pkg_uri(platform_packages[0]) FRAMEWORK_DIR = platform.get_package_dir(platform_name) assert os.path.isdir(FRAMEWORK_DIR) From 8652a7bdd2dada6b5dcdbccbbf5feb76b465083d Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 22 Aug 2020 06:13:43 +0200 Subject: [PATCH 389/483] HIGH/LOW naming of pin state settings (#19089) --- Marlin/Configuration.h | 2 +- Marlin/Configuration_adv.h | 2 +- Marlin/src/HAL/DUE/usb/arduino_due_x.h | 2 +- Marlin/src/MarlinCore.h | 4 ++-- Marlin/src/feature/spindle_laser.cpp | 12 ++++++------ Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/inc/SanityCheck.h | 14 +++++++++----- 7 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 7f7931ae7db9..2b36f883cc2f 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -330,7 +330,7 @@ //#define PSU_NAME "Power Supply" #if ENABLED(PSU_CONTROL) - #define PSU_ACTIVE_HIGH false // Set 'false' for ATX, 'true' for X-Box + #define PSU_ACTIVE_STATE LOW // Set 'LOW' for ATX, 'HIGH' for X-Box //#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80 //#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 529dcc3091ae..b27d7c79eabc 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2851,7 +2851,7 @@ //#define SPINDLE_FEATURE //#define LASER_FEATURE #if EITHER(SPINDLE_FEATURE, LASER_FEATURE) - #define SPINDLE_LASER_ACTIVE_HIGH false // Set to "true" if the on/off function is active HIGH + #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if the on/off function is active HIGH #define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power #define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower diff --git a/Marlin/src/HAL/DUE/usb/arduino_due_x.h b/Marlin/src/HAL/DUE/usb/arduino_due_x.h index b5be621791d2..d3b333fb349a 100644 --- a/Marlin/src/HAL/DUE/usb/arduino_due_x.h +++ b/Marlin/src/HAL/DUE/usb/arduino_due_x.h @@ -93,5 +93,5 @@ #define USB_VBOF_GPIO (PIO_PB10_IDX) #define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT) /*! Active level of the USB_VBOF output pin. */ -#define USB_VBOF_ACTIVE_LEVEL LOW +#define USB_VBOF_ACTIVE_STATE LOW /* ------------------------------------------------------------------------ */ diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index 81041c8ee62f..69afc7f30e88 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -89,8 +89,8 @@ extern bool wait_for_heatup; #if ENABLED(PSU_CONTROL) extern bool powersupply_on; - #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_HIGH); powersupply_on = true; }while(0) - #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_HIGH); powersupply_on = false; }while(0) + #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_STATE); powersupply_on = true; }while(0) + #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE); powersupply_on = false; }while(0) #if ENABLED(AUTO_POWER_CONTROL) #define PSU_ON() powerManager.power_on() #define PSU_OFF() powerManager.power_off() diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp index 9d2ee7d9e57c..bc387a93348d 100644 --- a/Marlin/src/feature/spindle_laser.cpp +++ b/Marlin/src/feature/spindle_laser.cpp @@ -37,7 +37,7 @@ cutter_power_t SpindleLaser::menuPower, // Power s SpindleLaser::unitPower; // LCD status power in PWM, PERCENT, or RPM #if ENABLED(MARLIN_DEV_MODE) - cutter_frequency_t SpindleLaser::frequency; // setting PWM frequency; range: 2K - 50K + cutter_frequency_t SpindleLaser::frequency; // PWM frequency setting; range: 2K - 50K #endif #define SPINDLE_LASER_PWM_OFF ((SPINDLE_LASER_PWM_INVERT) ? 255 : 0) @@ -45,13 +45,13 @@ cutter_power_t SpindleLaser::menuPower, // Power s // Init the cutter to a safe OFF state // void SpindleLaser::init() { - OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Init spindle to off + OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Init spindle to off #if ENABLED(SPINDLE_CHANGE_DIR) OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // Init rotation to clockwise (M3) #endif #if ENABLED(SPINDLE_LASER_PWM) SET_PWM(SPINDLE_LASER_PWM_PIN); - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // set to lowest speed + analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed #endif #if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY); @@ -64,14 +64,14 @@ void SpindleLaser::init() { * Set the cutter PWM directly to the given ocr value */ void SpindleLaser::set_ocr(const uint8_t ocr) { - WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_HIGH); // turn spindle on + WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_STATE); // Turn spindle on analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); #endif } void SpindleLaser::ocr_off() { - WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_HIGH); // Turn spindle off + WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Turn spindle off analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Only write low byte } #endif @@ -98,7 +98,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) { isReady = false; } #else - WRITE(SPINDLE_LASER_ENA_PIN, enabled() == SPINDLE_LASER_ACTIVE_HIGH); + WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE); isReady = true; #endif } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 5d7322753f85..f566643bdb5b 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -403,7 +403,7 @@ #ifndef PSU_NAME #if DISABLED(PSU_CONTROL) #define PSU_NAME "Generic" // No control - #elif PSU_ACTIVE_HIGH + #elif PSU_ACTIVE_STATE #define PSU_NAME "XBox" // X-Box 360 (203W) #else #define PSU_NAME "ATX" // ATX style diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 01243219c239..ddefcc8b60ae 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -419,8 +419,10 @@ #error "SPINDLE_DIR_CHANGE is now SPINDLE_CHANGE_DIR. Please update your Configuration_adv.h." #elif defined(SPINDLE_STOP_ON_DIR_CHANGE) #error "SPINDLE_STOP_ON_DIR_CHANGE is now SPINDLE_CHANGE_DIR_STOP. Please update your Configuration_adv.h." +#elif defined(SPINDLE_LASER_ACTIVE_HIGH) + #error "SPINDLE_LASER_ACTIVE_HIGH is now SPINDLE_LASER_ACTIVE_STATE. Please update your Configuration_adv.h." #elif defined(SPINDLE_LASER_ENABLE_INVERT) - #error "SPINDLE_LASER_ENABLE_INVERT is now SPINDLE_LASER_ACTIVE_HIGH. Please update your Configuration_adv.h." + #error "SPINDLE_LASER_ENABLE_INVERT is now SPINDLE_LASER_ACTIVE_STATE. Please update your Configuration_adv.h." #elif defined(CUTTER_POWER_DISPLAY) #error "CUTTER_POWER_DISPLAY is now CUTTER_POWER_UNIT. Please update your Configuration_adv.h." #elif defined(CHAMBER_HEATER_PIN) @@ -441,10 +443,12 @@ #error "USB_SD_DISABLED is now NO_SD_HOST_DRIVE. Please update your Configuration_adv.h." #elif defined(USB_SD_ONBOARD) #error "USB_SD_ONBOARD is obsolete. Disable NO_SD_HOST_DRIVE instead." +#elif defined(PSU_ACTIVE_HIGH) + #error "PSU_ACTIVE_HIGH is now PSU_ACTIVE_STATE. Please update your configuration." #elif POWER_SUPPLY == 1 - #error "Replace POWER_SUPPLY 1 by enabling PSU_CONTROL and setting PSU_ACTIVE_HIGH to 'false'." + #error "Replace POWER_SUPPLY 1 by enabling PSU_CONTROL and setting PSU_ACTIVE_STATE to 'LOW'." #elif POWER_SUPPLY == 2 - #error "Replace POWER_SUPPLY 2 by enabling PSU_CONTROL and setting PSU_ACTIVE_HIGH to 'true'." + #error "Replace POWER_SUPPLY 2 by enabling PSU_CONTROL and setting PSU_ACTIVE_STATE to 'HIGH'." #elif defined(POWER_SUPPLY) #error "POWER_SUPPLY is now obsolete. Please remove it from Configuration.h." #elif defined(MKS_ROBIN_TFT) @@ -2923,8 +2927,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) * Ensure this option is set intentionally */ #if ENABLED(PSU_CONTROL) - #ifndef PSU_ACTIVE_HIGH - #error "PSU_CONTROL requires PSU_ACTIVE_HIGH to be defined as 'true' or 'false'." + #ifndef PSU_ACTIVE_STATE + #error "PSU_CONTROL requires PSU_ACTIVE_STATE to be defined as 'HIGH' or 'LOW'." #elif !PIN_EXISTS(PS_ON) #error "PSU_CONTROL requires PS_ON_PIN." #endif From 563eda4b6b42746641f82c2c5020e80c71fb4fdd Mon Sep 17 00:00:00 2001 From: Steven Haigh Date: Sat, 22 Aug 2020 14:44:21 +1000 Subject: [PATCH 390/483] Translatable strings on Ender-3 V2 DWIN (#19053) Co-authored-by: Scott Lahteine --- Marlin/src/lcd/dwin/dwin.cpp | 386 +++++++++++++++++++---------------- Marlin/src/lcd/dwin/dwin.h | 8 +- 2 files changed, 215 insertions(+), 179 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index e527c8dba024..0d719542e182 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -190,23 +190,23 @@ float last_zoffset = 0, last_probe_zoffset = 0; #define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) // BL24CXX::check() uses 0x00 -void lcd_select_language(void) { - BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); - if (HMI_flag.language_flag) +void HMI_SetLanguage(void) { + BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); + if (HMI_flag.language_chinese) DWIN_JPG_CacheTo1(Language_Chinese); else DWIN_JPG_CacheTo1(Language_English); } -void set_english_to_eeprom(void) { - HMI_flag.language_flag = 0; +void HMI_SetAndSaveLanguageWestern(void) { + HMI_flag.language_chinese = false; DWIN_JPG_CacheTo1(Language_English); - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); } -void set_chinese_to_eeprom(void) { - HMI_flag.language_flag = 1; +void HMI_SetAndSaveLanguageChinese(void) { + HMI_flag.language_chinese = true; DWIN_JPG_CacheTo1(Language_Chinese); - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_flag, sizeof(HMI_flag.language_flag)); + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese)); } void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { @@ -223,14 +223,14 @@ void show_plus_or_minus(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNu void ICON_Print() { if (select_page.now == 0) { DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 58, 201); else DWIN_Frame_AreaCopy(1, 1, 451, 271 - 240, 479 - 16, 72 - 15, 201); } else { DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 405, 271 - 243, 420, 58, 201); else DWIN_Frame_AreaCopy(1, 1, 423, 271 - 240, 423 + 12, 72 - 15, 201); @@ -240,14 +240,14 @@ void ICON_Print() { void ICON_Prepare() { if (select_page.now == 1) { DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 31, 447, 271 - 213, 479 - 19, 186, 201); else DWIN_Frame_AreaCopy(1, 33, 451, 271 - 189, 479 - 13, 200 - 25, 201); } else { DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 31, 405, 271 - 213, 420, 186, 201); else DWIN_Frame_AreaCopy(1, 33, 423, 271 - 189, 423 + 15, 200 - 25, 201); @@ -257,14 +257,14 @@ void ICON_Prepare() { void ICON_Control() { if (select_page.now == 2) { DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 61, 447, 271 - 183, 479 - 19, 58, 318); else DWIN_Frame_AreaCopy(1, 85, 451, 271 - 139, 479 - 16, 72 - 24, 318); } else { DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 61, 405, 271 - 183, 420, 58, 318); else DWIN_Frame_AreaCopy(1, 85, 423, 271 - 139, 479 - 45, 72 - 24, 318); @@ -274,14 +274,14 @@ void ICON_Control() { void ICON_StartInfo(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 91, 447, 271 - 153, 479 - 19, 186, 318); else DWIN_Frame_AreaCopy(1, 132, 451, 159, 479 - 13, 186, 318); } else { DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 91, 405, 271 - 153, 420, 186, 318); else DWIN_Frame_AreaCopy(1, 132, 423, 159, 423 + 12, 186, 318); @@ -291,14 +291,14 @@ void ICON_StartInfo(bool show) { void ICON_Leveling(bool show) { if (show) { DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 211, 447, 238, 479 - 19, 186, 318); else DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 200 - 18, 318); } else { DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 211, 405, 238, 420, 186, 318); else DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 200 - 18, 318); @@ -308,14 +308,14 @@ void ICON_Leveling(bool show) { void ICON_Tune() { if (select_print.now == 0) { DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 121, 447, 271 - 123, 479 - 21, 34, 325); else DWIN_Frame_AreaCopy(1, 1, 465, 271 - 237, 479 - 2, 48 - 17, 325); } else { DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 121, 405, 271 - 123, 420, 34, 325); else DWIN_Frame_AreaCopy(1, 1, 438, 271 - 239, 479 - 31, 48 - 17, 325); @@ -325,14 +325,14 @@ void ICON_Tune() { void ICON_Pause() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 181, 447, 271 - 63, 479 - 20, 124, 325); else DWIN_Frame_AreaCopy(1, 177, 451, 271 - 55, 479 - 17, 136 - 20, 325); } else { DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 181, 405, 271 - 63, 420, 124, 325); else DWIN_Frame_AreaCopy(1, 177, 423, 271 - 56, 479 - 46, 136 - 20, 325); @@ -342,14 +342,14 @@ void ICON_Pause() { void ICON_Continue() { if (select_print.now == 1) { DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 447, 271 - 243, 479 - 19, 124, 325); else DWIN_Frame_AreaCopy(1, 1, 451, 271 - 239, 479 - 16, 136 - 15, 325); } else { DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 405, 271 - 243, 420, 124, 325); else DWIN_Frame_AreaCopy(1, 1, 424, 271 - 240, 479 - 45, 136 - 15, 325); @@ -359,14 +359,14 @@ void ICON_Continue() { void ICON_Stop() { if (select_print.now == 2) { DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 151, 447, 271 - 93, 479 - 20, 210, 325); else DWIN_Frame_AreaCopy(1, 218, 451, 271 - 22, 479 - 14, 224 - 15, 325); } else { DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 151, 405, 271 - 93, 420, 210, 325); else DWIN_Frame_AreaCopy(1, 218, 423, 271 - 24, 479 - 43, 224 - 15, 325); @@ -454,7 +454,7 @@ inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char // The "Back" label is always on the first line inline void Draw_Back_Label(void) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 129, 72, 271 - 115, 479 - 395, LBLX, MBASE(0)); else DWIN_Frame_AreaCopy(1, 226, 179, 271 - 15, 479 - 290, LBLX, MBASE(0)); @@ -476,7 +476,7 @@ inline void draw_move_en(const uint16_t line) { } inline void Prepare_Item_Move(const uint8_t row) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 159, 70, 271 - 71, 479 - 395, LBLX, MBASE(row)); else draw_move_en(MBASE(row)); // "Move >" @@ -485,7 +485,7 @@ inline void Prepare_Item_Move(const uint8_t row) { } inline void Prepare_Item_Disable(const uint8_t row) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 204, 70, 271 - 12, 479 - 397, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 103, 59, 271 - 71, 479 - 405, LBLX, MBASE(row)); // "Disable Stepper" @@ -493,7 +493,7 @@ inline void Prepare_Item_Disable(const uint8_t row) { } inline void Prepare_Item_Home(const uint8_t row) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 0, 89, 271 - 230, 479 - 378, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 202, 61, 271 - 0, 479 - 408, LBLX, MBASE(row)); // "Auto Home" @@ -501,7 +501,7 @@ inline void Prepare_Item_Home(const uint8_t row) { } inline void Prepare_Item_Offset(const uint8_t row) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { #if HAS_BED_PROBE DWIN_Frame_AreaCopy(1, 174, 164, 271 - 48, 479 - 302, LBLX, MBASE(row)); show_plus_or_minus(font8x16, Background_black, 2, 2, 202, MBASE(row), probe.offset.z * 100); @@ -521,7 +521,7 @@ inline void Prepare_Item_Offset(const uint8_t row) { } inline void Prepare_Item_PLA(const uint8_t row) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 100, 89, 271 - 93 - 27, 479 - 378, LBLX, MBASE(row)); } else { @@ -532,7 +532,7 @@ inline void Prepare_Item_PLA(const uint8_t row) { } inline void Prepare_Item_ABS(const uint8_t row) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 180, 89, 271 - 11 - 27, 479 - 379, LBLX, MBASE(row)); } else { @@ -543,7 +543,7 @@ inline void Prepare_Item_ABS(const uint8_t row) { } inline void Prepare_Item_Cool(const uint8_t row) { - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 1, 104, 271 - 215, 479 - 362, LBLX, MBASE(row)); else DWIN_Frame_AreaCopy(1, 200, 76, 271 - 7, 479 - 393, LBLX, MBASE(row));// "Cooldown" @@ -551,7 +551,7 @@ inline void Prepare_Item_Cool(const uint8_t row) { } inline void Prepare_Item_Lang(const uint8_t row) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 239, 134, 271 - 5, 479 - 333, LBLX, MBASE(row)); DWIN_Draw_String(false, false, font8x16, White, Background_black, 226, MBASE(row), (char*)"CN"); } @@ -569,7 +569,7 @@ inline void Draw_Prepare_Menu() { #define PSCROL(L) (scroll + (L)) #define PVISI(L) WITHIN(PSCROL(L), 0, MROWS) - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 133, 1, 271 - 111, 479 - 465 - 1, 14, 8); // "Prepare" } else { @@ -604,7 +604,7 @@ inline void Draw_Control_Menu() { if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 1, 271 - 141, 479 - 465, 14, 8); DWIN_Frame_AreaCopy(1, 57, 104, 271 - 187, 479 - 363, LBLX, CLINE(1)); // Temperature > DWIN_Frame_AreaCopy(1, 87, 104, 271 - 157, 479 - 363, LBLX, CLINE(2)); // Motion > @@ -618,22 +618,25 @@ inline void Draw_Control_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_CONTROL)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + if (CVISI(6)) + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 5), (char*)"Info"); #else DWIN_Frame_AreaCopy(1, 128, 2, 271 - 95, 479 - 467, 14, 8); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX, CLINE(1));// Temperature > + DWIN_Frame_AreaCopy(1, 84, 89, 271 - 143, 479 - 380, LBLX, CLINE(2));// Motion > + DWIN_Frame_AreaCopy(1, 131 + 17, 89, 271 - 3, 479 - 377 - 1, LBLX, CLINE(3));// "Store Configuration" + DWIN_Frame_AreaCopy(1, 26, 104, 271 - 214, 479 - 365, LBLX, CLINE(4)); // "Read" + DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 31 + 3, CLINE(4)); // "Configuration" + DWIN_Frame_AreaCopy(1, 59, 104, 271 - 178, 479 - 365, LBLX, CLINE(5)); // "Reset" + DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 34 + 3, CLINE(5)); // "Configuration" + if (CVISI(6)) + DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > #endif - - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX, CLINE(1));// Temperature > - DWIN_Frame_AreaCopy(1, 84, 89, 271 - 143, 479 - 380, LBLX, CLINE(2));// Motion > - DWIN_Frame_AreaCopy(1, 131 + 17, 89, 271 - 3, 479 - 377 - 1, LBLX, CLINE(3));// "Store Configuration" - - DWIN_Frame_AreaCopy(1, 26, 104, 271 - 214, 479 - 365, LBLX, CLINE(4)); // "Read" - DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 31 + 3, CLINE(4)); // "Configuration" - - DWIN_Frame_AreaCopy(1, 59, 104, 271 - 178, 479 - 365, LBLX, CLINE(5)); // "Reset" - DWIN_Frame_AreaCopy(1, 131 + 51, 89, 271 - 3, 479 - 377 - 1, LBLX + 34 + 3, CLINE(5)); // "Configuration" - - if (CVISI(6)) - DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(6)); // Info > } if (select_control.now && CVISI(select_control.now)) @@ -651,9 +654,8 @@ inline void Draw_Control_Menu() { inline void Draw_Tune_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 73, 2, 271 - 171, 479 - 466, 14, 9); - DWIN_Frame_AreaCopy(1, 116, 164, 271 - 100, 479 - 303, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX, MBASE(2)); DWIN_Frame_AreaCopy(1, 58, 134, 271 - 158, 479 - 333, LBLX, MBASE(3)); @@ -663,16 +665,21 @@ inline void Draw_Tune_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TUNE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else DWIN_Frame_AreaCopy(1, 94, 2, 271 - 145, 479 - 467, 14, 9); + DWIN_Frame_AreaCopy(1, 1, 179, 271 - 179, 479 - 287 - 2, LBLX, MBASE(1)); // print speed + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(2)); // Hotend... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(2)); // ...Temperature + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(3)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(3)); // ...Temperature + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(4)); // fan speed + DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(5)); // Z-offset #endif - DWIN_Frame_AreaCopy(1, 1, 179, 271 - 179, 479 - 287 - 2, LBLX, MBASE(1)); // print speed - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(2)); // Hotend... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(3)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(3)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(4)); // fan speed - DWIN_Frame_AreaCopy(1, 93, 179, 271 - 130, 479 - 290, LBLX, MBASE(5)); // Z-offset } Draw_Back_First(select_tune.now == 0); @@ -723,7 +730,7 @@ inline void say_e(const uint16_t inset, const uint16_t line) { inline void Draw_Motion_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); DWIN_Frame_AreaCopy(1, 173, 133, 228, 479 - 332, LBLX, MBASE(1)); // max speed @@ -737,13 +744,17 @@ inline void Draw_Motion_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Feedrate"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_ACCELERATION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STEPS_PER_MM)); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + draw_max_en(MBASE(1)); draw_speed_en(24 + 3, MBASE(1)); // "Max Speed" + draw_max_accel_en(MBASE(2)); // "Max Acceleration" + draw_max_en(MBASE(3)); draw_corner_en(MBASE(3)); // "Max Corner" + draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" #endif - draw_max_en(MBASE(1)); draw_speed_en(24 + 3, MBASE(1)); // "Max Speed" - draw_max_accel_en(MBASE(2)); // "Max Acceleration" - draw_max_en(MBASE(3)); draw_corner_en(MBASE(3)); // "Max Corner" - draw_steps_per_mm(MBASE(4)); // "Steps-per-mm" } Draw_Back_First(select_motion.now == 0); @@ -766,7 +777,7 @@ void Popup_Window_Temperature(const bool toohigh) { Draw_Popup_Bkgd_105(); if (toohigh) { DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 371, 237, 479 - 93, 52, 285); DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); @@ -778,7 +789,7 @@ void Popup_Window_Temperature(const bool toohigh) { } else { DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 371, 271 - 1, 479 - 93, 52, 285); DWIN_Frame_AreaCopy(1, 189, 389, 271 - 0, 402, 95, 310); } @@ -799,7 +810,7 @@ inline void Draw_Popup_Bkgd_60() { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 103, 371, 136, 479 - 93, 69, 240); DWIN_Frame_AreaCopy(1, 170, 371, 271 - 1, 479 - 93, 69 + 33, 240); DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); @@ -815,7 +826,7 @@ inline void Draw_Popup_Bkgd_60() { void Popup_Window_Resume(void) { Clear_Popup_Area(); Draw_Popup_Bkgd_105(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 160, 338, 271 - 36, 479 - 125, 98, 135); DWIN_Frame_AreaCopy(1, 103, 321, 271 - 0, 479 - 144, 52, 192); DWIN_ICON_Show(ICON, ICON_Continue_C, 26, 307); @@ -834,13 +845,13 @@ void Popup_Window_Home(void) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_BLTouch, 101, 105); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 0, 371, 33, 386, 85, 240); DWIN_Frame_AreaCopy(1, 203, 286, 271, 302, 118, 240); DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 80, 230, (char*)"Auto homing..."); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 80, 230, (char*)GET_TEXT_F(MSG_LEVEL_BED_HOMING)); DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); } } @@ -849,12 +860,12 @@ void Popup_Window_Leveling(void) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 0, 371, 100, 386, 84, 240); DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 76, 230, (char*)"Auto leveling..."); + DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 76, 230, (char*)GET_TEXT_F(MSG_BED_LEVELING)); DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 24, 260, (char*)"Please wait until completed"); } } @@ -872,7 +883,7 @@ void Draw_Select_Highlight(const bool sel) { void Popup_window_PauseOrStop(void) { Clear_Main_Window(); Draw_Popup_Bkgd_60(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { if (select_print.now == 1) DWIN_Frame_AreaCopy(1, 237, 338, 269, 356, 98, 150); else if (select_print.now == 2) DWIN_Frame_AreaCopy(1, 221, 320, 253, 336, 98, 150); DWIN_Frame_AreaCopy(1, 220, 304, 264, 319, 130, 150); @@ -880,8 +891,8 @@ void Popup_window_PauseOrStop(void) { DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); } else { - if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 88, 150, (char*)"Pause print?"); - else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 150, (char*)"Stop print?"); + if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 88, 150, (char*)GET_TEXT_F(MSG_PAUSE_PRINT)); + else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Font_window, Background_window, 92, 150, (char*)GET_TEXT_F(MSG_STOP_PRINT)); DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); } @@ -889,7 +900,7 @@ void Popup_window_PauseOrStop(void) { } void Draw_Printing_Screen(void) { - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 30, 1, 271 - 200, 479 - 465, 14, 9);// Tune DWIN_Frame_AreaCopy(1, 0, 72, 271 - 208, 479 - 393, 41, 188);// Pause DWIN_Frame_AreaCopy(1, 65, 72, 271 - 143, 479 - 393, 176, 188); // Stop @@ -949,7 +960,7 @@ void Goto_MainMenu(void) { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 2, 2, 271 - 244, 479 - 465, 14, 9); // "Home" } else { @@ -1715,7 +1726,7 @@ inline void Draw_Info_Menu() { DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); DWIN_Draw_String(false, false, font8x16, White, Background_black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 30, 17, 271 - 214, 479 - 450, 14, 8); DWIN_Frame_AreaCopy(1, 197, 149, 271 - 19, 479 - 318, 108, 102); @@ -1746,7 +1757,7 @@ inline void Draw_Info_Menu() { inline void Draw_Print_File_Menu() { Clear_Title_Bar(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 0, 31, 271 - 216, 479 - 435, 14, 8); } else { @@ -2093,7 +2104,7 @@ void HMI_PauseOrStop(void) { inline void Draw_Move_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 192, 1, 271 - 38, 479 - 465, 14, 8); DWIN_Frame_AreaCopy(1, 58, 118, 271 - 165, 479 - 347, LBLX, MBASE(1)); DWIN_Frame_AreaCopy(1, 109, 118, 271 - 114, 479 - 347, LBLX, MBASE(2)); @@ -2239,13 +2250,13 @@ void HMI_Prepare(void) { break; case 8: // language /* select language */ - HMI_flag.language_flag = !HMI_flag.language_flag; - if (HMI_flag.language_flag) { - set_chinese_to_eeprom(); + HMI_flag.language_chinese ^= true; + if (HMI_flag.language_chinese) { + HMI_SetAndSaveLanguageChinese(); DWIN_JPG_CacheTo1(Language_Chinese); } else { - set_english_to_eeprom(); + HMI_SetAndSaveLanguageWestern(); DWIN_JPG_CacheTo1(Language_English); } Draw_Prepare_Menu(); @@ -2260,7 +2271,7 @@ void HMI_Prepare(void) { void Draw_Temperature_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 236, 2, 271 - 8, 479 - 466, 14, 8); DWIN_Frame_AreaCopy(1, 1, 134, 271 - 215, 479 - 333, LBLX, MBASE(1)); @@ -2272,21 +2283,25 @@ void Draw_Temperature_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"PLA Preheat Settings"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 4), (char*)"ABS Preheat Settings"); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(1)); // Nozzle... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(1)); // ...Temperature + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(2)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(2)); // ...Temperature + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(3)); // Fan speed + DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(4)); // Preheat... + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX + 49 + 3, MBASE(4)); // ...PLA + DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 24 + 6, MBASE(4)); // PLA setting + DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(5)); // Preheat... + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 49 + 3, MBASE(5)); // ...ABS + DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 3 + 26 + 3, MBASE(5)); // ABS setting #endif - - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX, MBASE(1)); // Nozzle... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 41 + 3, MBASE(1)); // ...Temperature - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX, MBASE(2)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 3, MBASE(2)); // ...Temperature - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX, MBASE(3)); // Fan speed - DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(4)); // Preheat... - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX + 49 + 3, MBASE(4)); // ...PLA - DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 24 + 6, MBASE(4)); // PLA setting - DWIN_Frame_AreaCopy(1, 107, 76, 271 - 115, 479 - 393, LBLX, MBASE(5)); // Preheat... - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 49 + 3, MBASE(5)); // ...ABS - DWIN_Frame_AreaCopy(1, 131, 119, 271 - 89, 479 - 347, LBLX + 49 + 3 + 26 + 3, MBASE(5)); // ABS setting } Draw_Back_First(select_temp.now == 0); @@ -2319,7 +2334,7 @@ void HMI_Control(void) { Draw_More_Icon(2 + MROWS - index_control); // Motion > if (index_control > MROWS) { Draw_More_Icon(6 + MROWS - index_control); // Info > - if (HMI_flag.language_flag) + if (HMI_flag.language_chinese) DWIN_Frame_AreaCopy(1, 231, 104, 271 - 13, 479 - 363, LBLX, MBASE(5)); else DWIN_Frame_AreaCopy(1, 0, 104, 271 - 247, 479 - 365, LBLX, MBASE(5)); @@ -2523,7 +2538,7 @@ void HMI_Temperature(void) { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 59, 16, 271 - 132, 479 - 450, 14, 8); DWIN_Frame_AreaCopy(1, 100, 89, 124, 479 - 378, LBLX, MBASE(1)); @@ -2537,19 +2552,22 @@ void HMI_Temperature(void) { else { #ifdef USE_STRING_HEADINGS Draw_Title("PLA Settings"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Nozzle Temp"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Bed Temp"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // PLA bed temp + DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // PLA fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); // save PLA configuration #endif - - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // PLA nozzle temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // PLA bed temp - DWIN_Frame_AreaCopy(1, 157, 76, 181, 479 - 393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // PLA fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); // save PLA configuration } Draw_Back_First(); @@ -2572,7 +2590,7 @@ void HMI_Temperature(void) { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 142, 16, 271 - 48, 479 - 450, 14, 8); DWIN_Frame_AreaCopy(1, 180, 89, 204, 479 - 379, LBLX, MBASE(1)); @@ -2587,20 +2605,23 @@ void HMI_Temperature(void) { else { #ifdef USE_STRING_HEADINGS Draw_Title("ABS Settings"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Nozzle Temp"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Bed Temp"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)GET_TEXT_F(MSG_FAN_SPEED)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)GET_TEXT_F(MSG_STORE_EEPROM)); #else DWIN_Frame_AreaCopy(1, 56, 16, 271 - 130, 479 - 450 - 1, 14, 8); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // ABS nozzle temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // ABS bed temp + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // ABS fan speed + DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 33, MBASE(4)); // save ABS configuration #endif - - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 197, 104, 271 - 33, 479 - 365, LBLX + 24 + 3, MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 41 + 6, MBASE(1)); // ABS nozzle temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 271 - 7, 479 - 365, LBLX + 24 + 3, MBASE(2) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 271 - 188, 479 - 377 - 1, LBLX + 24 + 24 + 6, MBASE(2) + 3); // ABS bed temp - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 0, 119, 271 - 207, 479 - 347, LBLX + 24 + 3, MBASE(3)); // ABS fan speed - DWIN_Frame_AreaCopy(1, 97, 165, 271 - 42, 479 - 301 - 1, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 479 - 393, LBLX + 33, MBASE(4)); // save ABS configuration } Draw_Back_First(); @@ -2624,7 +2645,7 @@ void HMI_Temperature(void) { inline void Draw_Max_Speed_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); auto say_max_speed = [](const uint16_t row) { @@ -2643,24 +2664,28 @@ inline void Draw_Max_Speed_Menu() { else { #ifdef USE_STRING_HEADINGS Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Feedrate X"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Feedrate Y"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Feedrate Z"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Feedrate E"); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); - #endif - draw_max_en(MBASE(1)); // "Max" - DWIN_Frame_AreaCopy(1, 184, 119, 271 - 37, 479 - 347, LBLX + 24 + 3, MBASE(1)); // "Speed X" + draw_max_en(MBASE(1)); // "Max" + DWIN_Frame_AreaCopy(1, 184, 119, 271 - 37, 479 - 347, LBLX + 24 + 3, MBASE(1)); // "Speed X" - draw_max_en(MBASE(2)); // "Max" - draw_speed_en(24 + 3, MBASE(2)); // "Speed" - say_y(24 + 40 + 6, MBASE(2)); // "Y" + draw_max_en(MBASE(2)); // "Max" + draw_speed_en(24 + 3, MBASE(2)); // "Speed" + say_y(24 + 40 + 6, MBASE(2)); // "Y" - draw_max_en(MBASE(3)); // "Max" - draw_speed_en(24 + 3, MBASE(3)); // "Speed" - say_z(24 + 40 + 6, MBASE(3)); // "Z" + draw_max_en(MBASE(3)); // "Max" + draw_speed_en(24 + 3, MBASE(3)); // "Speed" + say_z(24 + 40 + 6, MBASE(3)); // "Z" - draw_max_en(MBASE(4)); // "Max" - draw_speed_en(24 + 3, MBASE(4)); // "Speed" - say_e(24 + 40 + 6, MBASE(4)); // "E" + draw_max_en(MBASE(4)); // "Max" + draw_speed_en(24 + 3, MBASE(4)); // "Speed" + say_e(24 + 40 + 6, MBASE(4)); // "E" + #endif } Draw_Back_First(); @@ -2675,7 +2700,7 @@ inline void Draw_Max_Speed_Menu() { inline void Draw_Max_Accel_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(1)); @@ -2693,14 +2718,18 @@ inline void Draw_Max_Accel_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Max Accel (mm/s/s)"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Accel X"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Accel Y"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Accel Z"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Accel E"); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + draw_max_accel_en(MBASE(1)); say_x(24 + 78 + 6, MBASE(1)); // "Max Acceleration X" + draw_max_accel_en(MBASE(2)); say_y(24 + 78 + 6, MBASE(2)); // "Max Acceleration Y" + draw_max_accel_en(MBASE(3)); say_z(24 + 78 + 6, MBASE(3)); // "Max Acceleration Z" + draw_max_accel_en(MBASE(4)); say_e(24 + 78 + 6, MBASE(4)); // "Max Acceleration E" #endif - draw_max_accel_en(MBASE(1)); say_x(24 + 78 + 6, MBASE(1)); // "Max Acceleration X" - draw_max_accel_en(MBASE(2)); say_y(24 + 78 + 6, MBASE(2)); // "Max Acceleration Y" - draw_max_accel_en(MBASE(3)); say_z(24 + 78 + 6, MBASE(3)); // "Max Acceleration Z" - draw_max_accel_en(MBASE(4)); say_e(24 + 78 + 6, MBASE(4)); // "Max Acceleration E" } Draw_Back_First(); @@ -2715,7 +2744,7 @@ inline void Draw_Max_Accel_Menu() { inline void Draw_Max_Jerk_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); DWIN_Frame_AreaCopy(1, 173, 133, 200, 479 - 332, LBLX, MBASE(1)); @@ -2737,30 +2766,33 @@ inline void Draw_Max_Jerk_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Max Corner"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Max Jerk X"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Max Jerk Y"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Max Jerk Z"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Max Jerk E"); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + draw_max_en(MBASE(1)); // "Max" + draw_corner_en(MBASE(1)); // "Corner" + draw_speed_en(66 + 6, MBASE(1)); // "Speed" + say_x(106 + 9, MBASE(1)); // "X" + + draw_max_en(MBASE(2)); // "Max" + draw_corner_en(MBASE(2)); // "Corner" + draw_speed_en(66 + 6, MBASE(2)); // "Speed" + say_y(106 + 9, MBASE(2)); // "Y" + + draw_max_en(MBASE(3)); // "Max" + draw_corner_en(MBASE(3)); // "Corner" + draw_speed_en(66 + 6, MBASE(3)); // "Speed" + say_z(106 + 9, MBASE(3)); // "Z" + + draw_max_en(MBASE(4)); // "Max" + draw_corner_en(MBASE(4)); // "Corner" + draw_speed_en(66 + 6, MBASE(4)); // "Speed" + say_e(106 + 9, MBASE(4)); // "E" #endif - - draw_max_en(MBASE(1)); // "Max" - draw_corner_en(MBASE(1)); // "Corner" - draw_speed_en(66 + 6, MBASE(1)); // "Speed" - say_x(106 + 9, MBASE(1)); // "X" - - draw_max_en(MBASE(2)); // "Max" - draw_corner_en(MBASE(2)); // "Corner" - draw_speed_en(66 + 6, MBASE(2)); // "Speed" - say_y(106 + 9, MBASE(2)); // "Y" - - draw_max_en(MBASE(3)); // "Max" - draw_corner_en(MBASE(3)); // "Corner" - draw_speed_en(66 + 6, MBASE(3)); // "Speed" - say_z(106 + 9, MBASE(3)); // "Z" - - draw_max_en(MBASE(4)); // "Max" - draw_corner_en(MBASE(4)); // "Corner" - draw_speed_en(66 + 6, MBASE(4)); // "Speed" - say_e(106 + 9, MBASE(4)); // "E" } Draw_Back_First(); @@ -2775,7 +2807,7 @@ inline void Draw_Max_Jerk_Menu() { inline void Draw_Steps_Menu() { Clear_Main_Window(); - if (HMI_flag.language_flag) { + if (HMI_flag.language_chinese) { DWIN_Frame_AreaCopy(1, 1, 16, 271 - 243, 479 - 451, 14, 8); DWIN_Frame_AreaCopy(1, 153, 148, 271 - 77, 479 - 318, LBLX, MBASE(1)); @@ -2789,14 +2821,18 @@ inline void Draw_Steps_Menu() { } else { #ifdef USE_STRING_HEADINGS - Draw_Title("Steps-per-mm"); // TODO: GET_TEXT_F + Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 0), (char*)"Steps/mm X"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 1), (char*)"Steps/mm Y"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 2), (char*)"Steps/mm Z"); + DWIN_Draw_String(false, true, font8x16, White, Background_black, 60, 102 + (MLINE * 3), (char*)"Steps/mm E"); #else DWIN_Frame_AreaCopy(1, 144, 16, 271 - 82, 479 - 453, 14, 8); + draw_steps_per_mm(MBASE(1)); say_x(100 + 3, MBASE(1)); // "Steps-per-mm X" + draw_steps_per_mm(MBASE(2)); say_y(100 + 3, MBASE(2)); // "Y" + draw_steps_per_mm(MBASE(3)); say_z(100 + 3, MBASE(3)); // "Z" + draw_steps_per_mm(MBASE(4)); say_e(100 + 3, MBASE(4)); // "E" #endif - draw_steps_per_mm(MBASE(1)); say_x(100 + 3, MBASE(1)); // "Steps-per-mm X" - draw_steps_per_mm(MBASE(2)); say_y(100 + 3, MBASE(2)); // "Y" - draw_steps_per_mm(MBASE(3)); say_z(100 + 3, MBASE(3)); // "Z" - draw_steps_per_mm(MBASE(4)); say_e(100 + 3, MBASE(4)); // "E" } Draw_Back_First(); @@ -2947,16 +2983,16 @@ void HMI_Tune(void) { break; case 6: // Language // Select language - HMI_flag.language_flag = !HMI_flag.language_flag; + HMI_flag.language_chinese ^= true; Clear_Main_Window(); - if (HMI_flag.language_flag) { - set_chinese_to_eeprom(); + if (HMI_flag.language_chinese) { + HMI_SetAndSaveLanguageChinese(); DWIN_JPG_CacheTo1(Language_Chinese); } else { - set_english_to_eeprom(); + HMI_SetAndSaveLanguageWestern(); DWIN_JPG_CacheTo1(Language_English); } @@ -3304,7 +3340,7 @@ void HMI_Init(void) { delay(20); } - lcd_select_language(); + HMI_SetLanguage(); #if ENABLED(FIX_MOUNTED_PROBE) // For "CREALITY_TOUCH" probe too? SET_OUTPUT(COM_PIN); @@ -3345,7 +3381,7 @@ void EachMomentUpdate(void) { // show print done confirm DWIN_Draw_Rectangle(1, Background_black, 0, 250, 271, 360); - DWIN_ICON_Show(ICON, HMI_flag.language_flag ? ICON_Confirm_C : ICON_Confirm_E, 86, 302 - 19); + DWIN_ICON_Show(ICON, HMI_flag.language_chinese ? ICON_Confirm_C : ICON_Confirm_E, 86, 302 - 19); } else if (HMI_flag.pause_flag != printingIsPaused()) { // print status update diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/dwin.h index cddc582fc2ba..3446a0d4c18e 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/dwin.h @@ -244,7 +244,7 @@ typedef struct { } HMI_value_t; typedef struct { - bool language_flag; // 0: EN, 1: CN + bool language_chinese; // 0: EN, 1: CN bool pause_flag:1; bool print_finish:1; bool confirm_flag:1; @@ -269,9 +269,9 @@ extern HMI_value_t HMI_ValueStruct; extern HMI_Flag HMI_flag; // Language -void lcd_select_language(void); -void set_english_to_eeprom(void); -void set_chinese_to_eeprom(void); +void HMI_SetLanguage(void); +void HMI_SetAndSaveLanguageWestern(void); +void HMI_SetAndSaveLanguageChinese(void); // Show ICO void ICON_Print(bool show); From aa92fa7ee3d9ee62356b9dc7e600a1633c100ebe Mon Sep 17 00:00:00 2001 From: Greg Nutt Date: Sat, 22 Aug 2020 00:47:25 -0400 Subject: [PATCH 391/483] DIGIPOT_I2C pins for SMOOTHIEBOARD (#19098) --- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 0712a274bbe6..c9bd9ec3ae1a 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -114,3 +114,20 @@ #error "Marlin's Smoothieboard support cannot drive your LCD." #endif + +/** + * I2C Digipots - MCP4451 + * Address 58 (2C << 1) + * Set from 0 - 127 with stop bit. + * (Ex. 3F << 1 | 1) + */ +#define DIGIPOTS_I2C_SCL P0_0 +#define DIGIPOTS_I2C_SDA_X P0_04 +#define DIGIPOTS_I2C_SDA_Y P0_10 +#define DIGIPOTS_I2C_SDA_Z P0_19 +#define DIGIPOTS_I2C_SDA_E0 P0_21 +#define DIGIPOTS_I2C_SDA_E1 P4_29 + +#ifndef DIGIPOT_I2C_ADDRESS_A + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address (58 <- 2C << 1) +#endif From b6e4acec9df3cfef5dc733f8c32a7375715ddd12 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 22 Aug 2020 06:49:39 +0200 Subject: [PATCH 392/483] Prefer Servo AVR timer4 over 3 (#19025) --- Marlin/src/HAL/AVR/ServoTimers.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/HAL/AVR/ServoTimers.h b/Marlin/src/HAL/AVR/ServoTimers.h index 598db62578d4..436b28141f95 100644 --- a/Marlin/src/HAL/AVR/ServoTimers.h +++ b/Marlin/src/HAL/AVR/ServoTimers.h @@ -59,9 +59,9 @@ // Say which 16 bit timers can be used and in what order #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) //#define _useTimer1 - #define _useTimer3 + #define _useTimer4 #if NUM_SERVOS > SERVOS_PER_TIMER - #define _useTimer4 + #define _useTimer3 #if !HAS_MOTOR_CURRENT_PWM && SERVOS > 2 * SERVOS_PER_TIMER #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. #endif From 8cededa7dd8501d24bcfed56bfd82720b1c4885a Mon Sep 17 00:00:00 2001 From: mmajoor Date: Sat, 22 Aug 2020 07:35:39 +0200 Subject: [PATCH 393/483] Permit ST7789V orientation override (#19044) --- Marlin/src/lcd/tft/st7789v.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/tft/st7789v.h b/Marlin/src/lcd/tft/st7789v.h index 6ed7c0ce6604..f6e937c2c2b3 100644 --- a/Marlin/src/lcd/tft/st7789v.h +++ b/Marlin/src/lcd/tft/st7789v.h @@ -39,7 +39,9 @@ #define ST7789V_ORIENTATION_DOWN 0 // 240x320 ; Cable on the lower side //#define ST7789V_COLOR_BGR -#define ST7789V_ORIENTATION ST7789V_ORIENTATION_LEFT +#ifndef ST7789V_ORIENTATION + #define ST7789V_ORIENTATION ST7789V_ORIENTATION_LEFT +#endif #define ST7789V_MADCTL_DATA (ST7789V_ORIENTATION | TERN(ST7789V_COLOR_BGR, ST7789V_MADCTL_BGR, ST7789V_MADCTL_RGB)) #define ST7789V_NOP 0x00 // No Operation From a9f7e855d8c030d0d9f34f950a66824b576548b5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 22 Aug 2020 01:22:14 -0500 Subject: [PATCH 394/483] Reformat pins files --- Marlin/src/pins/linux/pins_RAMPS_LINUX.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 2 +- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 4 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 2 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 2 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 4 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN.h | 2 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 2 +- Marlin/src/pins/mega/pins_INTAMSYS40.h | 2 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 2 +- Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h | 4 +- Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h | 2 +- Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 2 +- Marlin/src/pins/sam/pins_RADDS.h | 2 +- Marlin/src/pins/sam/pins_RAMPS_SMART.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 2 +- Marlin/src/pins/samd/pins_RAMPS_144.h | 2 +- Marlin/src/pins/stm32f0/pins_MALYAN_M300.h | 4 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 10 +- .../stm32f1/pins_BTT_SKR_MINI_E3_common.h | 8 +- .../src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h | 4 +- .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 8 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 2 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 2 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 6 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 6 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 6 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 8 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 8 +- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 8 +- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 8 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 4 +- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 2 +- Marlin/src/pins/stm32f1/pins_MALYAN_M200.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 2 +- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 11 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 4 +- .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 2 +- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 148 +++++++++--------- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 148 +++++++++--------- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 2 +- Marlin/src/pins/stm32f4/pins_ARMED.h | 4 +- Marlin/src/pins/stm32f4/pins_BEAST.h | 148 +++++++++--------- .../src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 2 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 4 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 4 +- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 4 +- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 4 +- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 4 +- .../src/pins/stm32f4/pins_GENERIC_STM32F4.h | 4 +- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 4 +- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 10 +- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 6 +- Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h | 4 +- Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 4 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 2 +- Marlin/src/pins/stm32f7/pins_THE_BORG.h | 4 +- Marlin/src/pins/teensy2/pins_5DPRINT.h | 2 +- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 2 +- 67 files changed, 343 insertions(+), 344 deletions(-) diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h index 9361680c2371..2b7909221ec9 100644 --- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h +++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h @@ -50,7 +50,7 @@ #endif #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif #define IS_RAMPS_EFB diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index 9e26a335974b..fb1218068eb3 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -182,7 +182,7 @@ #define E1_SERIAL_RX_PIN P1_01 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif /** diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 83543703e540..69f4f2445121 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -208,7 +208,7 @@ #define Z2_SERIAL_RX_PIN P1_01 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index cc35dfb0d4eb..bfae569cc422 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -30,7 +30,7 @@ #endif // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Steppers diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 7012068d615b..6bba067cbef8 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -28,7 +28,7 @@ #define BOARD_INFO_NAME "GMARSH X6 REV1" // Ignore temp readings during develpment. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Enable 12MHz clock output on P1.27 pin to sync TMC2208 chip clocks @@ -97,7 +97,7 @@ #define E2_SERIAL_RX_PIN P2_06 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #else #error "TMC2208 UART configuration is required for GMarsh X6." #endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index db8551c114a1..c89807227892 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -324,7 +324,7 @@ #define E0_SERIAL_RX_PIN P0_26 // TH4 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // UNUSED diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index c4bc90c17f67..733751eb0a8e 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -188,7 +188,7 @@ #define Z2_SERIAL_RX_PIN P1_17 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // TMC2208 || TMC2209 // diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 554c060cb44f..32c9ad271187 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -158,7 +158,7 @@ #endif // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index 042b724e8cfd..8d5080b28033 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -82,11 +82,11 @@ // DIGIPOT slave addresses // #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT #endif #ifndef DIGIPOT_I2C_ADDRESS_B - #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT #endif // diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index 23275e86b6c8..c9f3ff7aae26 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -56,5 +56,5 @@ #define E1_SERIAL_RX_PIN P4_28 // J8-6 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index a1d3b08caa8f..81f5b75016c3 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -89,7 +89,7 @@ #define E0_SERIAL_RX_PIN P0_21 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h index 19725eda2ffd..b6ff30a4fc23 100644 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -82,7 +82,7 @@ // Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range #ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 2000 + #define MOTOR_CURRENT_PWM_RANGE 2000 #endif #define DEFAULT_PWM_MOTOR_CURRENT { 1300, 1300, 1250 } diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index efa99164208d..526c9bfc68b9 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -116,7 +116,7 @@ #define DIGIPOTS_I2C_SDA_E1 77 // J6 #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1) + #define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1) #endif // diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h index a23ada0aca2f..5eee450fc507 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -67,10 +67,10 @@ // DIGIPOT slave addresses #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT 0x2C (0x58 <- 0x2C << 1) + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT 0x2C (0x58 <- 0x2C << 1) #endif #ifndef DIGIPOT_I2C_ADDRESS_B - #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT 0x2E (0x5C <- 0x2E << 1) + #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT 0x2E (0x5C <- 0x2E << 1) #endif // diff --git a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h index b2a412e305c8..1dc898e6ca9a 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h @@ -64,5 +64,5 @@ #define SUICIDE_PIN 12 // Used by CR2020 Industrial series #ifndef SUICIDE_PIN_INVERTING - #define SUICIDE_PIN_INVERTING true + #define SUICIDE_PIN_INVERTING true #endif diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index 5d8716b67887..be6b0fb2ed86 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -147,7 +147,7 @@ #define FET_SAFETY_PIN 31 // PA7 must be pulsed low every 50 mS or FETs are turned off #define FET_SAFETY_DELAY 50 // 50 mS delay between pulses -#define FET_SAFETY_INVERTED true // true - negative going pulse of 2 uS +#define FET_SAFETY_INVERTED true // true - negative going pulse of 2 uS ///////////////////////////////////////////////////////// diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index 78231afaffa2..a0192aadb6f4 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -36,7 +36,7 @@ // #if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB #endif // diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h index 4c26d19cafdb..06eee2d970eb 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_SMART.h +++ b/Marlin/src/pins/sam/pins_RAMPS_SMART.h @@ -70,7 +70,7 @@ // I2C EEPROM with 4K of space #define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 +#define MARLIN_EEPROM_SIZE 0x1000 #define RESET_PIN 42 // Resets the board if the jumper is attached diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 22353611b61b..dd490e38933a 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -186,7 +186,7 @@ // // EEPROM // -#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) +#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) #define I2C_EEPROM // EEPROM on I2C-0 //#define EEPROM_SD // EEPROM on SDCARD //#define SPI_EEPROM // EEPROM on SPI-0 diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 19b8ac97754b..8a6287fb659f 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -172,7 +172,7 @@ // // EEPROM // -#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) +#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) #define I2C_EEPROM // EEPROM on I2C-0 //#define EEPROM_SD // EEPROM on SDCARD //#define SPI_EEPROM // EEPROM on SPI-0 diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index 319584b5eb56..93e758b3ae66 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -46,7 +46,7 @@ // //#define QSPI_EEPROM // Use AGCM4 onboard QSPI EEPROM (Uses 4K of RAM) #define I2C_EEPROM // EEPROM on I2C-0 -#define MARLIN_EEPROM_SIZE 0x8000 // 32K (24lc256) +#define MARLIN_EEPROM_SIZE 0x8000 // 32K (24lc256) // // Limit Switches diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h index b8c2ed950392..d6a83aca1a30 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h @@ -43,8 +43,8 @@ // // Timers // -#define STEP_TIMER 6 -#define TEMP_TIMER 7 +#define STEP_TIMER 6 +#define TEMP_TIMER 7 // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 3801a9bae4b5..cff34daf2f02 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -31,7 +31,7 @@ #define DISABLE_JTAG // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION @@ -138,7 +138,7 @@ #define E0_SERIAL_RX_PIN PD2 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // @@ -158,7 +158,7 @@ // USB connect control // #define USB_CONNECT_PIN PC13 -#define USB_CONNECT_INVERTING false +#define USB_CONNECT_INVERTING false /** * _____ @@ -260,7 +260,7 @@ * */ - #define CLCD_SPI_BUS 1 // SPI1 connector + #define CLCD_SPI_BUS 1 // SPI1 connector #define BEEPER_PIN PB6 @@ -288,5 +288,5 @@ #error "SD CUSTOM_CABLE is not compatible with SKR E3 DIP." #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index a8df0e5c02df..923b0fa4c1b2 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -29,7 +29,7 @@ #define DISABLE_JTAG // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION @@ -108,7 +108,7 @@ #define USB_CONNECT_PIN PC13 #endif -#define USB_CONNECT_INVERTING false +#define USB_CONNECT_INVERTING false /** * SKR Mini E3 V1.0, V1.2 SKR Mini E3 V2.0 @@ -208,7 +208,7 @@ * */ - #define CLCD_SPI_BUS 1 // SPI1 connector + #define CLCD_SPI_BUS 1 // SPI1 connector #define BEEPER_PIN EXP1_9 @@ -236,5 +236,5 @@ #error "SD CUSTOM_CABLE is not compatible with SKR Mini E3." #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index db31eb377fcb..4a12d5d32db0 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -31,7 +31,7 @@ #define DISABLE_JTAG // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION @@ -213,5 +213,5 @@ #define MOSI_PIN PA7 #define SS_PIN PA4 #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index f99721f144a6..af1e4c114518 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -43,9 +43,9 @@ // #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE 0x800U // 2KB + #define EEPROM_PAGE_SIZE 0x800U // 2KB #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -95,7 +95,7 @@ #define E0_SERIAL_RX_PIN PC4 // Reduce baud rate to improve software serial reliability -#define TMC_BAUD_RATE 19200 +#define TMC_BAUD_RATE 19200 // // Temperature Sensors @@ -173,7 +173,7 @@ #define SS_PIN PA4 #endif -#define ON_BOARD_SPI_DEVICE 1 // SPI1 +#define ON_BOARD_SPI_DEVICE 1 // SPI1 #define ONBOARD_SD_CS_PIN PA4 // Chip select for SD-NAND #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index e3b7d2f547cf..bf9a7d8e0543 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -36,7 +36,7 @@ //#define I2C_EEPROM // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Steppers diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index 5267888f441d..54ff9a779a30 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -177,7 +177,7 @@ // Emulated DOGM - #define GRAPHICAL_TFT_UPSCALE 3 + #define GRAPHICAL_TFT_UPSCALE 3 #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12316 #endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index d128d4e1ae00..a825db275c6a 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -186,7 +186,7 @@ // Emulated DOGM #elif ENABLED(FSMC_GRAPHICAL_TFT) - #define GRAPHICAL_TFT_UPSCALE 3 + #define GRAPHICAL_TFT_UPSCALE 3 #ifndef XPT2046_X_CALIBRATION #define XPT2046_X_CALIBRATION -12316 diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index f42d78669555..9ee8aa742365 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -51,10 +51,10 @@ #if ENABLED(IIC_BL24CXX_EEPROM) #define IIC_EEPROM_SDA PA11 #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) #else #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb #endif // SPI @@ -150,7 +150,7 @@ // #define SD_DETECT_PIN PC7 #define SDCARD_CONNECTION ONBOARD -#define ON_BOARD_SPI_DEVICE 1 +#define ON_BOARD_SPI_DEVICE 1 #define ONBOARD_SD_CS_PIN PA4 // SDSS #define SDIO_SUPPORT diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index 6a30a2cb23ce..ca9364a570d9 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -33,7 +33,7 @@ #define pins_v2_20190128 // new pins define // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Flash EEPROM Emulation @@ -112,7 +112,7 @@ // Stepper current PWM // #ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 1500 // origin:2000 + #define MOTOR_CURRENT_PWM_RANGE 1500 // origin:2000 #endif #define DEFAULT_PWM_MOTOR_CURRENT { 500, 500, 400 } // origin: {1300,1300,1250} @@ -152,7 +152,7 @@ #define DOGLCD_CS PB7 #endif - //#define LCD_CONTRAST_INIT 190 + //#define LCD_CONTRAST_INIT 190 //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 7143176bd7fc..1f5e70a15a28 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -32,7 +32,7 @@ // https://github.com/FYSETC/Cheetah // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 #define DISABLE_JTAG @@ -151,7 +151,7 @@ #define LCD_PINS_D4 PB13 // SCLK #define LCD_PINS_ENABLE PB15 // DATA MOSI - //#define LCD_CONTRAST_INIT 190 + //#define LCD_CONTRAST_INIT 190 #if ENABLED(NEWPANEL) #define BTN_EN1 PC10 @@ -172,6 +172,6 @@ #define CLCD_SOFT_SPI_MISO PB14 #define CLCD_SOFT_SPI_SCLK PB13 #else - #define CLCD_SPI_BUS 2 + #define CLCD_SPI_BUS 2 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index 03f9ce0216e4..fe6c0b1325c9 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -49,12 +49,12 @@ //#define DISABLE_JTAGSWD // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -236,6 +236,6 @@ // ESP WiFi can be soldered to J9 connector which is wired to USART2. // Must define WIFISUPPORT in Configuration.h for the printer. // -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 #define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 3f5a39a90c03..716de610a710 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -49,12 +49,12 @@ //#define DISABLE_JTAGSWD // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -230,6 +230,6 @@ // ESP WiFi can be soldered to J9 connector which is wired to USART2. // Must define WIFISUPPORT in Configuration.h for the printer. // -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 #define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index 03f9ce0216e4..fe6c0b1325c9 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -49,12 +49,12 @@ //#define DISABLE_JTAGSWD // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -236,6 +236,6 @@ // ESP WiFi can be soldered to J9 connector which is wired to USART2. // Must define WIFISUPPORT in Configuration.h for the printer. // -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 #define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index c39c89e42cec..1fc4fa94249e 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -49,12 +49,12 @@ //#define DISABLE_JTAGSWD // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM #if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // @@ -233,6 +233,6 @@ // ESP WiFi can be soldered to J9 connector which is wired to USART2. // Must define WIFISUPPORT in Configuration.h for the printer. // -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 #define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index dcd1c868f4c0..d474eb25f6a7 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -43,10 +43,10 @@ // Enable EEPROM Emulation for this board, so that we don't overwrite factory data //#define I2C_EEPROM // AT24C64 -//#define MARLIN_EEPROM_SIZE 0x8000UL // 64KB +//#define MARLIN_EEPROM_SIZE 0x8000UL // 64KB //#define FLASH_EEPROM_EMULATION -//#define MARLIN_EEPROM_SIZE 0x1000UL // 4KB +//#define MARLIN_EEPROM_SIZE 0x1000UL // 4KB //#define MARLIN_EEPROM_SIZE (EEPROM_START_ADDRESS + (EEPROM_PAGE_SIZE) * 2UL) //#define EEPROM_CHITCHAT diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 32e7e2993c75..cbc43a7ac806 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -130,7 +130,7 @@ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h #define DOGLCD_SCK -1 -#define GRAPHICAL_TFT_UPSCALE 2 +#define GRAPHICAL_TFT_UPSCALE 2 #define TFT_WIDTH 320 #define TFT_HEIGHT 240 #define TFT_PIXEL_OFFSET_X 32 diff --git a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h index 6a8f316b0dc2..39c52ab0d30e 100644 --- a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h +++ b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h @@ -44,8 +44,8 @@ // On STM32F103: // PB3, PB6, PB7, and PB8 can be used with pwm, which rules out TIM2 and TIM4. // On STM32F070, 16 and 17 are in use, but 1 and 3 are available. -#define STEP_TIMER 1 -#define TEMP_TIMER 3 +#define STEP_TIMER 1 +#define TEMP_TIMER 3 // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 5193ddad2329..1ab9165830e0 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -212,6 +212,6 @@ // Reduce baud rate for software serial reliability #if HAS_TMC_SW_SERIAL - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 0f55de824573..1346e8099a65 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -105,7 +105,7 @@ #define E0_SERIAL_RX_PIN PC11 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 716cb1637556..cb3ab62cc25c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -81,7 +81,6 @@ #define E0_STEP_PIN PD6 #define E0_DIR_PIN PD3 - // Motor current PWM pins #define MOTOR_CURRENT_PWM_XY_PIN PA6 #define MOTOR_CURRENT_PWM_Z_PIN PA7 @@ -113,7 +112,7 @@ #define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) #define MT_DET_1_PIN PA4 -#define MT_DET_PIN_INVERTING false +#define MT_DET_PIN_INVERTING false #define WIFI_IO0_PIN PC13 @@ -149,9 +148,9 @@ #define FSMC_CS_PIN PD7 // NE4 #define FSMC_RS_PIN PD11 // A0 - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 + #define FSMC_DMA_CHANNEL DMA_CH5 #define LCD_RESET_PIN PC6 // FSMC_RST #define LCD_BACKLIGHT_PIN PD13 @@ -163,7 +162,7 @@ #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI #endif -#elif ENABLED(TFT_320x240) //TFT32/28 +#elif ENABLED(TFT_320x240) //TFT32/28 #define TFT_RESET_PIN PC6 #define TFT_BACKLIGHT_PIN PD13 @@ -190,7 +189,7 @@ #define ILI9341_COLOR_RGB #endif -#define HAS_SPI_FLASH 1 +#define HAS_SPI_FLASH 1 #define SPI_FLASH_SIZE 0x1000000 // 16MB #if HAS_SPI_FLASH #define W25QXX_CS_PIN PB12 // Flash chip-select diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 6a015a470977..83b3bcc42db4 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -188,7 +188,7 @@ #define FSMC_DMA_CHANNEL DMA_CH5 #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 #endif // LVGL Configs @@ -206,7 +206,7 @@ #define DOGLCD_SCK -1 #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 + #define GRAPHICAL_TFT_UPSCALE 3 #endif #ifndef TFT_WIDTH #define TFT_WIDTH 480 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 0f9e6eb371b7..228049d139bd 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -311,7 +311,7 @@ #endif #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 + #define GRAPHICAL_TFT_UPSCALE 3 #endif #ifndef TFT_PIXEL_OFFSET_Y #define TFT_PIXEL_OFFSET_Y 32 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 3ca59a93a3c1..c00466677a25 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -41,7 +41,7 @@ // // Note: MKS Robin board is using SPI2 interface. // -//#define SPI_MODULE 2 +//#define SPI_MODULE 2 #define ENABLE_SPI2 // diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index 475f31cb71c3..63fb383c9b52 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -33,7 +33,7 @@ #define DEFAULT_MACHINE_NAME "STM32F103RET6" // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches @@ -100,9 +100,9 @@ #if HAS_SPI_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock #elif BOTH(NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -118,13 +118,13 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 #endif #endif @@ -132,125 +132,125 @@ #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN 37 + #define BEEPER_PIN 37 - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 + #define LCD_BACKLIGHT_PIN 39 #endif #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 #elif ENABLED(LCD_I2C_PANELOLU2) - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 #define SD_DETECT_PIN -1 - #define KILL_PIN 41 + #define KILL_PIN 41 #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 #elif ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 #define LCD_SCREEN_ROT_180 - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 - #define SDSS 53 + #define SDSS 53 #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - #define KILL_PIN 31 + #define KILL_PIN 31 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 #elif ENABLED(MINIPANEL) - #define BEEPER_PIN 42 + #define BEEPER_PIN 42 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 - #define KILL_PIN 64 + #define KILL_PIN 64 // GLCD features // Uncomment screen orientation //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 // not connected to a pin - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN 49 #else // Beeper on AUX-4 - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 #endif #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #else //#define SD_DETECT_PIN -1 // Ramps doesn't use this #endif diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index eb7fc9493955..c18642fb1df1 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -36,7 +36,7 @@ #define I2C_EEPROM // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches @@ -115,9 +115,9 @@ #if HAS_SPI_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock #elif BOTH(NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -133,13 +133,13 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 #endif #endif @@ -155,126 +155,126 @@ #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN 37 + #define BEEPER_PIN 37 - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 + #define LCD_BACKLIGHT_PIN 39 #endif #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 #elif ENABLED(LCD_I2C_PANELOLU2) - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 #define SD_DETECT_PIN -1 - #define KILL_PIN 41 + #define KILL_PIN 41 #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 #elif ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 #define LCD_SCREEN_ROT_180 - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 - #define SDSS 53 + #define SDSS 53 #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - #define KILL_PIN 31 + #define KILL_PIN 31 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 #elif ENABLED(MINIPANEL) - #define BEEPER_PIN 42 + #define BEEPER_PIN 42 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 - #define KILL_PIN 64 + #define KILL_PIN 64 // GLCD features // Uncomment screen orientation //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 // not connected to a pin - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN 49 #else // Beeper on AUX-4 - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 #endif #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #else //#define SD_DETECT_PIN -1 // Ramps doesn't use this #endif diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index c0a0c016b0bc..598db026fd94 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -92,7 +92,7 @@ // #define HEATER_0_PIN PG12 // HEATER1 #define HEATER_BED_PIN PG11 // HOT BED -#define HEATER_BED_INVERTING true +#define HEATER_BED_INVERTING true // // Fans diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h index 232337f6df99..696241693629 100644 --- a/Marlin/src/pins/stm32f4/pins_ARMED.h +++ b/Marlin/src/pins/stm32f4/pins_ARMED.h @@ -39,7 +39,7 @@ #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME #define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB // // Limit Switches @@ -225,5 +225,5 @@ #define Z2_SERIAL_RX_PIN EXT4_PIN #define Z2_SERIAL_TX_PIN EXT4_PIN - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h index 676f1f8c9bfb..691b468c343a 100644 --- a/Marlin/src/pins/stm32f4/pins_BEAST.h +++ b/Marlin/src/pins/stm32f4/pins_BEAST.h @@ -36,7 +36,7 @@ #define I2C_EEPROM // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Steppers @@ -123,9 +123,9 @@ #if HAS_SPI_LCD #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock #elif BOTH(NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_ENABLE PD2 @@ -141,13 +141,13 @@ #define LCD_PINS_D6 PB14 #define LCD_PINS_D7 PB15 #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons attached to a shift register // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 #endif #endif @@ -155,126 +155,126 @@ #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN 37 + #define BEEPER_PIN 37 - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 + #define LCD_BACKLIGHT_PIN 39 #endif #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 #elif ENABLED(LCD_I2C_PANELOLU2) - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 #define SD_DETECT_PIN -1 - #define KILL_PIN 41 + #define KILL_PIN 41 #elif ENABLED(LCD_I2C_VIKI) - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 #elif ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 #define LCD_SCREEN_ROT_180 - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 - #define SDSS 53 + #define SDSS 53 #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - #define KILL_PIN 31 + #define KILL_PIN 31 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 #elif ENABLED(MINIPANEL) - #define BEEPER_PIN 42 + #define BEEPER_PIN 42 // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 - #define KILL_PIN 64 + #define KILL_PIN 64 // GLCD features // Uncomment screen orientation //#define LCD_SCREEN_ROT_90 //#define LCD_SCREEN_ROT_180 //#define LCD_SCREEN_ROT_270 // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 // not connected to a pin - #define SD_DETECT_PIN 49 + #define SD_DETECT_PIN 49 #else // Beeper on AUX-4 - #define BEEPER_PIN 33 + #define BEEPER_PIN 33 // Buttons directly attached to AUX-2 #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 #endif #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 #else //#define SD_DETECT_PIN -1 // Ramps doesn't use this #endif diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index e6350f71dcdb..dc0dab1cd15d 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -41,7 +41,7 @@ //#define I2C_EEPROM #define SRAM_EEPROM_EMULATION -#define MARLIN_EEPROM_SIZE 0x2000 // 8KB +#define MARLIN_EEPROM_SIZE 0x2000 // 8KB // // Servos diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index 0e81237ad91b..d3510b1ff815 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -42,7 +42,7 @@ #endif // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches @@ -153,7 +153,7 @@ #define E0_SERIAL_RX_PIN PD7 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index 776ab1d811b2..bc882316e7db 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -33,7 +33,7 @@ // Onboard I2C EEPROM #define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24C64 ... 64Kb = 8KB) +#define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24C64 ... 64Kb = 8KB) #define TP // Enable to define servo and probe pins @@ -223,7 +223,7 @@ #define E7_SERIAL_RX_PIN PH14 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index b6bb854d5be0..e13c4a227aae 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -212,7 +212,7 @@ #define E2_SERIAL_RX_PIN PD6 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #define TMC_BAUD_RATE 19200 #endif // @@ -366,7 +366,7 @@ *  ̄ ̄ * W1 */ -#define ESP_WIFI_MODULE_COM 6 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this +#define ESP_WIFI_MODULE_COM 6 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this #define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT & SERIAL_PORT_2 #define ESP_WIFI_MODULE_RESET_PIN PG0 #define ESP_WIFI_MODULE_ENABLE_PIN PG1 diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 499edc8dc0a7..a3a5ccdff8dc 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -45,11 +45,11 @@ // the 128kB sector allocated for EEPROM emulation. #define FLASH_EEPROM_LEVELING #elif ENABLED(I2C_EEPROM) - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB #endif #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 03960584fb2f..116aa14cf1da 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -35,7 +35,7 @@ #endif // Change the priority to 3. Priority 2 is for software serial. -//#define TEMP_TIMER_IRQ_PRIO 3 +//#define TEMP_TIMER_IRQ_PRIO 3 // // EEPROM Emulation @@ -51,7 +51,7 @@ // 128 kB sector allocated for EEPROM emulation. #define FLASH_EEPROM_LEVELING #elif ENABLED(I2C_EEPROM) - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h index b84c72466729..44b2e6b27cbc 100644 --- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h +++ b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h @@ -37,11 +37,11 @@ //#define I2C_EEPROM #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 126d571464ee..0f0d3d048c71 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -147,10 +147,10 @@ // Misc. Functions // #define SDSS PC11 -#define LED_PIN PA15 // Alive +#define LED_PIN PA15 // Alive #define PS_ON_PIN -1 #define KILL_PIN -1 -#define POWER_LOSS_PIN PA4 // Power-loss / nAC_FAULT +#define POWER_LOSS_PIN PA4 // Power-loss / nAC_FAULT #define SCK_PIN PC12 #define MISO_PIN PC8 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index 8f9a4339cd07..d20fd5a6c1fb 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -27,8 +27,8 @@ #define BOARD_INFO_NAME "Lerdge S" #define DEFAULT_MACHINE_NAME "LERDGE" -#define STEP_TIMER 4 -#define TEMP_TIMER 2 +#define STEP_TIMER 4 +#define TEMP_TIMER 2 //#define I2C_EEPROM @@ -173,15 +173,15 @@ #if ENABLED(SPI_EEPROM) // Lerdge has an SPI EEPROM Winbond W25Q128 (128Mbits) https://www.pjrc.com/teensy/W25Q128FV.pdf - #define SPI_CHAN_EEPROM1 1 + #define SPI_CHAN_EEPROM1 1 #define SPI_EEPROM1_CS PB12 // datasheet: /CS pin, found with multimeter, not tested #define EEPROM_SCK PB13 // datasheet: CLK pin, found with multimeter, not tested #define EEPROM_MISO PB14 // datasheet: DO pin, found with multimeter, not tested #define EEPROM_MOSI PB15 // datasheet: DI pin, found with multimeter, not tested - #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) + #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64KB for now... #else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM + #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM #endif // diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 745d911e3a7a..da2851c1316d 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -27,8 +27,8 @@ #define BOARD_INFO_NAME "Lerdge X" #define DEFAULT_MACHINE_NAME "LERDGE" -#define STEP_TIMER 4 -#define TEMP_TIMER 2 +#define STEP_TIMER 4 +#define TEMP_TIMER 2 #define I2C_EEPROM @@ -115,7 +115,7 @@ #define KILL_PIN -1 // Lerdge supports auto-power off and power loss sense through a single pin. -#define POWER_LOSS_PIN PC14 // Power-loss / nAC_FAULT +#define POWER_LOSS_PIN PC14 // Power-loss / nAC_FAULT #define SCK_PIN PC12 #define MISO_PIN PC8 diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h index de8d13c546dd..a60a2781495c 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h @@ -33,10 +33,10 @@ #if NO_EEPROM_SELECTED #if MB(RUMBA32_V1_0) #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #elif MB(RUMBA32_V1_1) #define I2C_EEPROM - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24LC64T-I/OT) + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24LC64T-I/OT) #endif #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h index d67962b1a61e..fe6e559bdb8e 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h @@ -37,7 +37,7 @@ #if NO_EEPROM_SELECTED #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB #endif #if ENABLED(FLASH_EEPROM_EMULATION) diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index aa481a8b7433..3b513b31ca8c 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -44,8 +44,8 @@ // TIM7 is used for SERVO // TIMER_SERIAL defaults to TIM7 so we'll override it here // -#define STEP_TIMER 10 -#define TEMP_TIMER 14 +#define STEP_TIMER 10 +#define TEMP_TIMER 14 #define TIMER_SERIAL TIM9 #define HAL_TIMER_RATE F_CPU diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index 01e9da590a58..d34458c04498 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -31,7 +31,7 @@ #define BOARD_INFO_NAME "STM32F4 VAkE" //#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB // // Servos diff --git a/Marlin/src/pins/stm32f7/pins_THE_BORG.h b/Marlin/src/pins/stm32f7/pins_THE_BORG.h index fa4279920ca0..756f495e4b2e 100644 --- a/Marlin/src/pins/stm32f7/pins_THE_BORG.h +++ b/Marlin/src/pins/stm32f7/pins_THE_BORG.h @@ -31,11 +31,11 @@ #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 + #define MARLIN_EEPROM_SIZE 0x1000 #endif // Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // // Limit Switches diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h index f473ad145e62..7ba1fbcf8db8 100644 --- a/Marlin/src/pins/teensy2/pins_5DPRINT.h +++ b/Marlin/src/pins/teensy2/pins_5DPRINT.h @@ -144,5 +144,5 @@ //DIGIPOTS slave addresses #ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for DIGIPOT 0x2C (0x58 <- 0x2C << 1) + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for DIGIPOT 0x2C (0x58 <- 0x2C << 1) #endif diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index 7bf0f334f4ee..83b17b65606c 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -158,7 +158,7 @@ #define DAC_STEPPER_MAX 3520 #define DAC_STEPPER_VREF 1 // internal Vref, gain 1x = 2.048V #define DAC_STEPPER_GAIN 0 -#define DAC_OR_ADDRESS 0x00 +#define DAC_OR_ADDRESS 0x00 // // Temperature Sensors From 434e43cc42f782d5fbe89db21f97571c71ad62f3 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sat, 22 Aug 2020 09:04:28 +0200 Subject: [PATCH 395/483] Change XY_PROBE_SPEED format to (x*60) (#18997) --- Marlin/Configuration.h | 18 +++++++++--------- Marlin/Configuration_adv.h | 20 ++++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2b36f883cc2f..2639bcd97b64 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -235,8 +235,8 @@ #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) - #define MPE_FAST_SPEED 9000 // (mm/m) Speed for travel before last distance point - #define MPE_SLOW_SPEED 4500 // (mm/m) Speed for last distance travel to park and couple + #define MPE_FAST_SPEED 9000 // (mm/min) Speed for travel before last distance point + #define MPE_SLOW_SPEED 4500 // (mm/min) Speed for last distance travel to park and couple #define MPE_TRAVEL_DISTANCE 10 // (mm) Last distance point #define MPE_COMPENSATION 0 // Offset Compensation -1 , 0 , 1 (multiplier) only for coupling @@ -284,8 +284,8 @@ #if ENABLED(PRIME_BEFORE_REMOVE) #define SWITCHING_TOOLHEAD_PRIME_MM 20 // (mm) Extruder prime length #define SWITCHING_TOOLHEAD_RETRACT_MM 10 // (mm) Retract after priming length - #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/m) Extruder prime feedrate - #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/m) Extruder retract feedrate + #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/min) Extruder prime feedrate + #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/min) Extruder retract feedrate #endif #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) #define SWITCHING_TOOLHEAD_Z_HOP 2 // (mm) Z raise for switching @@ -999,13 +999,13 @@ // with NOZZLE_AS_PROBE this can be negative for a wider probing area. #define PROBING_MARGIN 10 -// X and Y axis travel speed (mm/m) between probes -#define XY_PROBE_SPEED 8000 +// X and Y axis travel speed (mm/min) between probes +#define XY_PROBE_SPEED (133*60) -// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) #define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z -// Feedrate (mm/m) for the "accurate" probe of each point +// Feedrate (mm/min) for the "accurate" probe of each point #define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) /** @@ -1399,7 +1399,7 @@ #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing #endif -// Homing speeds (mm/m) +// Homing speeds (mm/min) #define HOMING_FEEDRATE_XY (50*60) #define HOMING_FEEDRATE_Z (4*60) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b27d7c79eabc..7d9182ad9bbc 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -339,7 +339,7 @@ #if ENABLED(EXTRUDER_RUNOUT_PREVENT) #define EXTRUDER_RUNOUT_MINTEMP 190 #define EXTRUDER_RUNOUT_SECONDS 30 - #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/m) + #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/min) #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) #endif @@ -883,7 +883,7 @@ // increments while checking for the contact to be broken. #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) - #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/m) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/min) #endif #endif #endif @@ -1025,7 +1025,7 @@ // @section lcd #if EITHER(ULTIPANEL, EXTENSIBLE_UI) - #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/m) Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) #if ENABLED(ULTIPANEL) #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" @@ -1985,13 +1985,13 @@ // Load / Unload #define TOOLCHANGE_FS_LENGTH 12 // (mm) Load / Unload length #define TOOLCHANGE_FS_EXTRA_RESUME_LENGTH 0 // (mm) Extra length for better restart, fine tune by LCD/Gcode) - #define TOOLCHANGE_FS_RETRACT_SPEED (50*60) // (mm/m) (Unloading) - #define TOOLCHANGE_FS_UNRETRACT_SPEED (25*60) // (mm/m) (On SINGLENOZZLE or Bowden loading must be slowed down) + #define TOOLCHANGE_FS_RETRACT_SPEED (50*60) // (mm/min) (Unloading) + #define TOOLCHANGE_FS_UNRETRACT_SPEED (25*60) // (mm/min) (On SINGLENOZZLE or Bowden loading must be slowed down) // Longer prime to clean out a SINGLENOZZLE #define TOOLCHANGE_FS_EXTRA_PRIME 0 // (mm) Extra priming length - #define TOOLCHANGE_FS_PRIME_SPEED (4.6*60) // (mm/m) Extra priming feedrate - #define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm/m) Retract before cooling for less stringing, better wipe, etc. + #define TOOLCHANGE_FS_PRIME_SPEED (4.6*60) // (mm/min) Extra priming feedrate + #define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm/min) Retract before cooling for less stringing, better wipe, etc. // Cool after prime to reduce stringing #define TOOLCHANGE_FS_FAN -1 // Fan index or -1 to skip @@ -2027,7 +2027,7 @@ //#define TOOLCHANGE_PARK #if ENABLED(TOOLCHANGE_PARK) #define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 } - #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/m) + #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/min) //#define TOOLCHANGE_PARK_X_ONLY // X axis only move //#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move #endif @@ -3151,7 +3151,7 @@ //#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc. // Enable and set a (default) feedrate for all G0 moves -//#define G0_FEEDRATE 3000 // (mm/m) +//#define G0_FEEDRATE 3000 // (mm/min) #ifdef G0_FEEDRATE //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode #endif @@ -3468,7 +3468,7 @@ #if ENABLED(PRUSA_MMU2_S_MODE) #define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries) - #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/m) + #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min) #define MMU2_CAN_LOAD_SEQUENCE \ { 0.1, MMU2_CAN_LOAD_FEEDRATE }, \ { 60.0, MMU2_CAN_LOAD_FEEDRATE }, \ From ca105493aa1cf5098e8ecac52197683d2de4bd17 Mon Sep 17 00:00:00 2001 From: Mathew Winters Date: Sun, 23 Aug 2020 09:20:37 +1200 Subject: [PATCH 396/483] NOZZLE_CLEAN_NO_Y (#18870) --- Marlin/Configuration.h | 5 ++++- Marlin/src/libs/nozzle.cpp | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2639bcd97b64..d23b69c02b28 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1604,9 +1604,12 @@ // Move the nozzle to the initial position after cleaning #define NOZZLE_CLEAN_GOBACK - // Enable for a purge/clean station that's always at the gantry height (thus no Z move) + // For a purge/clean station that's always at the gantry height (thus no Z move) //#define NOZZLE_CLEAN_NO_Z + // For a purge/clean station mounted on the X axis + //#define NOZZLE_CLEAN_NO_Y + // Explicit wipe G-code script applies to a G12 with no arguments. //#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0" diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 21e6ffb7cd13..f93e5524813a 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -46,15 +46,24 @@ Nozzle nozzle; // Move to the starting point #if ENABLED(NOZZLE_CLEAN_NO_Z) - do_blocking_move_to_xy(start); + #if ENABLED(NOZZLE_CLEAN_NO_Y) + do_blocking_move_to_x(start.x); + #else + do_blocking_move_to_xy(start); + #endif #else do_blocking_move_to(start); #endif // Start the stroke pattern LOOP_L_N(i, strokes >> 1) { - do_blocking_move_to_xy(end); - do_blocking_move_to_xy(start); + #if ENABLED(NOZZLE_CLEAN_NO_Y) + do_blocking_move_to_x(end.x); + do_blocking_move_to_x(start.x); + #else + do_blocking_move_to_xy(end); + do_blocking_move_to_xy(start); + #endif } TERN_(NOZZLE_CLEAN_GOBACK, do_blocking_move_to(oldpos)); From fa5a1f7d7f029641c89c9378fe228782bea31838 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 22 Aug 2020 16:40:22 -0500 Subject: [PATCH 397/483] PGMSTR constexpr => const --- Marlin/src/HAL/HAL.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index 29702f2d2b61..c7b7531442db 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -38,7 +38,7 @@ // String helper #ifndef PGMSTR - #define PGMSTR(NAM,STR) constexpr char NAM[] = STR + #define PGMSTR(NAM,STR) const char NAM[] = STR #endif inline void watchdog_refresh() { From d84aff701e10a49d5ccc69ce323fdb0fdb84b6db Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 22 Aug 2020 17:28:44 -0500 Subject: [PATCH 398/483] Fix probing margin sanity-check --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ddefcc8b60ae..5aa614f116ef 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1328,7 +1328,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS static_assert(PROBING_MARGIN_RIGHT >= 0, "PROBING_MARGIN_RIGHT must be >= 0."); #endif - #define _MARGIN(A) TERN(IS_SCARA, SCARA_PRINTABLE_RADIUS, TERN(DELTA, DELTA_PRINTABLE_RADIUS, A##_CENTER)) + #define _MARGIN(A) TERN(IS_SCARA, SCARA_PRINTABLE_RADIUS, TERN(DELTA, DELTA_PRINTABLE_RADIUS, ((A##_BED_SIZE) / 2))) static_assert(PROBING_MARGIN < _MARGIN(X), "PROBING_MARGIN is too large."); static_assert(PROBING_MARGIN_BACK < _MARGIN(Y), "PROBING_MARGIN_BACK is too large."); static_assert(PROBING_MARGIN_FRONT < _MARGIN(Y), "PROBING_MARGIN_FRONT is too large."); From 34fb9c7071b33307a89a8650c8b4e07f1afd1bc6 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 23 Aug 2020 00:12:22 +0000 Subject: [PATCH 399/483] [cron] Bump distribution date (2020-08-23) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index d5e0e2a820e4..652999971b45 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-22" + #define STRING_DISTRIBUTION_DATE "2020-08-23" #endif /** From bff0c68078664fcb229e2b9a9d4eb6b858df2dd2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 00:12:03 -0500 Subject: [PATCH 400/483] Consistent static/value item macros --- Marlin/src/lcd/fontutils.cpp | 3 +- Marlin/src/lcd/menu/menu_info.cpp | 63 +++++++++++++++---------------- Marlin/src/lcd/menu/menu_item.h | 14 +++++++ 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp index ffa6d0df70b8..8b046af9a7a2 100644 --- a/Marlin/src/lcd/fontutils.cpp +++ b/Marlin/src/lcd/fontutils.cpp @@ -73,7 +73,7 @@ int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, return -1; } -/* This function gets the character at the pstart position, interpreting UTF8 multybyte sequences +/* This function gets the character at the pstart position, interpreting UTF8 multibyte sequences and returns the pointer to the next character */ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval) { uint32_t val = 0; @@ -161,7 +161,6 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t } static inline uint8_t utf8_strlen_cb(const char *pstart, read_byte_cb_t cb_read_byte) { - uint8_t cnt = 0; uint8_t *pnext = (uint8_t *)pstart; for (;;) { diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 2fe8ccbab699..00ab9ad195e3 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -34,9 +34,6 @@ #include "game/game.h" #endif -#define VALUE_ITEM(MSG, VALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy(msg + 2, VALUE); STATIC_ITEM(MSG, STYL, msg); }while(0) -#define VALUE_ITEM_P(MSG, PVALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy_P(msg + 2, PSTR(PVALUE)); STATIC_ITEM(MSG, STYL, msg); }while(0) - #if ENABLED(PRINTCOUNTER) #include "../../module/printcounter.h" @@ -52,14 +49,14 @@ char buffer[21]; START_SCREEN(); // 12345678901234567890 - VALUE_ITEM(MSG_INFO_PRINT_COUNT, i16tostr3left(stats.totalPrints), SS_LEFT); // Print Count: 999 - VALUE_ITEM(MSG_INFO_COMPLETED_PRINTS, i16tostr3left(stats.finishedPrints), SS_LEFT); // Completed : 666 + STATIC_ITEM(MSG_INFO_PRINT_COUNT, SS_LEFT, i16tostr3left(stats.totalPrints)); // Print Count: 999 + STATIC_ITEM(MSG_INFO_COMPLETED_PRINTS, SS_LEFT, i16tostr3left(stats.finishedPrints)); // Completed : 666 STATIC_ITEM(MSG_INFO_PRINT_TIME, SS_LEFT); // Total print Time: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s STATIC_ITEM(MSG_INFO_PRINT_LONGEST, SS_LEFT); // Longest job time: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.longestPrint).toString(buffer)); // > 99y 364d 23h 59m 59s + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.longestPrint).toString(buffer)); // > 99y 364d 23h 59m 59s STATIC_ITEM(MSG_INFO_PRINT_FILAMENT, SS_LEFT); // Extruded total: sprintf_P(buffer, PSTR("%ld.%im") @@ -73,8 +70,8 @@ #endif #if SERVICE_INTERVAL_1 > 0 - STATIC_ITEM_P(PSTR(SERVICE_NAME_1 " "), SS_LEFT, buffer); // Service X in: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService1).toString(buffer)); // > 7d 12h 11m 10s + STATIC_ITEM_P(PSTR(SERVICE_NAME_1 " "), SS_LEFT, buffer); // Service X in: + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService1).toString(buffer)); // > 7d 12h 11m 10s #endif #if SERVICE_INTERVAL_2 > 0 @@ -104,8 +101,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_0 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E0 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_0_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_0_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_0_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_0_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_1 != 0 @@ -113,8 +110,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_1 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E1 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_1_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_1_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_1_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_1_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_2 != 0 @@ -122,8 +119,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_2 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E2 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_2_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_2_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_2_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_2_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_3 != 0 @@ -131,8 +128,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_3 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E3 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_3_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_3_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_3_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_3_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_4 != 0 @@ -140,8 +137,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_4 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E4 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_4_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_4_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_4_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_4_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_5 != 0 @@ -149,8 +146,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_5 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E5 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_5_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_5_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_5_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_5_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_6 != 0 @@ -158,8 +155,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_6 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E6 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_6_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_6_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_6_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_6_MAXTEMP), SS_LEFT); #endif #if TEMP_SENSOR_7 != 0 @@ -167,8 +164,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_7 #include "../thermistornames.h" STATIC_ITEM_P(PSTR(LCD_STR_E7 ": " THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_7_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_7_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_7_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_7_MAXTEMP), SS_LEFT); #endif #if EXTRUDERS @@ -180,8 +177,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_BED #include "../thermistornames.h" STATIC_ITEM_P(PSTR("BED:" THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT); STATIC_ITEM(TERN(WATCH_BED, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); #endif @@ -190,8 +187,8 @@ void menu_info_thermistors() { #define THERMISTOR_ID TEMP_SENSOR_CHAMBER #include "../thermistornames.h" STATIC_ITEM_P(PSTR("CHAM:" THERMISTOR_NAME), SS_INVERT); - VALUE_ITEM_P(MSG_INFO_MIN_TEMP, STRINGIFY(CHAMBER_MINTEMP), SS_LEFT); - VALUE_ITEM_P(MSG_INFO_MAX_TEMP, STRINGIFY(CHAMBER_MAXTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(CHAMBER_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(CHAMBER_MAXTEMP), SS_LEFT); STATIC_ITEM(TERN(WATCH_CHAMBER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); #endif @@ -209,9 +206,9 @@ void menu_info_board() { #ifdef BOARD_WEBSITE_URL STATIC_ITEM_P(PSTR(BOARD_WEBSITE_URL), SS_LEFT); // www.my3dprinter.com #endif - VALUE_ITEM_P(MSG_INFO_BAUDRATE, STRINGIFY(BAUDRATE), SS_CENTER); // Baud: 250000 - VALUE_ITEM_P(MSG_INFO_PROTOCOL, PROTOCOL_VERSION, SS_CENTER); // Protocol: 1.0 - VALUE_ITEM_P(MSG_INFO_PSU, PSU_NAME, SS_CENTER); + PSTRING_ITEM(MSG_INFO_BAUDRATE, STRINGIFY(BAUDRATE), SS_CENTER); // Baud: 250000 + PSTRING_ITEM(MSG_INFO_PROTOCOL, PROTOCOL_VERSION, SS_CENTER); // Protocol: 1.0 + PSTRING_ITEM(MSG_INFO_PSU, PSU_NAME, SS_CENTER); END_SCREEN(); } @@ -242,7 +239,7 @@ void menu_info_board() { STATIC_ITEM_P(PSTR(STRING_DISTRIBUTION_DATE)); // YYYY-MM-DD HH:MM STATIC_ITEM_P(PSTR(MACHINE_NAME)); // My3DPrinter STATIC_ITEM_P(PSTR(WEBSITE_URL)); // www.my3dprinter.com - VALUE_ITEM_P(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2 + PSTRING_ITEM(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2 #if HAS_LEVELING STATIC_ITEM( TERN_(AUTO_BED_LEVELING_3POINT, MSG_3POINT_LEVELING) // 3-Point Leveling diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index b322246e50d1..bee05141bb28 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -328,6 +328,20 @@ class MenuItem_bool : public MenuEditItemBase { NEXT_ITEM(); \ }while(0) +// PSTRING_ITEM is like STATIC_ITEM but it takes +// two PSTRs with the style as the last parameter. + +#define PSTRING_ITEM_P(PLABEL, PVAL, STYL) do{ \ + constexpr int m = 20; \ + char msg[m+1]; \ + msg[0] = ':'; msg[1] = ' '; \ + strncpy_P(msg+2, PSTR(PVAL), m-2); \ + if (msg[m-1] & 0x80) msg[m-1] = '\0'; \ + STATIC_ITEM_P(PLABEL, STYL, msg); \ +}while(0) + +#define PSTRING_ITEM(LABEL, V...) PSTRING_ITEM_P(GET_TEXT(LABEL), ##V) + #define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) #define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), ##V) From 6036a0df6b8eeb5d7af97c82bbf0e6cb9636e424 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 02:07:42 -0500 Subject: [PATCH 401/483] Fix DUET_SMART_EFFECTOR --- Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/gcode/config/M672.cpp | 19 +++++++++---------- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/gcode.h | 4 ++-- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 3544a8840f63..f371ddfc6e10 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -922,7 +922,7 @@ void setup() { SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers #endif - #if ENABLED(SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Put Smart Effector into NORMAL mode #endif diff --git a/Marlin/src/gcode/config/M672.cpp b/Marlin/src/gcode/config/M672.cpp index 58dc27177046..af74230516e1 100644 --- a/Marlin/src/gcode/config/M672.cpp +++ b/Marlin/src/gcode/config/M672.cpp @@ -22,20 +22,12 @@ #include "../../inc/MarlinConfig.h" -#if ENABLED(SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) +#if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) #include "../gcode.h" #include "../../HAL/shared/Delay.h" #include "../parser.h" -/** - * M672 - Set/reset Duet Smart Effector sensitivity - * - * One of these is required: - * S - 0-255 - * R - Flag to reset sensitivity to default - */ - /** * The Marlin format for the M672 command is different than shown in the Duet Smart Effector * documentation https://duet3d.dozuki.com/Wiki/Smart_effector_and_carriage_adapters_for_delta_printer @@ -77,6 +69,13 @@ void M672_send(uint8_t b) { // bit rate requirement: 1KHz +/- 30% } } +/** + * M672 - Set/reset Duet Smart Effector sensitivity + * + * One of these is required: + * S - 0-255 + * R - Flag to reset sensitivity to default + */ void GcodeSuite::M672() { if (parser.seen('R')) { M672_send(M672_ERASEBYTE); @@ -96,4 +95,4 @@ void GcodeSuite::M672() { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Keep Smart Effector in NORMAL mode } -#endif // SMART_EFFECTOR && SMART_EFFECTOR_MOD_PIN +#endif // DUET_SMART_EFFECTOR && SMART_EFFECTOR_MOD_PIN diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index edbeca9c9279..c0a795025fc7 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -790,7 +790,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 666: M666(); break; // M666: Set delta or multiple endstop adjustment #endif - #if ENABLED(SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) case 672: M672(); break; // M672: Set/clear Duet Smart Effector sensitivity #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index e04cd637eb92..8848450fc289 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -236,7 +236,7 @@ * M605 - Set Dual X-Carriage movement mode: "M605 S [X] [R]". (Requires DUAL_X_CARRIAGE) * M665 - Set delta configurations: "M665 H L R S B X Y Z (Requires DELTA) * M666 - Set/get offsets for delta (Requires DELTA) or dual endstops. (Requires [XYZ]_DUAL_ENDSTOPS) - * M672 - Set/Reset Duet Smart Effector's sensitivity. (Requires SMART_EFFECTOR and SMART_EFFECTOR_MOD_PIN) + * M672 - Set/Reset Duet Smart Effector's sensitivity. (Requires DUET_SMART_EFFECTOR and SMART_EFFECTOR_MOD_PIN) * M701 - Load filament (Requires FILAMENT_LOAD_UNLOAD_GCODES) * M702 - Unload filament (Requires FILAMENT_LOAD_UNLOAD_GCODES) * M810-M819 - Define/execute a G-code macro (Requires GCODE_MACROS) @@ -792,7 +792,7 @@ class GcodeSuite { static void M666(); #endif - #if ENABLED(SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) static void M672(); #endif From b36163d53ad1f3c67fa86f4e5521bbcdba7ed020 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 02:45:58 -0500 Subject: [PATCH 402/483] Fix up conditions, comments --- Marlin/src/inc/SanityCheck.h | 20 +++++++------------- Marlin/src/pins/ramps/pins_RAMPS_PLUS.h | 2 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 2 +- buildroot/share/vscode/avrdude.conf | 2 +- buildroot/share/vscode/avrdude_linux.conf | 2 +- buildroot/share/vscode/avrdude_macOS.conf | 2 +- 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5aa614f116ef..01d07ea4daa5 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -39,26 +39,20 @@ #define TEST2 1 #define TEST3 0 #define TEST4 true -#if ENABLED(TEST0) +#if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3) #error "ENABLED is borked!" #endif -#if DISABLED(TEST1) - #error "DISABLED is borked!" -#endif -#if !ENABLED(TEST2) - #error "ENABLED is borked!" +#if BOTH(TEST0, TEST1) + #error "BOTH is borked!" #endif -#if ENABLED(TEST3) - #error "ENABLED is borked!" -#endif -#if DISABLED(TEST4) +#if DISABLED(TEST1) || !DISABLED(TEST3) || DISABLED(TEST4) || DISABLED(TEST0, TEST1, TEST2, TEST4) || !DISABLED(TEST0, TEST3) #error "DISABLED is borked!" #endif #if !ANY(TEST1, TEST2, TEST3, TEST4) || ANY(TEST0, TEST3) #error "ANY is borked!" #endif -#if DISABLED(TEST0, TEST1, TEST2, TEST4) - #error "DISABLED is borked!" +#if NONE(TEST0, TEST1, TEST2, TEST4) || !NONE(TEST0, TEST3) + #error "NONE is borked!" #endif #undef TEST1 #undef TEST2 @@ -2202,7 +2196,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + (ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && DISABLED(IS_RRD_FG_SC)) \ + (ENABLED(ULTRA_LCD) && DISABLED(IS_ULTRA_LCD)) \ + (ENABLED(U8GLIB_SSD1306) && DISABLED(IS_U8GLIB_SSD1306)) \ - + (ENABLED(MINIPANEL) && DISABLED(MKS_MINI_12864, ENDER2_STOCKDISPLAY)) \ + + (ENABLED(MINIPANEL) && NONE(MKS_MINI_12864, ENDER2_STOCKDISPLAY)) \ + (ENABLED(MKS_MINI_12864) && DISABLED(MKS_LCD12864)) \ + (ENABLED(EXTENSIBLE_UI) && DISABLED(IS_EXTUI)) \ + (ENABLED(ULTIPANEL) && DISABLED(IS_ULTIPANEL)) \ diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h index 9af4a3e05c0f..bdd53abbc04d 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -74,7 +74,7 @@ #undef E0_CS_PIN #undef E1_CS_PIN -#if ENABLED(ULTRA_LCD, REPRAPWORLD_GRAPHICAL_LCD, CR10_STOCKDISPLAY) && !BOTH(NEWPANEL, PANEL_ONE) +#if ENABLED(ULTRA_LCD) && NONE(REPRAPWORLD_GRAPHICAL_LCD, CR10_STOCKDISPLAY) && !BOTH(NEWPANEL, PANEL_ONE) #if DISABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) #undef LCD_PINS_RS #define LCD_PINS_RS 42 // 3DYMY boards pin 16 -> 42 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index 955801558457..a44baf26e4d0 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -174,7 +174,7 @@ #define LCD_PINS_D6 32 #define LCD_PINS_D7 30 -#elif ENABLED(BOARD_REV_1_5, ULTRA_LCD) +#elif BOTH(BOARD_REV_1_5, ULTRA_LCD) #define BEEPER_PIN 18 diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf index 9f85aa0d26d6..991d255750f5 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/vscode/avrdude.conf @@ -151,7 +151,7 @@ # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma seperated list of +# Instruction formats are specified as a comma separated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf index 64d3b677d5bf..ff429a028cca 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -151,7 +151,7 @@ # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma seperated list of +# Instruction formats are specified as a comma separated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: diff --git a/buildroot/share/vscode/avrdude_macOS.conf b/buildroot/share/vscode/avrdude_macOS.conf index 814e87e35ea3..6147a2259ac9 100644 --- a/buildroot/share/vscode/avrdude_macOS.conf +++ b/buildroot/share/vscode/avrdude_macOS.conf @@ -151,7 +151,7 @@ # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma seperated list of +# Instruction formats are specified as a comma separated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: From 638f6f0f0607399bce82123663f5463380f83ce4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 03:14:11 -0500 Subject: [PATCH 403/483] Neopixel => NeoPixel --- Marlin/Configuration.h | 10 +++++----- Marlin/Configuration_adv.h | 2 +- Marlin/src/feature/leds/neopixel.h | 2 +- Marlin/src/gcode/feature/leds/M150.cpp | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d23b69c02b28..f84d78a50792 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2062,7 +2062,7 @@ //#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default //#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on) //#define FYSETC_MINI_12864_2_0 // Type A/B. Discreet RGB Backlight -//#define FYSETC_MINI_12864_2_1 // Type A/B. Neopixel RGB Backlight +//#define FYSETC_MINI_12864_2_1 // Type A/B. NeoPixel RGB Backlight //#define FYSETC_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight. // @@ -2332,13 +2332,13 @@ * Adds the M150 command to set the LED (or LED strip) color. * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of * luminance values can be set from 0 to 255. - * For Neopixel LED an overall brightness parameter is also available. + * For NeoPixel LED an overall brightness parameter is also available. * * *** CAUTION *** * LED Strips require a MOSFET Chip between PWM lines and LEDs, * as the Arduino cannot handle the current the LEDs will require. * Failure to follow this precaution can destroy your Arduino! - * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * NOTE: A separate 5V power supply is required! The NeoPixel LED needs * more current than the Arduino 5V linear regulator can produce. * *** CAUTION *** * @@ -2355,7 +2355,7 @@ //#define RGB_LED_W_PIN -1 #endif -// Support for Adafruit Neopixel LED driver +// Support for Adafruit NeoPixel LED driver //#define NEOPIXEL_LED #if ENABLED(NEOPIXEL_LED) #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) @@ -2368,7 +2368,7 @@ #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup - // Use a single Neopixel LED for static (background) lighting + // Use a single NeoPixel LED for static (background) lighting //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W #endif diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7d9182ad9bbc..e773b5378f3c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -488,7 +488,7 @@ //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. - //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light, requires NEOPIXEL_LED. #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } #endif diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 0155785e9afb..c3c8e2fbdc79 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -22,7 +22,7 @@ #pragma once /** - * Neopixel support + * NeoPixel support */ // ------------------------ diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index 88f02951add2..1c81c6d6be48 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -35,7 +35,7 @@ * If brightness is left out, no value changed * * With NEOPIXEL_LED: - * I Set the Neopixel index to affect. Default: All + * I Set the NeoPixel index to affect. Default: All * * Examples: * diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 69f4f2445121..8fbf382be798 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -345,7 +345,7 @@ #endif // -// Neopixel LED +// NeoPixel LED // #ifndef NEOPIXEL_PIN #define NEOPIXEL_PIN P1_24 From dd6cbbbbad6f14183f7005c7fc85674863202262 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sun, 23 Aug 2020 12:08:47 +0200 Subject: [PATCH 404/483] Feedrate comment (#19116) --- Marlin/Configuration_adv.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e773b5378f3c..19906819a181 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -909,9 +909,9 @@ #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm - #define CALIBRATION_FEEDRATE_SLOW 60 // mm/m - #define CALIBRATION_FEEDRATE_FAST 1200 // mm/m - #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/m + #define CALIBRATION_FEEDRATE_SLOW 60 // mm/min + #define CALIBRATION_FEEDRATE_FAST 1200 // mm/min + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min // The following parameters refer to the conical section of the nozzle tip. #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm From 5dadba432e4f824ef5153423db68460fe7fd4364 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 24 Aug 2020 00:12:38 +0000 Subject: [PATCH 405/483] [cron] Bump distribution date (2020-08-24) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 652999971b45..5e6d7fe5ed91 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-23" + #define STRING_DISTRIBUTION_DATE "2020-08-24" #endif /** From 4b124352ef89065561ddd7f40fd66ade95a5af07 Mon Sep 17 00:00:00 2001 From: Oleksii Zelivianskyi <50808386+alexeyzel@users.noreply.github.com> Date: Mon, 24 Aug 2020 06:13:49 +0300 Subject: [PATCH 406/483] TFT32 for MKS Robin Nano 1.2 (#19031) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 83b3bcc42db4..2c1d016f8cd6 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -234,6 +234,36 @@ #define XPT2046_Y_OFFSET 256 #endif +#elif ENABLED(TFT_320x240) // TFT32/28 + #define TFT_RESET_PIN PC6 + #define TFT_BACKLIGHT_PIN PD13 + + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define FSMC_CS_PIN PD7 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define XPT2046_X_CALIBRATION -12246 + #define XPT2046_Y_CALIBRATION 9453 + #define XPT2046_X_OFFSET 360 + #define XPT2046_Y_OFFSET -22 + + #define TOUCH_CS_PIN PA7 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 // SPI2_SCK + #define TOUCH_MISO_PIN PB14 // SPI2_MISO + #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI + + #define TFT_DRIVER ILI9341 + #define TFT_BUFFER_SIZE 14400 + + // YV for normal screen mounting + //#define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV + // XV for 180° rotated screen mounting + #define ILI9341_ORIENTATION ILI9341_MADCTL_MX | ILI9341_MADCTL_MV + + #define ILI9341_COLOR_RGB + #elif ENABLED(TFT_480x320) #define XPT2046_X_CALIBRATION 17880 #define XPT2046_Y_CALIBRATION -12234 From c488070859c1995fe957938b1b6302c4eeef1ea3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 23 Aug 2020 23:57:51 -0500 Subject: [PATCH 407/483] Minor cleanup w/r/t LEDs --- Marlin/Configuration.h | 2 +- Marlin/src/feature/leds/leds.cpp | 9 +++------ Marlin/src/feature/leds/leds.h | 8 ++------ Marlin/src/feature/leds/neopixel.cpp | 13 ++++++------- Marlin/src/feature/leds/neopixel.h | 6 ++---- Marlin/src/feature/leds/pca9533.cpp | 2 +- Marlin/src/feature/leds/pca9533.h | 2 +- Marlin/src/feature/leds/pca9632.cpp | 4 ++-- Marlin/src/feature/leds/pca9632.h | 4 ++-- Marlin/src/feature/password/password.cpp | 2 +- Marlin/src/feature/password/password.h | 2 +- Marlin/src/gcode/feature/password/M510-M512.cpp | 2 +- Marlin/src/gcode/gcode.h | 2 +- Marlin/src/lcd/menu/menu_led.cpp | 15 ++++++++------- Marlin/src/lcd/ultralcd.cpp | 2 +- Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h | 2 +- 16 files changed, 34 insertions(+), 43 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f84d78a50792..39dc195231a7 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2363,7 +2363,7 @@ //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE //#define NEOPIXEL2_PIN 5 //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel - #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 neopixel strips are used + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 NeoPixel strips are used #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index eec0cde630da..d1c0bfd5e145 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -129,12 +129,9 @@ void LEDLights::set_color(const LEDColor &incol #endif - #if ENABLED(PCA9632) - // Update I2C LED driver - pca9632_set_led_color(incol); - #endif - - TERN_(PCA9533, PCA9533_setColor(incol.r, incol.g, incol.b)); + // Update I2C LED driver + TERN_(PCA9632, PCA9632_set_led_color(incol)); + TERN_(PCA9533, PCA9533_set_rgb(incol.r, incol.g, incol.b)); #if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) // Don't update the color when OFF diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index 577c94752ffd..1302f63c155f 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -104,11 +104,7 @@ typedef struct LEDColor { bool operator!=(const LEDColor &right) { return !operator==(right); } bool is_off() const { - return 3 > r + g + b - #if HAS_WHITE_LED - + w - #endif - ; + return 3 > r + g + b + TERN0(HAS_WHITE_LED, w); } } LEDColor; @@ -156,7 +152,7 @@ class LEDLights { #endif ); - inline void set_color(uint8_t r, uint8_t g, uint8_t b + static inline void set_color(uint8_t r, uint8_t g, uint8_t b #if HAS_WHITE_LED , uint8_t w=0 #if ENABLED(NEOPIXEL_LED) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 520d4d63b22f..ce2e4ee77b40 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -53,9 +53,9 @@ Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIX #endif void Marlin_NeoPixel::set_color(const uint32_t color) { - if (get_neo_index() >= 0) { - set_pixel_color(get_neo_index(), color); - set_neo_index(-1); + if (neoindex >= 0) { + set_pixel_color(neoindex, color); + neoindex = -1; } else { for (uint16_t i = 0; i < pixels(); ++i) { @@ -78,18 +78,17 @@ void Marlin_NeoPixel::set_color_startup(const uint32_t color) { } void Marlin_NeoPixel::init() { - set_neo_index(-1); // -1 .. NEOPIXEL_PIXELS-1 range + neoindex = -1; // -1 .. NEOPIXEL_PIXELS-1 range set_brightness(NEOPIXEL_BRIGHTNESS); // 0 .. 255 range begin(); show(); // initialize to all off #if ENABLED(NEOPIXEL_STARTUP_TEST) set_color_startup(adaneo1.Color(255, 0, 0, 0)); // red - safe_delay(1000); + safe_delay(500); set_color_startup(adaneo1.Color(0, 255, 0, 0)); // green - safe_delay(1000); + safe_delay(500); set_color_startup(adaneo1.Color(0, 0, 255, 0)); // blue - safe_delay(1000); #endif #ifdef NEOPIXEL_BKGD_LED_INDEX diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index c3c8e2fbdc79..0d9fdefc067d 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -65,17 +65,15 @@ class Marlin_NeoPixel { , adaneo2 #endif ; - static int8_t neoindex; public: + static int8_t neoindex; + static void init(); static void set_color_startup(const uint32_t c); static void set_color(const uint32_t c); - FORCE_INLINE static void set_neo_index(const int8_t neoIndex) { neoindex = neoIndex; } - FORCE_INLINE static int8_t get_neo_index() { return neoindex; } - #ifdef NEOPIXEL_BKGD_LED_INDEX static void set_color_background(); #endif diff --git a/Marlin/src/feature/leds/pca9533.cpp b/Marlin/src/feature/leds/pca9533.cpp index bcc4bc50a474..0fd4d6675771 100644 --- a/Marlin/src/feature/leds/pca9533.cpp +++ b/Marlin/src/feature/leds/pca9533.cpp @@ -62,7 +62,7 @@ void PCA9533_setOff() { PCA9533_writeRegister(PCA9533_REG_SEL, 0); } -void PCA9533_setColor(uint8_t red, uint8_t green, uint8_t blue) { +void PCA9533_set_rgb(uint8_t red, uint8_t green, uint8_t blue) { uint8_t r_pwm0 = 0; // Register data - PWM value uint8_t r_pwm1 = 0; // Register data - PWM value diff --git a/Marlin/src/feature/leds/pca9533.h b/Marlin/src/feature/leds/pca9533.h index 899418ff232c..431058c49136 100644 --- a/Marlin/src/feature/leds/pca9533.h +++ b/Marlin/src/feature/leds/pca9533.h @@ -55,5 +55,5 @@ void PCA9533_init(); void PCA9533_reset(); -void PCA9533_setColor(uint8_t red, uint8_t green, uint8_t blue); +void PCA9533_set_rgb(uint8_t red, uint8_t green, uint8_t blue); void PCA9533_setOff(); diff --git a/Marlin/src/feature/leds/pca9632.cpp b/Marlin/src/feature/leds/pca9632.cpp index df991ded36cc..d8af31cb6ce4 100644 --- a/Marlin/src/feature/leds/pca9632.cpp +++ b/Marlin/src/feature/leds/pca9632.cpp @@ -120,7 +120,7 @@ static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const } #endif -void pca9632_set_led_color(const LEDColor &color) { +void PCA9632_set_led_color(const LEDColor &color) { Wire.begin(); if (!PCA_init) { PCA_init = 1; @@ -138,7 +138,7 @@ void pca9632_set_led_color(const LEDColor &color) { #if ENABLED(PCA9632_BUZZER) - void pca9632_buzz(const long, const uint16_t) { + void PCA9632_buzz(const long, const uint16_t) { uint8_t data[] = PCA9632_BUZZER_DATA; Wire.beginTransmission(I2C_ADDRESS(PCA9632_ADDRESS)); Wire.write(data, sizeof(data)); diff --git a/Marlin/src/feature/leds/pca9632.h b/Marlin/src/feature/leds/pca9632.h index 34aceb31d6e3..fb59a8c18479 100644 --- a/Marlin/src/feature/leds/pca9632.h +++ b/Marlin/src/feature/leds/pca9632.h @@ -29,9 +29,9 @@ struct LEDColor; typedef LEDColor LEDColor; -void pca9632_set_led_color(const LEDColor &color); +void PCA9632_set_led_color(const LEDColor &color); #if ENABLED(PCA9632_BUZZER) #include - void pca9632_buzz(const long, const uint16_t); + void PCA9632_buzz(const long, const uint16_t); #endif diff --git a/Marlin/src/feature/password/password.cpp b/Marlin/src/feature/password/password.cpp index c519ee7c9c46..90bb647118b5 100644 --- a/Marlin/src/feature/password/password.cpp +++ b/Marlin/src/feature/password/password.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h index 66f1c70ba314..3ed584b29d5e 100644 --- a/Marlin/src/feature/password/password.h +++ b/Marlin/src/feature/password/password.h @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once diff --git a/Marlin/src/gcode/feature/password/M510-M512.cpp b/Marlin/src/gcode/feature/password/M510-M512.cpp index f26fb75fdada..79f1da065b3c 100644 --- a/Marlin/src/gcode/feature/password/M510-M512.cpp +++ b/Marlin/src/gcode/feature/password/M510-M512.cpp @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 8848450fc289..23bf2c0ce5b1 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -155,7 +155,7 @@ * M141 - Set heated chamber target temp. S (Requires a chamber heater) * M145 - Set heatup values for materials on the LCD. H B F for S (0=PLA, 1=ABS) * M149 - Set temperature units. (Requires TEMPERATURE_UNITS_SUPPORT) - * M150 - Set Status LED Color as R U B P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, PCA9533, or PCA9632). + * M150 - Set Status LED Color as R U B W P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, PCA9533, or PCA9632). * M155 - Auto-report temperatures with interval of S. (Requires AUTO_REPORT_TEMPERATURES) * M163 - Set a single proportion for a mixing extruder. (Requires MIXING_EXTRUDER) * M164 - Commit the mix and save to a virtual tool (current, or as specified by 'S'). (Requires MIXING_EXTRUDER) diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 61ffbfd66399..290b0ddf63cd 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -34,18 +34,19 @@ #include "../../feature/leds/leds.h" #if ENABLED(LED_COLOR_PRESETS) + void menu_led_presets() { START_MENU(); #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_LED_PRESETS, SS_DEFAULT|SS_INVERT); #endif BACK_ITEM(MSG_LED_CONTROL); - ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white); - ACTION_ITEM(MSG_SET_LEDS_RED, leds.set_red); + ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white); + ACTION_ITEM(MSG_SET_LEDS_RED, leds.set_red); ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds.set_orange); - ACTION_ITEM(MSG_SET_LEDS_YELLOW,leds.set_yellow); - ACTION_ITEM(MSG_SET_LEDS_GREEN, leds.set_green); - ACTION_ITEM(MSG_SET_LEDS_BLUE, leds.set_blue); + ACTION_ITEM(MSG_SET_LEDS_YELLOW, leds.set_yellow); + ACTION_ITEM(MSG_SET_LEDS_GREEN, leds.set_green); + ACTION_ITEM(MSG_SET_LEDS_BLUE, leds.set_blue); ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds.set_indigo); ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds.set_violet); END_MENU(); @@ -83,11 +84,10 @@ #endif #endif - - void menu_led() { START_MENU(); BACK_ITEM(MSG_MAIN); + #if ENABLED(LED_CONTROL_MENU) bool led_on = leds.lights_on; EDIT_ITEM(bool, MSG_LEDS, &led_on, leds.toggle); @@ -97,6 +97,7 @@ void menu_led() { #endif SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom); #endif + // // Set Case light on/off/brightness // diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index f30d9c68cff7..09767c72aaab 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -81,7 +81,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #endif void MarlinUI::buzz(const long duration, const uint16_t freq) { #if ENABLED(PCA9632_BUZZER) - pca9632_buzz(duration, freq); + PCA9632_buzz(duration, freq); #elif USE_BEEPER buzzer.tone(duration, freq); #endif diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index af1e4c114518..5254166fa576 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -113,7 +113,7 @@ #define FAN1_PIN PA8 // FAN (fan0 on board) e0 cool fan #define FAN2_PIN PB9 // FAN (fan1 on board) controller cool fan -// One neopixel onboard and a connector for other neopixels +// One NeoPixel onboard and a connector for other NeoPixels #define NEOPIXEL_PIN PC7 // The NEOPIXEL LED driving pin /** From f67ad6fd70bb107ca08ac99af6bcffa2026266d2 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Mon, 24 Aug 2020 16:54:25 +0200 Subject: [PATCH 408/483] Fix auto-power in PID autotune (#19119) --- Marlin/src/module/temperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index e8be3dbf0173..813bcc061b96 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -435,6 +435,7 @@ volatile bool Temperature::raw_temps_ready = false; SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_START); disable_all_heaters(); + TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); SHV(bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1); @@ -444,7 +445,6 @@ volatile bool Temperature::raw_temps_ready = false; LEDColor color = ONHEATINGSTART(); #endif - TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = false); // PID Tuning loop From f7fe499305b05455853db226568bc6cdf7b8f7b4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 24 Aug 2020 15:23:32 -0300 Subject: [PATCH 409/483] Color UI + Robin Nano test (#19118) --- buildroot/tests/mks_robin_nano35-tests | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index ac72050875ab..92c97be756cd 100644 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -35,5 +35,12 @@ opt_disable TOUCH_SCREEN opt_enable TFT_LVGL_UI_SPI exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" +use_example_configs Mks/Robin +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_disable TFT_320x240 +opt_enable TOUCH_SCREEN +opt_enable TFT_480x320_SPI +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" + # cleanup restore_configs From e2edfabc3c9e3d1c4d4fbd98d3878a7876b78ca7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 25 Aug 2020 00:11:11 +0000 Subject: [PATCH 410/483] [cron] Bump distribution date (2020-08-25) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 5e6d7fe5ed91..68b9bc56d8ed 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-24" + #define STRING_DISTRIBUTION_DATE "2020-08-25" #endif /** From 66694a213fb4ca15b924c25c49248e54d4278a7e Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 26 Aug 2020 01:16:43 +1200 Subject: [PATCH 411/483] LEDs followup (#19133) --- Marlin/src/gcode/feature/leds/M150.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index 1c81c6d6be48..83bd24c41cae 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -50,7 +50,7 @@ */ void GcodeSuite::M150() { #if ENABLED(NEOPIXEL_LED) - neo.set_neo_index(parser.intval('I', -1)); + neo.neoindex = parser.intval('I', -1); #endif leds.set_color(MakeLEDColor( parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, From 076f59c63004184107ecf5beeb33adb428f03e74 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 26 Aug 2020 00:11:08 +0000 Subject: [PATCH 412/483] [cron] Bump distribution date (2020-08-26) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 68b9bc56d8ed..08d0b6358b87 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-25" + #define STRING_DISTRIBUTION_DATE "2020-08-26" #endif /** From 5db62d7abdafe1d07c76e1292c6c32f71e6ee356 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 25 Aug 2020 23:34:53 -0500 Subject: [PATCH 413/483] No COM_PIN needed for DWIN --- Marlin/src/lcd/dwin/dwin.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index 0d719542e182..d82efc568918 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -3341,13 +3341,6 @@ void HMI_Init(void) { } HMI_SetLanguage(); - - #if ENABLED(FIX_MOUNTED_PROBE) // For "CREALITY_TOUCH" probe too? - SET_OUTPUT(COM_PIN); - WRITE(COM_PIN, 1); - #endif - - delay(200); } void DWIN_Update(void) { From bd9dc73d3d22f067b8b0f99d8f3519ae4a04eeef Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 25 Aug 2020 23:57:48 -0500 Subject: [PATCH 414/483] Warn about MARLIN_DEV_MODE --- Marlin/src/inc/SanityCheck.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 01d07ea4daa5..671d6e84f87a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -75,6 +75,10 @@ #endif #undef HEXIFY +#if ENABLED(MARLIN_DEV_MODE) + #warning "WARNING! Disable MARLIN_DEV_MODE for the final build!" +#endif + /** * Warnings for old configurations */ @@ -523,16 +527,11 @@ #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." #elif defined(EVENT_GCODE_SD_STOP) #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT. Please update your Configuration.h." -#endif - -#ifdef FIL_RUNOUT_INVERTING +#elif defined(FIL_RUNOUT_INVERTING) #if FIL_RUNOUT_INVERTING - #warning "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update Configuration.h." + #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update your Configuration.h." #else - #warning "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW. Please update Configuration.h." - #endif - #ifndef FIL_RUNOUT_STATE - #define FIL_RUNOUT_STATE ((FIL_RUNOUT_INVERTING) ? HIGH : LOW) + #error "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW. Please update your Configuration.h." #endif #endif From 646d90f3da2feda848dc4a50fe3661701dc881d1 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 25 Aug 2020 22:43:33 -0700 Subject: [PATCH 415/483] Fix SD pins for SKR Pro and GTR (#19047) --- Marlin/src/lcd/extui/ui_api.cpp | 4 -- Marlin/src/lcd/ultralcd.cpp | 4 -- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 52 +++++++++++-------- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 23 ++++---- Marlin/src/sd/cardreader.cpp | 4 ++ 5 files changed, 48 insertions(+), 39 deletions(-) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 3df9c17f6b8e..31449fcef4c7 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -1057,10 +1057,6 @@ namespace ExtUI { // At the moment, we piggy-back off the ultralcd calls, but this could be cleaned up in the future void MarlinUI::init() { - #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - SET_INPUT_PULLUP(SD_DETECT_PIN); - #endif - ExtUI::onStartup(); } diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 09767c72aaab..b30f6e49c9e0 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -372,10 +372,6 @@ void MarlinUI::init() { #endif // HAS_SHIFT_ENCODER - #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - SET_INPUT_PULLUP(SD_DETECT_PIN); - #endif - #if HAS_ENCODER_ACTION && HAS_SLOW_BUTTONS slow_buttons = 0; #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index bc882316e7db..ea643322b67b 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -280,24 +280,29 @@ //#define FAN6_PIN PC9 // Fan6 //#define FAN7_PIN PE14 // Fan7 +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + // -// By default the onboard SD (SPI1) is enabled +// By default the LCD SD (SPI2) is enabled +// Onboard SD is on a completely separate SPI bus, and requires +// overriding pins to access. // -#define CUSTOM_SPI_PINS -#if DISABLED(CUSTOM_SPI_PINS) +#if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN PB10 #define SDSS PB12 -#endif - -// HAL SPI1 pins group -#if ENABLED(CUSTOM_SPI_PINS) +#elif SD_CONNECTION_IS(ONBOARD) + // Instruct the STM32 HAL to override the default SPI pins from the variant.h file + #define CUSTOM_SPI_PINS #define SDSS PA4 - #define SD_DETECT_PIN PC4 - #define LCD_SDSS PA4 - + #define SS_PIN SDSS #define SCK_PIN PA5 #define MISO_PIN PA6 #define MOSI_PIN PA7 - #define SS_PIN PA4 // Chip select for SD card used by Marlin + #define SD_DETECT_PIN PC4 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #define "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" #endif /** @@ -319,7 +324,6 @@ #define BTN_ENC PA15 #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS PG6 #define BTN_EN1 PC10 @@ -333,6 +337,15 @@ #undef BOARD_ST7920_DELAY_2 #undef BOARD_ST7920_DELAY_3 + #elif ENABLED(MKS_MINI_12864) + #define DOGLCD_A0 PG6 + #define DOGLCD_CS PG7 + #define BTN_EN1 PD10 + #define BTN_EN2 PH10 + + #if SD_CONNECTION_IS(ONBOARD) + #define SOFTWARE_SPI + #endif #else #define LCD_PINS_RS PA8 @@ -340,17 +353,17 @@ #define BTN_EN1 PD10 #define BTN_EN2 PH10 - #if DISABLED(CUSTOM_SPI_PINS) - #define SD_DETECT_PIN PB10 - #define LCD_SDSS PB12 - #endif - #define LCD_PINS_ENABLE PC10 #define LCD_PINS_D4 PG8 #if ENABLED(FYSETC_MINI_12864) #define DOGLCD_CS PC10 #define DOGLCD_A0 PA8 + + #if SD_CONNECTION_IS(ONBOARD) + #define SOFTWARE_SPI + #endif + //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN PG8 // Must be high or open for LCD to operate normally. #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) @@ -389,11 +402,6 @@ #endif #endif - //#define DOGLCD_CS PB12 - //#define DOGLCD_A0 PA8 - //#define LCD_PINS_DC PB14 - //#define DOGLCD_MOSI PB15 - #endif // HAS_SPI_LCD #undef TP diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index e13c4a227aae..56c509562fc5 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -250,12 +250,22 @@ // Onboard SD card // Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2 // -#if SD_CONNECTION_IS(ONBOARD) - #define SOFTWARE_SPI // Use soft SPI for onboard SD +#if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN PF12 + #define SDSS PB12 +#elif SD_CONNECTION_IS(ONBOARD) + // The SKR Pro's ONBOARD SD interface is on SPI1. + // Due to a pull resistor on the clock line, it needs to use SPI Data Mode 3 to + // function with Hardware SPI. This is not currently configurable in the HAL, + // so force Software SPI to work around this issue. + #define SOFTWARE_SPI #define SDSS PA4 #define SCK_PIN PA5 #define MISO_PIN PA6 #define MOSI_PIN PB5 + #define SD_DETECT_PIN PB11 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #define "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" #endif /** @@ -275,9 +285,6 @@ #if HAS_SPI_LCD #define BEEPER_PIN PG4 #define BTN_ENC PA8 - #if SD_CONNECTION_IS(LCD) - #define SDSS PB12 // Uses default hardware SPI for LCD's SD - #endif #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS PG6 @@ -296,16 +303,14 @@ #elif ENABLED(MKS_MINI_12864) #define DOGLCD_A0 PG6 #define DOGLCD_CS PG3 - + #define BTN_EN1 PG10 + #define BTN_EN2 PF11 #else #define LCD_PINS_RS PD10 #define BTN_EN1 PG10 #define BTN_EN2 PF11 - #define SD_DETECT_PIN PF12 - - #define LCD_SDSS PB12 #define LCD_PINS_ENABLE PD11 #define LCD_PINS_D4 PG2 diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 3aa7156e7b02..29f9672e92b5 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -137,6 +137,10 @@ CardReader::CardReader() { // Disable autostart until card is initialized autostart_index = -1; + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + SET_INPUT_PULLUP(SD_DETECT_PIN); + #endif + #if PIN_EXISTS(SDPOWER) OUT_WRITE(SDPOWER_PIN, HIGH); // Power the SD reader #endif From 1793de4a28c697c726f8b2b33ba9c0526de32307 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Tue, 25 Aug 2020 22:44:15 -0700 Subject: [PATCH 416/483] Add Einsy Rambo Filament Runout Pin (#19136) --- Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 8fb3be47da54..e2a4940e8789 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -80,6 +80,13 @@ #define Z_MIN_PROBE_PIN 10 #endif +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 62 +#endif + // // Steppers // From b07dd44ec21ce6f622591cd96a1f709588f409b9 Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Mon, 24 Aug 2020 08:56:19 -0600 Subject: [PATCH 417/483] Fixes to FTDI Touch UI (#19134) - Fix unused variable warning - Fix for filament runout sound - Fix for developer menu access - Fix compilation error when using CALIBRATION_GCODE - Remove material labels in change filament screen - Add decimals to status screen Z coordinate - Add more descriptive message on heater timeout --- .../ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h | 4 ++-- .../lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h | 3 --- .../src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp | 2 ++ .../ftdi_eve_touch_ui/screens/change_filament_screen.cpp | 6 +++--- .../screens/confirm_auto_calibration_dialog_box.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp | 2 +- .../extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp | 4 ++-- .../lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h | 2 +- Marlin/src/lcd/language/language_en.h | 6 +++++- 10 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h index 972c38395b14..b12ab286e19c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -144,8 +144,8 @@ class UIScreen { static bool onTouchEnd(uint8_t) {return true;} }; -#define PUSH_SCREEN(screen) current_screen.push(screen::onRedraw); -#define GOTO_SCREEN(screen) current_screen.goTo(screen::onRedraw); +#define PUSH_SCREEN(screen) current_screen.push(screen::onRedraw) +#define GOTO_SCREEN(screen) current_screen.goTo(screen::onRedraw) #define GOTO_PREVIOUS() current_screen.goBack(); #define AT_SCREEN(screen) (current_screen.getType() == current_screen.lookupScreen(screen::onRedraw)) #define IS_PARENT_SCREEN(screen) (current_screen.peek() == current_screen.lookupScreen(screen::onRedraw)) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index b00c836ce470..f2971087c160 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -91,9 +91,6 @@ namespace Language_en { PROGMEM Language_Str MSG_UNITS_STEP_MM = u8"st/mm"; PROGMEM Language_Str MSG_UNITS_PERCENT = u8"%"; PROGMEM Language_Str MSG_UNITS_C = DEGREE_SIGN u8"C"; - PROGMEM Language_Str MSG_MATERIAL_PLA = u8"PLA"; - PROGMEM Language_Str MSG_MATERIAL_ABS = u8"ABS"; - PROGMEM Language_Str MSG_MATERIAL_HIGH_TEMP = u8"High"; PROGMEM Language_Str MSG_IDLE = u8"idle"; PROGMEM Language_Str MSG_SET_MAXIMUM = u8"Set Maximum"; PROGMEM Language_Str MSG_PRINT_SPEED = u8"Print Speed"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index a9b4ec6cd8b2..e06f9f3a29de 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -92,7 +92,7 @@ namespace ExtUI { char lcd_msg[30]; sprintf_P(lcd_msg, PSTR("Extruder %d Filament Error"), extruder + 1); StatusScreen::setStatusMessage(lcd_msg); - InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED); + InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED, FTDI::PLAY_SYNCHRONOUS); } void onFactoryReset() { diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp index 47a35cd0a805..9cd17637bd52 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp @@ -80,6 +80,7 @@ void AboutScreen::onRedraw(draw_mode_t) { #endif , OPT_CENTER, font_xlarge ); + cmd.tag(3); draw_text_box(cmd, FW_VERS_POS, #ifdef TOUCH_UI_VERSION F(TOUCH_UI_VERSION) @@ -87,6 +88,7 @@ void AboutScreen::onRedraw(draw_mode_t) { progmem_str(getFirmwareName_str()) #endif , OPT_CENTER, font_medium); + cmd.tag(0); draw_text_box(cmd, FW_INFO_POS, about_str, OPT_CENTER, font_medium); draw_text_box(cmd, INSET_POS(LICENSE_POS), GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp index afa3211a01ae..589da9b21055 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -207,13 +207,13 @@ void ChangeFilamentScreen::onRedraw(draw_mode_t what) { { char str[30]; - format_temp_and_material(str, LOW_TEMP, GET_TEXT(MSG_MATERIAL_PLA)); + format_temp(str, LOW_TEMP); cmd.tag(2) .TOG_STYLE(tog2) .button (BTN_POS(2,6), BTN_SIZE(1,1), str); - format_temp_and_material(str, MED_TEMP, GET_TEXT(MSG_MATERIAL_ABS)); + format_temp(str, MED_TEMP); cmd.tag(3) .TOG_STYLE(tog3) .button (BTN_POS(2,5), BTN_SIZE(1,1), str); - format_temp_and_material(str, HIGH_TEMP, GET_TEXT(MSG_MATERIAL_HIGH_TEMP)); + format_temp(str, HIGH_TEMP); cmd.tag(4) .TOG_STYLE(tog4) .button (BTN_POS(2,4), BTN_SIZE(1,1), str); } cmd.colors(normal_btn) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp index 974ce3a6e1fe..7e1a82025ddc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp @@ -38,7 +38,7 @@ bool ConfirmAutoCalibrationDialogBox::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_SCREEN(StatusScreen); - injectCommands_P(PSTR(CALIBRATION_COMMANDS)); + injectCommands_P(PSTR("G425")); return true; default: return DialogBoxBaseClass::onTouchEnd(tag); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp index ac1fccd579a6..f2524c7982f1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -97,7 +97,7 @@ void StatusScreen::draw_axis_position(draw_mode_t what) { strcpy_P(y_str, PSTR("?")); if (isAxisPositionKnown(Z)) - format_position(z_str, getAxisPosition_mm(Z)); + format_position(z_str, getAxisPosition_mm(Z), 2); else strcpy_P(z_str, PSTR("?")); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp index 340ffd055329..b7ce76ecd2b3 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp @@ -61,8 +61,8 @@ void format_temp_and_material(char *str, float t1, const char *material) { /** * Formats a position value (e.g. "10 mm") */ -void format_position(char *str, float p) { - dtostrf(p, 5, 1, str); +void format_position(char *str, float p, uint8_t decimals) { + dtostrf(p, 4 + decimals, decimals, str); strcat_P(str, PSTR(" ")); strcat_P(str, GET_TEXT(MSG_UNITS_MM)); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h index ce3af4db878f..e37a82d28a5f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h @@ -25,5 +25,5 @@ void format_temp(char *str, float t1); void format_temp_and_idle(char *str, float t1); void format_temp_and_temp(char *str, float t1, float t2); void format_temp_and_material(char *str, float t1, const char *material); -void format_position(char *str, float p); +void format_position(char *str, float p, uint8_t decimals = 1); void format_position(char *str, float x, float y, float z); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 5aa0d76a84a2..fde21f2bbabc 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -647,7 +647,11 @@ namespace Language_en { PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Level X Axis"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrate"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heater Timeout"); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Idle timeout, temperature decreased. Press Okay to reheat and again to resume."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heater Timeout"); + #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("Reheat"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Reheating..."); } From 131ddeaeba96addcf573cbeff86b65225d3b8320 Mon Sep 17 00:00:00 2001 From: Colin Godsey Date: Wed, 26 Aug 2020 00:32:56 -0600 Subject: [PATCH 418/483] Direct Stepping update (#19135) --- Marlin/src/feature/direct_stepping.cpp | 49 ++++++++++---------------- Marlin/src/feature/direct_stepping.h | 6 +--- Marlin/src/module/stepper.cpp | 30 ++++++++-------- 3 files changed, 34 insertions(+), 51 deletions(-) diff --git a/Marlin/src/feature/direct_stepping.cpp b/Marlin/src/feature/direct_stepping.cpp index d3bdb43ab3cd..9766d1464053 100644 --- a/Marlin/src/feature/direct_stepping.cpp +++ b/Marlin/src/feature/direct_stepping.cpp @@ -56,9 +56,6 @@ namespace DirectStepping { template volatile bool SerialPageManager::page_states_dirty; - template - millis_t SerialPageManager::next_response; - template uint8_t SerialPageManager::pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; @@ -80,7 +77,6 @@ namespace DirectStepping { page_states[i] = PageState::FREE; fatal_error = false; - next_response = 0; state = State::NEWLINE; page_states_dirty = false; @@ -181,15 +177,8 @@ namespace DirectStepping { return; } - // Runs on a set interval also, as responses may get lost. - if (next_response && next_response < millis()) { - page_states_dirty = true; - } - if (!page_states_dirty) return; - page_states_dirty = false; - next_response = millis() + Cfg::RESPONSE_INTERVAL_MS; SERIAL_ECHO(Cfg::CONTROL_CHAR); constexpr int state_bits = 2; @@ -238,29 +227,29 @@ const uint8_t segment_table[DirectStepping::Config::NUM_SEGMENTS][DirectStepping #if STEPPER_PAGE_FORMAT == SP_4x4D_128 - { 1, 1, 1, 1, 1, 1, 1, 0 }, // 0 = -7 - { 1, 1, 1, 0, 1, 1, 1, 0 }, // 1 = -6 - { 0, 1, 1, 0, 1, 0, 1, 1 }, // 2 = -5 - { 0, 1, 0, 1, 0, 1, 0, 1 }, // 3 = -4 - { 0, 1, 0, 0, 1, 0, 0, 1 }, // 4 = -3 - { 0, 0, 1, 0, 0, 0, 1, 0 }, // 5 = -2 - { 0, 0, 0, 0, 1, 0, 0, 0 }, // 6 = -1 - { 0, 0, 0, 0, 0, 0, 0, 0 }, // 7 = 0 - { 0, 0, 0, 0, 1, 0, 0, 0 }, // 8 = 1 - { 0, 0, 1, 0, 0, 0, 1, 0 }, // 9 = 2 - { 0, 1, 0, 0, 1, 0, 0, 1 }, // 10 = 3 - { 0, 1, 0, 1, 0, 1, 0, 1 }, // 11 = 4 - { 0, 1, 1, 0, 1, 0, 1, 1 }, // 12 = 5 - { 1, 1, 1, 0, 1, 1, 1, 0 }, // 13 = 6 - { 1, 1, 1, 1, 1, 1, 1, 0 }, // 14 = 7 + { 1, 1, 1, 1, 1, 1, 1 }, // 0 = -7 + { 1, 1, 1, 0, 1, 1, 1 }, // 1 = -6 + { 1, 1, 1, 0, 1, 0, 1 }, // 2 = -5 + { 1, 1, 0, 1, 0, 1, 0 }, // 3 = -4 + { 1, 1, 0, 0, 1, 0, 0 }, // 4 = -3 + { 0, 0, 1, 0, 0, 0, 1 }, // 5 = -2 + { 0, 0, 0, 1, 0, 0, 0 }, // 6 = -1 + { 0, 0, 0, 0, 0, 0, 0 }, // 7 = 0 + { 0, 0, 0, 1, 0, 0, 0 }, // 8 = 1 + { 0, 0, 1, 0, 0, 0, 1 }, // 9 = 2 + { 1, 1, 0, 0, 1, 0, 0 }, // 10 = 3 + { 1, 1, 0, 1, 0, 1, 0 }, // 11 = 4 + { 1, 1, 1, 0, 1, 0, 1 }, // 12 = 5 + { 1, 1, 1, 0, 1, 1, 1 }, // 13 = 6 + { 1, 1, 1, 1, 1, 1, 1 }, // 14 = 7 { 0 } #elif STEPPER_PAGE_FORMAT == SP_4x2_256 - { 0, 0, 0, 0 }, // 0 - { 0, 1, 0, 0 }, // 1 - { 1, 0, 1, 0 }, // 2 - { 1, 1, 1, 0 }, // 3 + { 0, 0, 0 }, // 0 + { 0, 1, 0 }, // 1 + { 1, 0, 1 }, // 2 + { 1, 1, 1 }, // 3 #elif STEPPER_PAGE_FORMAT == SP_4x1_512 diff --git a/Marlin/src/feature/direct_stepping.h b/Marlin/src/feature/direct_stepping.h index dea2616508d2..cde9d1a0b438 100644 --- a/Marlin/src/feature/direct_stepping.h +++ b/Marlin/src/feature/direct_stepping.h @@ -70,7 +70,6 @@ namespace DirectStepping { static volatile PageState page_states[Cfg::NUM_PAGES]; static volatile bool page_states_dirty; - static millis_t next_response; static uint8_t pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; static uint8_t checksum; @@ -94,14 +93,11 @@ namespace DirectStepping { static constexpr int DIRECTIONAL = dir ? 1 : 0; static constexpr int SEGMENTS = segments; - static constexpr int RAW = (BITS_SEGMENT == 1) ? 1 : 0; static constexpr int NUM_SEGMENTS = 1 << BITS_SEGMENT; - static constexpr int SEGMENT_STEPS = 1 << (BITS_SEGMENT - DIRECTIONAL - RAW); + static constexpr int SEGMENT_STEPS = (1 << (BITS_SEGMENT - DIRECTIONAL)) - 1; static constexpr int TOTAL_STEPS = SEGMENT_STEPS * SEGMENTS; static constexpr int PAGE_SIZE = (NUM_AXES * BITS_SEGMENT * SEGMENTS) / 8; - static constexpr millis_t RESPONSE_INTERVAL_MS = 50; - typedef typename TypeSelector<(PAGE_SIZE>256), uint16_t, uint8_t>::type write_byte_idx_t; typedef typename TypeSelector<(NUM_PAGES>256), uint16_t, uint8_t>::type page_idx_t; }; diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index e5f65a3cdd97..0e70fd370cf9 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1578,12 +1578,11 @@ void Stepper::pulse_phase_isr() { #if STEPPER_PAGE_FORMAT == SP_4x4D_128 - #define PAGE_SEGMENT_UPDATE(AXIS, VALUE, MID) do{ \ - if ((VALUE) == MID) {} \ - else if ((VALUE) < MID) SBI(dm, _AXIS(AXIS)); \ - else CBI(dm, _AXIS(AXIS)); \ - page_step_state.sd[_AXIS(AXIS)] = VALUE; \ - page_step_state.bd[_AXIS(AXIS)] += VALUE; \ + #define PAGE_SEGMENT_UPDATE(AXIS, VALUE) do{ \ + if ((VALUE) < 7) SBI(dm, _AXIS(AXIS)); \ + else if ((VALUE) > 7) CBI(dm, _AXIS(AXIS)); \ + page_step_state.sd[_AXIS(AXIS)] = VALUE; \ + page_step_state.bd[_AXIS(AXIS)] += VALUE; \ }while(0) #define PAGE_PULSE_PREP(AXIS) do{ \ @@ -1592,7 +1591,7 @@ void Stepper::pulse_phase_isr() { }while(0) switch (page_step_state.segment_steps) { - case 8: + case DirectStepping::Config::SEGMENT_STEPS: page_step_state.segment_idx += 2; page_step_state.segment_steps = 0; // fallthru @@ -1601,10 +1600,10 @@ void Stepper::pulse_phase_isr() { high = page_step_state.page[page_step_state.segment_idx + 1]; uint8_t dm = last_direction_bits; - PAGE_SEGMENT_UPDATE(X, low >> 4, 7); - PAGE_SEGMENT_UPDATE(Y, low & 0xF, 7); - PAGE_SEGMENT_UPDATE(Z, high >> 4, 7); - PAGE_SEGMENT_UPDATE(E, high & 0xF, 7); + PAGE_SEGMENT_UPDATE(X, low >> 4); + PAGE_SEGMENT_UPDATE(Y, low & 0xF); + PAGE_SEGMENT_UPDATE(Z, high >> 4); + PAGE_SEGMENT_UPDATE(E, high & 0xF); if (dm != last_direction_bits) { last_direction_bits = dm; @@ -1615,9 +1614,9 @@ void Stepper::pulse_phase_isr() { default: break; } - PAGE_PULSE_PREP(X), - PAGE_PULSE_PREP(Y), - PAGE_PULSE_PREP(Z), + PAGE_PULSE_PREP(X); + PAGE_PULSE_PREP(Y); + PAGE_PULSE_PREP(Z); PAGE_PULSE_PREP(E); page_step_state.segment_steps++; @@ -1634,7 +1633,7 @@ void Stepper::pulse_phase_isr() { }while(0) switch (page_step_state.segment_steps) { - case 4: + case DirectStepping::Config::SEGMENT_STEPS: page_step_state.segment_idx++; page_step_state.segment_steps = 0; // fallthru @@ -1664,7 +1663,6 @@ void Stepper::pulse_phase_isr() { }while(0) uint8_t steps = page_step_state.page[page_step_state.segment_idx >> 1]; - if (page_step_state.segment_idx & 0x1) steps >>= 4; PAGE_PULSE_PREP(X, 3); From 4955aa5b783794c6a600ad2bf162748647f89143 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 26 Aug 2020 02:15:43 -0500 Subject: [PATCH 419/483] =?UTF-8?q?Prusa=20=3D>=20Pr=C5=AF=C5=A1a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 8 ++++---- Marlin/Configuration_adv.h | 8 ++++---- Marlin/src/MarlinCore.cpp | 4 ++-- Marlin/src/gcode/calibrate/G76_M871.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/module/thermistor/thermistors.h | 2 +- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 2 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 39dc195231a7..d1f94c51f0f0 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -177,7 +177,7 @@ #endif /** - * Prusa Multi-Material Unit v2 + * Průša Multi-Material Unit v2 * * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. * Requires EXTRUDERS = 5 @@ -373,7 +373,7 @@ * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan, J-Head, and E3D) (4.7k pullup) * 501 : 100K Zonestar (Tronxy X3A) Thermistor - * 502 : 100K Zonestar Thermistor used by hot bed in Zonestar Prusa P802M + * 502 : 100K Zonestar Thermistor used by hot bed in Zonestar Průša P802M * 512 : 100k RPW-Ultra hotend thermistor (4.7k pullup) * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) @@ -1720,9 +1720,9 @@ #define DISPLAY_CHARSET_HD44780 JAPANESE /** - * Info Screen Style (0:Classic, 1:Prusa) + * Info Screen Style (0:Classic, 1:Průša) * - * :[0:'Classic', 1:'Prusa'] + * :[0:'Classic', 1:'Průša'] */ #define LCD_INFO_SCREEN_STYLE 0 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 19906819a181..8df05e8a2c0b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2424,7 +2424,7 @@ * CHOPPER_DEFAULT_24V * CHOPPER_DEFAULT_36V * CHOPPER_09STEP_24V // 0.9 degree steppers (24V) - * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Prusa firmware for MK3 (24V) + * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V) * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 * * Define you own with @@ -3396,7 +3396,7 @@ #endif /** - * Prusa Multi-Material Unit v2 + * Průša Multi-Material Unit v2 * Enable in Configuration.h */ #if ENABLED(PRUSA_MMU2) @@ -3420,7 +3420,7 @@ //#define MMU2_MENUS #if ENABLED(MMU2_MENUS) // Settings for filament load / unload from the LCD menu. - // This is for Prusa MK3-style extruders. Customize for your hardware. + // This is for Průša MK3-style extruders. Customize for your hardware. #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ { 7.2, 1145 }, \ @@ -3446,7 +3446,7 @@ /** * MMU Extruder Sensor * - * Support for a Prusa (or other) IR Sensor to detect filament near the extruder + * Support for a Průša (or other) IR Sensor to detect filament near the extruder * and make loading more reliable. Suitable for an extruder equipped with a filament * sensor less than 38mm from the gears. * diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index f371ddfc6e10..a5fcfba6c0d3 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -684,7 +684,7 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { * - Read Buttons and Update the LCD * - Run i2c Position Encoders * - Auto-report Temperatures / SD Status - * - Update the Prusa MMU2 + * - Update the Průša MMU2 * - Handle Joystick jogging */ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { @@ -760,7 +760,7 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { } #endif - // Update the Prusa MMU2 + // Update the Průša MMU2 TERN_(PRUSA_MMU2, mmu2.mmu_loop()); // Handle Joystick jogging diff --git a/Marlin/src/gcode/calibrate/G76_M871.cpp b/Marlin/src/gcode/calibrate/G76_M871.cpp index f2f53d213d3a..9870d9fbe567 100644 --- a/Marlin/src/gcode/calibrate/G76_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M871.cpp @@ -45,7 +45,7 @@ * - When calibrating bed, probe temperature is held constant. * Compensation values are deltas to first probe measurement at bed temp. = 60°C. * - The hotend will not be heated at any time. - * - On my Prusa MK3S clone I put a piece of paper between the probe and the hotend + * - On my Průša MK3S clone I put a piece of paper between the probe and the hotend * so the hotend fan would not cool my probe constantly. Alternativly you could just * make sure the fan is not running while running the calibration process. * diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index ccafd413cfcb..112ff93a0e0e 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -512,7 +512,7 @@ #undef DISABLE_INACTIVE_EXTRUDER #endif -// Prusa MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE +// Průša MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE #if EITHER(MK2_MULTIPLEXER, PRUSA_MMU2) #define SINGLENOZZLE #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 671d6e84f87a..932cccd9e913 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2876,7 +2876,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif /** - * Prusa MMU2 requirements + * Průša MMU2 requirements */ #if ENABLED(PRUSA_MMU2) #if EXTRUDERS != 5 diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 44680a7baa41..56921c6d186e 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -72,7 +72,7 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(501) // 100K Zonestar thermistor #include "thermistor_501.h" #endif -#if ANY_THERMISTOR_IS(502) // Unknown thermistor used by the Zonestar Prusa P802M hot bed +#if ANY_THERMISTOR_IS(502) // Unknown thermistor used by the Zonestar Průša P802M hot bed #include "thermistor_502.h" #endif #if ANY_THERMISTOR_IS(512) // 100k thermistor in RPW-Ultra hotend, Pull-up = 4.7 kOhm, "unknown model" diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index d20fd5a6c1fb..2e55782edb41 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -127,7 +127,7 @@ #endif // -// Prusa i3 MK2 Multi Material Multiplexer Support +// Průša i3 MK2 Multi Material Multiplexer Support // //#define E_MUX0_PIN -1 //#define E_MUX1_PIN -1 diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index d34458c04498..1ffe25b49927 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -147,7 +147,7 @@ //#define NEOPIXEL_PIN PF13 // -// Prusa i3 MK2 Multi Material Multiplexer Support +// Průša i3 MK2 Multi Material Multiplexer Support // //#define E_MUX0_PIN PG3 //#define E_MUX1_PIN PG4 From 1a4b82a5d663ab7f68199bf77183047c1133e479 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 26 Aug 2020 07:13:58 -0300 Subject: [PATCH 420/483] TFT (plus Hardware SPI) for LPC (#19139) --- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 252 ++++++++++++++++-- Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h | 11 +- Marlin/src/HAL/LPC1768/include/SPI.h | 140 +++++++++- Marlin/src/HAL/LPC1768/tft/tft_spi.cpp | 153 +++++++++++ Marlin/src/HAL/LPC1768/tft/tft_spi.h | 77 ++++++ Marlin/src/HAL/LPC1768/tft/xpt2046.cpp | 129 +++++++++ Marlin/src/HAL/LPC1768/tft/xpt2046.h | 80 ++++++ Marlin/src/lcd/dogm/HAL_LCD_com_defines.h | 10 +- ...8g_dev_tft_320x240_upscale_from_128x64.cpp | 4 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 32 +++ Marlin/src/pins/pinsDebug_list.h | 19 ++ 11 files changed, 860 insertions(+), 47 deletions(-) create mode 100644 Marlin/src/HAL/LPC1768/tft/tft_spi.cpp create mode 100644 Marlin/src/HAL/LPC1768/tft/tft_spi.h create mode 100644 Marlin/src/HAL/LPC1768/tft/xpt2046.cpp create mode 100644 Marlin/src/HAL/LPC1768/tft/xpt2046.h diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index e34a102012a1..00b4310d1dc7 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -30,7 +30,7 @@ */ /** - * Hardware SPI and a software SPI implementations are included in this file. + * Hardware SPI and Software SPI implementations are included in this file. * The hardware SPI runs faster and has higher throughput but is not compatible * with some LCD interfaces/adapters. * @@ -51,6 +51,10 @@ #include "../../inc/MarlinConfig.h" #include +// Hardware SPI and SPIClass +#include +#include + // ------------------------ // Public functions // ------------------------ @@ -96,12 +100,6 @@ #else - // Hardware SPI - - #include - #include - #include - // decide which HW SPI device to use #ifndef LPC_HW_SPI_DEV #if (SCK_PIN == P0_07 && MISO_PIN == P0_08 && MOSI_PIN == P0_09) @@ -114,7 +112,7 @@ #endif #endif #endif - #if (LPC_HW_SPI_DEV == 0) + #if LPC_HW_SPI_DEV == 0 #define LPC_SSPn LPC_SSP0 #else #define LPC_SSPn LPC_SSP1 @@ -192,7 +190,7 @@ for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF); } - static uint8_t spiTransfer(uint8_t b) { + uint8_t spiTransfer(uint8_t b) { return doio(b); } @@ -211,30 +209,236 @@ #endif // LPC_SOFTWARE_SPI -void SPIClass::begin() { spiBegin(); } +/** + * @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset. + */ +static inline void waitSpiTxEnd(LPC_SSP_TypeDef *spi_d) { + while (SSP_GetStatus(spi_d, SSP_STAT_TXFIFO_EMPTY) == RESET) { /* nada */ } // wait until TXE=1 + while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0 +} + +SPIClass::SPIClass(uint8_t device) { + // Init things specific to each SPI device + // clock divider setup is a bit of hack, and needs to be improved at a later date. + + PINSEL_CFG_Type PinCfg; // data structure to hold init values + #if BOARD_NR_SPI >= 1 + _settings[0].spi_d = LPC_SSP0; + // _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); + PinCfg.Funcnum = 2; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_SCK_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_SCK_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(BOARD_SPI1_SCK_PIN); + + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_MISO_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_MISO_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_INPUT(BOARD_SPI1_MISO_PIN); + + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI1_MOSI_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI1_MOSI_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(BOARD_SPI1_MOSI_PIN); + #endif + + #if BOARD_NR_SPI >= 2 + _settings[1].spi_d = LPC_SSP1; + // _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); + PinCfg.Funcnum = 2; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_SCK_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_SCK_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(BOARD_SPI2_SCK_PIN); + + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_MISO_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_MISO_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_INPUT(BOARD_SPI2_MISO_PIN); + + PinCfg.Pinnum = LPC176x::pin_bit(BOARD_SPI2_MOSI_PIN); + PinCfg.Portnum = LPC176x::pin_port(BOARD_SPI2_MOSI_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(BOARD_SPI2_MOSI_PIN); + #endif + + setModule(device); + + /* Initialize GPDMA controller */ + //TODO: call once in the constructor? or each time? + GPDMA_Init(); +} + +void SPIClass::begin() { + updateSettings(); + SSP_Cmd(_currentSetting->spi_d, ENABLE); // start SSP running +} void SPIClass::beginTransaction(const SPISettings &cfg) { - uint8_t spiRate; - switch (cfg.spiRate()) { - case 8000000: spiRate = 0; break; - case 4000000: spiRate = 1; break; - case 2000000: spiRate = 2; break; - case 1000000: spiRate = 3; break; - case 500000: spiRate = 4; break; - case 250000: spiRate = 5; break; - case 125000: spiRate = 6; break; - default: spiRate = 2; break; - } - spiInit(spiRate); + setBitOrder(cfg.bitOrder); + setDataMode(cfg.dataMode); + setDataSize(cfg.dataSize); + //setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); + begin(); } -uint8_t SPIClass::transfer(const uint8_t B) { return spiTransfer(B); } +uint8_t SPIClass::transfer(const uint16_t b) { + /* send and receive a single byte */ + SSP_ReceiveData(_currentSetting->spi_d); // read any previous data + SSP_SendData(_currentSetting->spi_d, b); + waitSpiTxEnd(_currentSetting->spi_d); // wait for it to finish + return SSP_ReceiveData(_currentSetting->spi_d); +} uint16_t SPIClass::transfer16(const uint16_t data) { return (transfer((data >> 8) & 0xFF) << 8) | (transfer(data & 0xFF) & 0xFF); } -SPIClass SPI; +void SPIClass::end() { + // SSP_Cmd(_currentSetting->spi_d, DISABLE); // stop device or SSP_DeInit? + SSP_DeInit(_currentSetting->spi_d); +} + +void SPIClass::send(uint8_t data) { + SSP_SendData(_currentSetting->spi_d, data); +} + +void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) { + //TODO: LPC dma can only write 0xFFF bytes at once. + GPDMA_Channel_CFG_Type GPDMACfg; + + /* Configure GPDMA channel 0 -------------------------------------------------------------*/ + /* DMA Channel 0 */ + GPDMACfg.ChannelNum = 0; + // Source memory + GPDMACfg.SrcMemAddr = (uint32_t)buf; + // Destination memory - Not used + GPDMACfg.DstMemAddr = 0; + // Transfer size + GPDMACfg.TransferSize = (minc ? length : 1); + // Transfer width + GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE; + // Transfer type + GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P; + // Source connection - unused + GPDMACfg.SrcConn = 0; + // Destination connection + GPDMACfg.DstConn = (_currentSetting->spi_d == LPC_SSP0) ? GPDMA_CONN_SSP0_Tx : GPDMA_CONN_SSP1_Tx; + + GPDMACfg.DMALLI = 0; + + // Enable dma on SPI + SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE); + + // if minc=false, I'm repeating the same byte 'length' times, as I could not find yet how do GPDMA without memory increment + do { + // Setup channel with given parameter + GPDMA_Setup(&GPDMACfg); + + // enabled dma + GPDMA_ChannelCmd(0, ENABLE); + + // wait data transfer + while (!GPDMA_IntGetStatus(GPDMA_STAT_INTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_INTERR, 0)) { } + + // clear err and int + GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); + GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0); + + // dma disable + GPDMA_ChannelCmd(0, DISABLE); + + --length; + } while (!minc && length > 0); + + waitSpiTxEnd(_currentSetting->spi_d); + + SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, DISABLE); +} + +uint16_t SPIClass::read() { + return SSP_ReceiveData(_currentSetting->spi_d); +} + +void SPIClass::read(uint8_t *buf, uint32_t len) { + for (uint16_t i = 0; i < len; i++) buf[i] = transfer(0xFF); +} + +void SPIClass::setClock(uint32_t clock) { + _currentSetting->clock = clock; +} + +void SPIClass::setModule(uint8_t device) { + _currentSetting = &_settings[device - 1];// SPI channels are called 1 2 and 3 but the array is zero indexed +} + +void SPIClass::setBitOrder(uint8_t bitOrder) { + _currentSetting->bitOrder = bitOrder; +} + +void SPIClass::setDataMode(uint8_t dataMode) { + _currentSetting->dataSize = dataMode; +} + +void SPIClass::setDataSize(uint32_t ds) { + _currentSetting->dataSize = ds; +} + +/** + * Set up/tear down + */ +void SPIClass::updateSettings() { + //SSP_DeInit(_currentSetting->spi_d); //todo: need force de init?! + + // divide PCLK by 2 for SSP0 + CLKPWR_SetPCLKDiv(_currentSetting->spi_d == LPC_SSP0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2); + + SSP_CFG_Type HW_SPI_init; // data structure to hold init values + SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode + HW_SPI_init.ClockRate = _currentSetting->clock; + HW_SPI_init.Databit = _currentSetting->dataSize; + + /** + * SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge + * 0 0 0 Falling Rising + * 1 0 1 Rising Falling + * 2 1 0 Rising Falling + * 3 1 1 Falling Rising + */ + switch (_currentSetting->dataMode) { + case SPI_MODE0: + HW_SPI_init.CPHA = SSP_CPHA_FIRST; + HW_SPI_init.CPOL = SSP_CPOL_HI; + break; + case SPI_MODE1: + HW_SPI_init.CPHA = SSP_CPHA_SECOND; + HW_SPI_init.CPOL = SSP_CPOL_HI; + break; + case SPI_MODE2: + HW_SPI_init.CPHA = SSP_CPHA_FIRST; + HW_SPI_init.CPOL = SSP_CPOL_LO; + break; + case SPI_MODE3: + HW_SPI_init.CPHA = SSP_CPHA_SECOND; + HW_SPI_init.CPOL = SSP_CPOL_LO; + break; + default: + break; + } + + // TODO: handle bitOrder + SSP_Init(_currentSetting->spi_d, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers +} + +#if MISO_PIN == BOARD_SPI1_MISO_PIN + SPIClass SPI(1); +#elif MISO_PIN == BOARD_SPI2_MISO_PIN + SPIClass SPI(2); +#endif #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h index 7d4de40faac2..b9bc0bf82e61 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h @@ -21,6 +21,13 @@ */ #pragma once -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/LPC1768." +#if HAS_FSMC_TFT + #error "Sorry! FSMC TFT displays are not current available for HAL/LPC1768." +#endif + +// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' +#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT + #undef TOUCH_SCREEN + #undef TOUCH_SCREEN_CALIBRATION + #define HAS_TOUCH_XPT2046 1 #endif diff --git a/Marlin/src/HAL/LPC1768/include/SPI.h b/Marlin/src/HAL/LPC1768/include/SPI.h index 4acd9e7022a9..e2645b9290db 100644 --- a/Marlin/src/HAL/LPC1768/include/SPI.h +++ b/Marlin/src/HAL/LPC1768/include/SPI.h @@ -24,25 +24,139 @@ #include "../../shared/HAL_SPI.h" #include +#include +#include -#define MSBFIRST 1 -#define SPI_MODE3 0 +//#define MSBFIRST 1 + +#define SPI_MODE0 0 +#define SPI_MODE1 1 +#define SPI_MODE2 2 +#define SPI_MODE3 3 + +#define DATA_SIZE_8BIT SSP_DATABIT_8 +#define DATA_SIZE_16BIT SSP_DATABIT_16 + +#define SPI_CLOCK_DIV2 8333333 //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED +#define SPI_CLOCK_DIV4 4166667 //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED +#define SPI_CLOCK_DIV8 2083333 //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED +#define SPI_CLOCK_DIV16 1000000 //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED +#define SPI_CLOCK_DIV32 500000 //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 +#define SPI_CLOCK_DIV64 250000 //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 +#define SPI_CLOCK_DIV128 125000 //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h + +#define SPI_CLOCK_MAX SPI_CLOCK_DIV2 + +#define BOARD_NR_SPI 2 + +//#define BOARD_SPI1_NSS_PIN PA4 ?! +#define BOARD_SPI1_SCK_PIN P0_15 +#define BOARD_SPI1_MISO_PIN P0_17 +#define BOARD_SPI1_MOSI_PIN P0_18 + +//#define BOARD_SPI2_NSS_PIN PB12 ?! +#define BOARD_SPI2_SCK_PIN P0_07 +#define BOARD_SPI2_MISO_PIN P0_08 +#define BOARD_SPI2_MOSI_PIN P0_09 class SPISettings { - public: - SPISettings(uint32_t speed, int, int) : spi_speed(speed) {}; - uint32_t spiRate() const { return spi_speed; } - private: - uint32_t spi_speed; +public: + SPISettings(uint32_t speed, int, int) : spi_speed(speed) {}; + SPISettings(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { + if (__builtin_constant_p(inClock)) + init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); + else + init_MightInline(inClock, inBitOrder, inDataMode, inDataSize); + } + SPISettings() { + init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); + } + + uint32_t spiRate() const { return spi_speed; } + +private: + void init_MightInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { + init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); + } + void init_AlwaysInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) __attribute__((__always_inline__)) { + clock = inClock; + bitOrder = inBitOrder; + dataMode = inDataMode; + dataSize = inDataSize; + } + + uint32_t spi_speed; + uint32_t clock; + uint32_t dataSize; + //uint32_t clockDivider; + uint8_t bitOrder; + uint8_t dataMode; + LPC_SSP_TypeDef *spi_d; + + friend class SPIClass; }; +/** + * @brief Wirish SPI interface. + * + * This is the same interface is available across HAL + * + * This implementation uses software slave management, so the caller + * is responsible for controlling the slave select line. + */ class SPIClass { - public: - void begin(); - void beginTransaction(const SPISettings&); - void endTransaction() {}; - uint8_t transfer(uint8_t data); - uint16_t transfer16(uint16_t data); +public: + /** + * @param spiPortNumber Number of the SPI port to manage. + */ + SPIClass(uint8_t spiPortNumber); + + /** + * Select and configure the current selected SPI device to use + */ + void begin(); + + /** + * Disable the current SPI device + */ + void end(); + + void beginTransaction(const SPISettings&); + void endTransaction() {}; + + // Transfer using 1 "Data Size" + uint8_t transfer(uint16_t data); + // Transfer 2 bytes in 8 bit mode + uint16_t transfer16(uint16_t data); + + void send(uint8_t data); + + uint16_t read(); + void read(uint8_t *buf, uint32_t len); + + void dmaSend(void *buf, uint16_t length, bool minc); + + /** + * @brief Sets the number of the SPI peripheral to be used by + * this HardwareSPI instance. + * + * @param spi_num Number of the SPI port. 1-2 in low density devices + * or 1-3 in high density devices. + */ + void setModule(uint8_t device); + + void setClock(uint32_t clock); + void setBitOrder(uint8_t bitOrder); + void setDataMode(uint8_t dataMode); + void setDataSize(uint32_t ds); + + inline uint32_t getDataSize() { return _currentSetting->dataSize; } + +private: + SPISettings _settings[BOARD_NR_SPI]; + SPISettings *_currentSetting; + + void updateSettings(); }; extern SPIClass SPI; diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp new file mode 100644 index 000000000000..84907acd0702 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp @@ -0,0 +1,153 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_SPI_TFT + +#include "tft_spi.h" + +//TFT_SPI tft; + +SPIClass TFT_SPI::SPIx(1); + +#define TFT_CS_H WRITE(TFT_CS_PIN, HIGH) +#define TFT_CS_L WRITE(TFT_CS_PIN, LOW) + +#define TFT_DC_H WRITE(TFT_DC_PIN, HIGH) +#define TFT_DC_L WRITE(TFT_DC_PIN, LOW) + +#define TFT_RST_H WRITE(TFT_RESET_PIN, HIGH) +#define TFT_RST_L WRITE(TFT_RESET_PIN, LOW) + +#define TFT_BLK_H WRITE(TFT_BACKLIGHT_PIN, HIGH) +#define TFT_BLK_L WRITE(TFT_BACKLIGHT_PIN, LOW) + +void TFT_SPI::Init() { + #if PIN_EXISTS(TFT_RESET) + SET_OUTPUT(TFT_RESET_PIN); + TFT_RST_H; + delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + SET_OUTPUT(TFT_BACKLIGHT_PIN); + TFT_BLK_H; + #endif + + SET_OUTPUT(TFT_DC_PIN); + SET_OUTPUT(TFT_CS_PIN); + + TFT_DC_H; + TFT_CS_H; + + /** + * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz + * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 + * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 + */ + #if 0 + #if SPI_DEVICE == 1 + #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 + #else + #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 + #endif + uint8_t clock; + uint8_t spiRate = SPI_FULL_SPEED; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX ; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + #endif + + #if TFT_MISO_PIN == BOARD_SPI1_MISO_PIN + SPIx.setModule(1); + #elif TFT_MISO_PIN == BOARD_SPI2_MISO_PIN + SPIx.setModule(2); + #endif + SPIx.setClock(SPI_CLOCK_MAX); + SPIx.setBitOrder(MSBFIRST); + SPIx.setDataMode(SPI_MODE0); +} + +void TFT_SPI::DataTransferBegin(uint16_t DataSize) { + SPIx.setDataSize(DataSize); + SPIx.begin(); + TFT_CS_L; +} + +uint32_t TFT_SPI::GetID() { + uint32_t id; + id = ReadID(LCD_READ_ID); + if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) + id = ReadID(LCD_READ_ID4); + return id; +} + +uint32_t TFT_SPI::ReadID(uint16_t Reg) { + uint32_t data = 0; + + #if PIN_EXISTS(TFT_MISO) + uint8_t d = 0; + SPIx.setDataSize(DATASIZE_8BIT); + SPIx.setClock(SPI_CLOCK_DIV64); + SPIx.begin(); + TFT_CS_L; + WriteReg(Reg); + + LOOP_L_N(i, 4) { + SPIx.read((uint8_t*)&d, 1); + data = (data << 8) | d; + } + + DataTransferEnd(); + SPIx.setClock(SPI_CLOCK_MAX); + #endif + + return data >> 7; +} + +bool TFT_SPI::isBusy() { + return false; +} + +void TFT_SPI::Abort() { + DataTransferEnd(); +} + +void TFT_SPI::Transmit(uint16_t Data) { + SPIx.transfer(Data); +} + +void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + DataTransferBegin(DATASIZE_16BIT); //16 + TFT_DC_H; + SPIx.dmaSend(Data, Count, MemoryIncrease); + DataTransferEnd(); +} + +#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.h b/Marlin/src/HAL/LPC1768/tft/tft_spi.h new file mode 100644 index 000000000000..8d3e3127bbd1 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.h @@ -0,0 +1,77 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#include +#include +// #include + +#ifndef LCD_READ_ID + #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) +#endif +#ifndef LCD_READ_ID4 + #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) +#endif + +#define DATASIZE_8BIT SSP_DATABIT_8 +#define DATASIZE_16BIT SSP_DATABIT_16 +#define TFT_IO TFT_SPI + +#define DMA_MINC_ENABLE 1 +#define DMA_MINC_DISABLE 0 + +class TFT_SPI { +private: + static uint32_t ReadID(uint16_t Reg); + static void Transmit(uint16_t Data); + static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + +public: + static SPIClass SPIx; + + static void Init(); + static uint32_t GetID(); + static bool isBusy(); + static void Abort(); + + static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT); + static void DataTransferEnd() { OUT_WRITE(TFT_CS_PIN, HIGH); SPIx.end(); }; + static void DataTransferAbort(); + + static void WriteData(uint16_t Data) { Transmit(Data); } + static void WriteReg(uint16_t Reg) { OUT_WRITE(TFT_A0_PIN, LOW); Transmit(Reg); OUT_WRITE(TFT_A0_PIN, HIGH); } + + static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } + // static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + static void WriteMultiple(uint16_t Color, uint32_t Count) { + static uint16_t Data; Data = Color; + //LPC dma can only write 0xFFF bytes at once. + #define MAX_DMA_SIZE (0xFFF - 1) + while (Count > 0) { + TransmitDMA(DMA_MINC_DISABLE, &Data, Count > MAX_DMA_SIZE ? MAX_DMA_SIZE : Count); + Count = Count > MAX_DMA_SIZE ? Count - MAX_DMA_SIZE : 0; + } + #undef MAX_DMA_SIZE + } +}; diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp new file mode 100644 index 000000000000..c72e5f0eac44 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046 + +#include "xpt2046.h" +#include + +uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include + + SPIClass XPT2046::SPIx(TOUCH_BUTTONS_HW_SPI_DEVICE); + + static void touch_spi_init(uint8_t spiRate) { + XPT2046::SPIx.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); + XPT2046::SPIx.setClock(SPI_CLOCK_DIV128); + XPT2046::SPIx.setBitOrder(MSBFIRST); + XPT2046::SPIx.setDataMode(SPI_MODE0); + XPT2046::SPIx.setDataSize(DATA_SIZE_8BIT); + } +#endif + +void XPT2046::Init() { + SET_INPUT(TOUCH_MISO_PIN); + SET_OUTPUT(TOUCH_MOSI_PIN); + SET_OUTPUT(TOUCH_SCK_PIN); + OUT_WRITE(TOUCH_CS_PIN, HIGH); + + #if PIN_EXISTS(TOUCH_INT) + // Optional Pendrive interrupt pin + SET_INPUT(TOUCH_INT_PIN); + #endif + + TERN_(TOUCH_BUTTONS_HW_SPI, touch_spi_init(SPI_SPEED_6)); + + // Read once to enable pendrive status pin + getRawData(XPT2046_X); +} + +bool XPT2046::isTouched() { + return isBusy() ? false : ( + #if PIN_EXISTS(TOUCH_INT) + READ(TOUCH_INT_PIN) != HIGH + #else + getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD + #endif + ); +} + +bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { + if (isBusy()) return false; + if (!isTouched()) return false; + *x = getRawData(XPT2046_X); + *y = getRawData(XPT2046_Y); + SERIAL_ECHOLNPAIR("X: ", *x, ", Y: ", *y); + return isTouched(); +} + +uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { + uint16_t data[3]; + + DataTransferBegin(); + TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.begin()); + + for (uint16_t i = 0; i < 3 ; i++) { + IO(coordinate); + data[i] = (IO() << 4) | (IO() >> 4); + } + + TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.end()); + DataTransferEnd(); + + uint16_t delta01 = delta(data[0], data[1]), + delta02 = delta(data[0], data[2]), + delta12 = delta(data[1], data[2]); + + if (delta01 > delta02 || delta01 > delta12) + data[delta02 > delta12 ? 0 : 1] = data[2]; + + return (data[0] + data[1]) >> 1; +} + +uint16_t XPT2046::IO(uint16_t data) { + return TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); +} + +extern uint8_t spiTransfer(uint8_t b); + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + uint16_t XPT2046::HardwareIO(uint16_t data) { + return SPIx.transfer(data & 0xFF); + } +#endif + +uint16_t XPT2046::SoftwareIO(uint16_t data) { + uint16_t result = 0; + + for (uint8_t j = 0x80; j; j >>= 1) { + WRITE(TOUCH_SCK_PIN, LOW); + WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); + if (READ(TOUCH_MISO_PIN)) result |= j; + WRITE(TOUCH_SCK_PIN, HIGH); + } + WRITE(TOUCH_SCK_PIN, LOW); + + return result; +} + +#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.h b/Marlin/src/HAL/LPC1768/tft/xpt2046.h new file mode 100644 index 000000000000..019f75efce12 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.h @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + #include +#endif + +#ifndef TOUCH_MISO_PIN + #define TOUCH_MISO_PIN MISO_PIN +#endif +#ifndef TOUCH_MOSI_PIN + #define TOUCH_MOSI_PIN MOSI_PIN +#endif +#ifndef TOUCH_SCK_PIN + #define TOUCH_SCK_PIN SCK_PIN +#endif +#ifndef TOUCH_CS_PIN + #define TOUCH_CS_PIN CS_PIN +#endif +#ifndef TOUCH_INT_PIN + #define TOUCH_INT_PIN -1 +#endif + +#define XPT2046_DFR_MODE 0x00 +#define XPT2046_SER_MODE 0x04 +#define XPT2046_CONTROL 0x80 + +enum XPTCoordinate : uint8_t { + XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, + XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, +}; + +#if !defined(XPT2046_Z1_THRESHOLD) + #define XPT2046_Z1_THRESHOLD 10 +#endif + +class XPT2046 { +private: + static bool isBusy() { return false; } + + static uint16_t getRawData(const XPTCoordinate coordinate); + static bool isTouched(); + + static inline void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; + static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + static uint16_t HardwareIO(uint16_t data); + #endif + static uint16_t SoftwareIO(uint16_t data); + static uint16_t IO(uint16_t data = 0); + +public: + #if ENABLED(TOUCH_BUTTONS_HW_SPI) + static SPIClass SPIx; + #endif + + static void Init(); + static bool getRawPoint(int16_t *x, int16_t *y); +}; diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index 455fc2388ee9..da7d4f6f1ec0 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -82,11 +82,6 @@ #define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn - #if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) - uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_TFT_FN u8g_com_stm32duino_tft_fn - #endif - #elif defined(TARGET_LPC1768) uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); @@ -117,6 +112,9 @@ #ifndef U8G_COM_SSD_I2C_HAL #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn #endif -#ifndef U8G_COM_HAL_TFT_FN +#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) + uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_TFT_FN u8g_com_hal_tft_fn +#else #define U8G_COM_HAL_TFT_FN u8g_com_null_fn #endif diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp index b8bfdb293a97..39c294defe5b 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp @@ -760,7 +760,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT -uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { +uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { if (msgInitCount) { if (msg == U8G_COM_MSG_INIT) msgInitCount--; if (msgInitCount) return -1; @@ -801,7 +801,7 @@ uint8_t u8g_com_stm32duino_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void break; case U8G_COM_MSG_WRITE_SEQ: - tftio.DataTransferBegin(DATASIZE_8BIT); + tftio.DataTransferBegin(DATASIZE_16BIT); for (uint8_t i = 0; i < arg_val; i += 2) tftio.WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); tftio.DataTransferEnd(); diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 8fbf382be798..b32f99c68db0 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -274,6 +274,38 @@ #define FORCE_SOFT_SPI #define LCD_BACKLIGHT_PIN -1 + #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI + #define SS_PIN -1 + //#define ONBOARD_SD_CS_PIN -1 + + #define TFT_CS_PIN P1_22 + #define TFT_A0_PIN P1_23 + #define TFT_DC_PIN P1_23 + #define TFT_MISO_PIN P0_17 + #define TFT_BACKLIGHT_PIN P1_18 + #define TFT_RESET_PIN P1_19 + + #define LPC_HW_SPI_DEV 0 + #define LCD_USE_DMA_SPI + + #define TOUCH_INT_PIN P1_21 + #define TOUCH_CS_PIN P1_20 + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 + #endif + + // SPI 1 + #define SCK_PIN P0_15 + #define MISO_PIN P0_17 + #define MOSI_PIN P0_18 + + // Disable any LCD related PINs config + #define LCD_PINS_ENABLE -1 + #define LCD_PINS_RS -1 + #else #define BTN_ENC P0_28 // (58) open-drain diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 3307cbde97e8..ac15a3c9bae2 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -1421,3 +1421,22 @@ #if PIN_EXISTS(ESP_WIFI_MODULE_GPIO2) REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_GPIO2_PIN) #endif +// TFT PINS +#if PIN_EXISTS(TFT_CS) + REPORT_NAME_DIGITAL(__LINE__, TFT_CS_PIN) +#endif +#if PIN_EXISTS(TFT_A0) + REPORT_NAME_DIGITAL(__LINE__, TFT_A0_PIN) +#endif +#if PIN_EXISTS(TFT_DC) + REPORT_NAME_DIGITAL(__LINE__, TFT_DC_PIN) +#endif +#if PIN_EXISTS(TFT_MISO) + REPORT_NAME_DIGITAL(__LINE__, TFT_MISO_PIN) +#endif +#if PIN_EXISTS(TFT_BACKLIGHT) + REPORT_NAME_DIGITAL(__LINE__, TFT_BACKLIGHT_PIN) +#endif +#if PIN_EXISTS(TFT_RESET) + REPORT_NAME_DIGITAL(__LINE__, TFT_RESET_PIN) +#endif From 91c8c6d96eb4046171c36d79b44906d2948132be Mon Sep 17 00:00:00 2001 From: ellensp Date: Wed, 26 Aug 2020 22:14:54 +1200 Subject: [PATCH 421/483] Fix NEOPIXEL_STARTUP_TEST last delay (#19156) --- Marlin/src/feature/leds/neopixel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index ce2e4ee77b40..12759302e6ca 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -89,6 +89,7 @@ void Marlin_NeoPixel::init() { set_color_startup(adaneo1.Color(0, 255, 0, 0)); // green safe_delay(500); set_color_startup(adaneo1.Color(0, 0, 255, 0)); // blue + safe_delay(500); #endif #ifdef NEOPIXEL_BKGD_LED_INDEX From 195d20cef2d7cf08d3a95899df05c9e67cd859da Mon Sep 17 00:00:00 2001 From: thordarsen <50306469+thordarsen@users.noreply.github.com> Date: Wed, 26 Aug 2020 06:23:56 -0400 Subject: [PATCH 422/483] Fix SINGLENOZZLE fan speed bug (#19152) --- Marlin/src/module/temperature.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 813bcc061b96..b162173bc606 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -210,9 +210,10 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, if (target < EXTRUDERS) singlenozzle_fan_speed[target] = speed; return; } - target = 0; // Always use fan index 0 with SINGLENOZZLE #endif + TERN_(SINGLENOZZLE, target = 0); // Always use fan index 0 with SINGLENOZZLE + if (target >= FAN_COUNT) return; fan_speed[target] = speed; From 84ad7cdc293f60b775c1132da6c081a3a4b98cd2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 27 Aug 2020 00:11:19 +0000 Subject: [PATCH 423/483] [cron] Bump distribution date (2020-08-27) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 08d0b6358b87..ee62ee7aab1b 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-26" + #define STRING_DISTRIBUTION_DATE "2020-08-27" #endif /** From 1e124e6713a2ced61a1b3113c02e575391184b23 Mon Sep 17 00:00:00 2001 From: George Fu Date: Thu, 27 Aug 2020 08:41:15 +0800 Subject: [PATCH 424/483] FYSETC S6 2.0 (#19140) --- Marlin/src/core/boards.h | 5 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 59 ++++++++++------ Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h | 67 +++++++++++++++++++ 4 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index cadbc714211f..c880b3d3256a 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -345,8 +345,9 @@ #define BOARD_LERDGE_X 4215 // Lerdge X (STM32F407VE) #define BOARD_VAKE403D 4216 // VAkE 403D (STM32F446VET6) #define BOARD_FYSETC_S6 4217 // FYSETC S6 board -#define BOARD_FLYF407ZG 4218 // FLYF407ZG board (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4219 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_FYSETC_S6_V2_0 4218 // FYSETC S6 v2.0 board +#define BOARD_FLYF407ZG 4219 // FLYF407ZG board (STM32F407ZG) +#define BOARD_MKS_ROBIN2 4220 // MKS_ROBIN2 (STM32F407ZE) // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index f2aec72c4605..22f6ea663ce0 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -606,6 +606,8 @@ #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG #elif MB(MKS_ROBIN2) #include "stm32f4/pins_MKS_ROBIN2.h" // STM32F4 env:MKS_ROBIN2 +#elif MB(FYSETC_S6_V2_0) + #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 // // ARM Cortex M7 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 116aa14cf1da..9ffedc2ac477 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -28,7 +28,7 @@ #endif #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "FYSETC_S6" + #define BOARD_INFO_NAME "FYSETC S6" #endif #ifndef DEFAULT_MACHINE_NAME #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME @@ -82,7 +82,9 @@ // #define X_STEP_PIN PE11 #define X_DIR_PIN PE10 -#define X_ENABLE_PIN PE12 +#ifndef X_ENABLE_PIN + #define X_ENABLE_PIN PE12 +#endif #define X_CS_PIN PE7 #define Y_STEP_PIN PD8 @@ -118,23 +120,42 @@ // // Software serial // - #define X_SERIAL_TX_PIN PE9 - #define X_SERIAL_RX_PIN PE8 - - #define Y_SERIAL_TX_PIN PE14 - #define Y_SERIAL_RX_PIN PE13 - - #define Z_SERIAL_TX_PIN PD11 - #define Z_SERIAL_RX_PIN PD12 - - #define E0_SERIAL_TX_PIN PD3 - #define E0_SERIAL_RX_PIN PA15 - - #define E1_SERIAL_TX_PIN PC4 - #define E1_SERIAL_RX_PIN PC5 - - #define E2_SERIAL_TX_PIN PE1 - #define E2_SERIAL_RX_PIN PE0 + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN PE9 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN PE8 + #endif + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN PE14 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN PE13 + #endif + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN PD11 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN PD12 + #endif + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN PD3 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN PA15 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN PC4 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN PC5 + #endif + #ifndef E2_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN PE1 + #endif + #ifndef E2_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN PE0 + #endif #endif // diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h new file mode 100644 index 000000000000..6cd970501fde --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#define BOARD_INFO_NAME "FYSETC S6 2.0" + +// +// EEPROM Emulation +// +#if NO_EEPROM_SELECTED + #undef NO_EEPROM_SELECTED + //#define FLASH_EEPROM_EMULATION + //#define SRAM_EEPROM_EMULATION + #define I2C_EEPROM +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PE9 + +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN PE8 + #define Y_SERIAL_TX_PIN PC4 + #define Y_SERIAL_RX_PIN PC4 + #define Z_SERIAL_TX_PIN PD12 + #define E0_SERIAL_TX_PIN PA15 + #define E1_SERIAL_TX_PIN PC5 + #define E2_SERIAL_TX_PIN PE0 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#define TMC_USE_SW_SPI +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PE14 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PE13 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PE12 + #endif +#endif + +#include "pins_FYSETC_S6.h" From cb75bec06db06908bc7a044b184411ad75a86f93 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 27 Aug 2020 13:29:07 -0300 Subject: [PATCH 425/483] One MARLIN_DEV_MODE warning per rebuild (#19163) --- Marlin/src/MarlinCore.cpp | 4 ++++ Marlin/src/inc/SanityCheck.h | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index a5fcfba6c0d3..e040c3b26c5b 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -30,6 +30,10 @@ #include "MarlinCore.h" +#if ENABLED(MARLIN_DEV_MODE) + #warning "WARNING! Disable MARLIN_DEV_MODE for the final build!" +#endif + #include "HAL/shared/Delay.h" #include "HAL/shared/esp_wifi.h" diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 932cccd9e913..b345147ed9ea 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -75,10 +75,6 @@ #endif #undef HEXIFY -#if ENABLED(MARLIN_DEV_MODE) - #warning "WARNING! Disable MARLIN_DEV_MODE for the final build!" -#endif - /** * Warnings for old configurations */ From e8dcbd8300680f0d0f2032065952181f51d52874 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 12:22:47 -0500 Subject: [PATCH 426/483] Allocate sufficient MSG_MOVE_Z_DIST buffer See #19158 --- Marlin/src/lcd/menu/menu_motion.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 027be4029d05..77ab643cd652 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -195,11 +195,12 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - char tmp[20], numstr[10]; // Determine digits needed right of decimal - const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); + constexpr uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : + !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; + PGM_P const label = GET_TEXT(MSG_MOVE_Z_DIST); + char tmp[strlen_P(label) + 10 + 1], numstr[10]; + sprintf_P(tmp, label, dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); #if DISABLED(HAS_GRAPHICAL_TFT) extern const char NUL_STR[]; From a96c5209d13976ae0cccc90089c6111a2c468954 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 14:01:36 -0500 Subject: [PATCH 427/483] =?UTF-8?q?Fix=20small=20typ=C3=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d1f94c51f0f0..44f14a8ee35e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1689,7 +1689,7 @@ * Select the language to display on the LCD. These languages are available: * * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it, - * jp_kana, ko_KR, nl, pl, pt, pt_br, ro ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, tr, uk, vi, zh_CN, zh_TW, test * * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ From 21070c0aaf433ddc2ff00d9959a8704a8185e884 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 14:01:56 -0500 Subject: [PATCH 428/483] Fix Creality V4 probe pin --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 9ee8aa742365..ded0ba405b4c 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -81,7 +81,7 @@ #define Y_STOP_PIN PA6 #define Z_STOP_PIN PA7 -#define Z_PROBE_PIN PB1 // BLTouch IN +#define Z_MIN_PROBE_PIN PB1 // BLTouch IN // // Filament Runout Sensor From 97ec6c1be6f7b3b2e185be9f1637639815acbb1a Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Thu, 27 Aug 2020 14:18:16 -0500 Subject: [PATCH 429/483] Independent Neopixel option (#19115) --- Marlin/Configuration.h | 13 ++++- Marlin/Configuration_adv.h | 9 ++++ Marlin/src/MarlinCore.cpp | 4 ++ Marlin/src/feature/leds/leds.cpp | 51 +++++++++++++++---- Marlin/src/feature/leds/leds.h | 45 +++++++++++++++-- Marlin/src/feature/leds/neopixel.cpp | 53 ++++++++++++++++++- Marlin/src/feature/leds/neopixel.h | 70 ++++++++++++++++++++------ Marlin/src/gcode/feature/leds/M150.cpp | 28 +++++++++-- Marlin/src/inc/Conditionals_LCD.h | 5 ++ Marlin/src/inc/Conditionals_adv.h | 22 ++++++++ Marlin/src/inc/SanityCheck.h | 5 ++ 11 files changed, 269 insertions(+), 36 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 44f14a8ee35e..8cd2faf7f88b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2362,12 +2362,21 @@ #define NEOPIXEL_PIN 4 // LED driving pin //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE //#define NEOPIXEL2_PIN 5 - //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel - #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip, larger of 2 strips if 2 NeoPixel strips are used + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.) #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup + // Support for second Adafruit NeoPixel LED driver controlled with M150 S1 ... + //#define NEOPIXEL2_SEPARATE + #if ENABLED(NEOPIXEL2_SEPARATE) + #define NEOPIXEL2_PIXELS 15 // Number of LEDs in the second strip + #define NEOPIXEL2_BRIGHTNESS 127 // Initial brightness (0-255) + #define NEOPIXEL2_STARTUP_TEST // Cycle through colors at startup + #else + //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel + #endif + // Use a single NeoPixel LED for static (background) lighting //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8df05e8a2c0b..e4b3fbf2ae1b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1065,6 +1065,7 @@ //#define LED_CONTROL_MENU #if ENABLED(LED_CONTROL_MENU) #define LED_COLOR_PRESETS // Enable the Preset Color menu option + //#define NEO2_COLOR_PRESETS // Enable a second NeoPixel Preset Color menu option #if ENABLED(LED_COLOR_PRESETS) #define LED_USER_PRESET_RED 255 // User defined RED value #define LED_USER_PRESET_GREEN 128 // User defined GREEN value @@ -1073,6 +1074,14 @@ #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup #endif + #if ENABLED(NEO2_COLOR_PRESETS) + #define NEO2_USER_PRESET_RED 255 // User defined RED value + #define NEO2_USER_PRESET_GREEN 128 // User defined GREEN value + #define NEO2_USER_PRESET_BLUE 0 // User defined BLUE value + #define NEO2_USER_PRESET_WHITE 255 // User defined WHITE value + #define NEO2_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define NEO2_USER_PRESET_STARTUP // Have the printer display the user preset color on startup for the second strip + #endif #endif #endif // HAS_LCD_MENU diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e040c3b26c5b..e703eaf8d999 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -995,6 +995,10 @@ void setup() { SETUP_RUN(leds.setup()); #endif + #if ENABLED(NEOPIXEL2_SEPARATE) + SETUP_RUN(leds2.setup()); + #endif + #if ENABLED(USE_CONTROLLER_FAN) // Set up fan controller to initialize also the default configurations. SETUP_RUN(controllerFan.setup()); #endif diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index d1c0bfd5e145..01bca809260e 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -44,11 +44,8 @@ #if ENABLED(LED_COLOR_PRESETS) const LEDColor LEDLights::defaultLEDColor = MakeLEDColor( - LED_USER_PRESET_RED, - LED_USER_PRESET_GREEN, - LED_USER_PRESET_BLUE, - LED_USER_PRESET_WHITE, - LED_USER_PRESET_BRIGHTNESS + LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, + LED_USER_PRESET_WHITE, LED_USER_PRESET_BRIGHTNESS ); #endif @@ -117,12 +114,13 @@ void LEDLights::set_color(const LEDColor &incol // This variant uses 3-4 separate pins for the RGB(W) components. // If the pins can do PWM then their intensity will be set. - #define UPDATE_RGBW(C,c) do { if (PWM_PIN(RGB_LED_##C##_PIN)) \ + #define UPDATE_RGBW(C,c) do { \ + if (PWM_PIN(RGB_LED_##C##_PIN)) \ analogWrite(pin_t(RGB_LED_##C##_PIN), incol.c); \ - else WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); }while(0) - UPDATE_RGBW(R,r); - UPDATE_RGBW(G,g); - UPDATE_RGBW(B,b); + else \ + WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); \ + }while(0) + UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b); #if ENABLED(RGBW_LED) UPDATE_RGBW(W,w); #endif @@ -158,4 +156,35 @@ void LEDLights::set_color(const LEDColor &incol #endif -#endif // HAS_COLOR_LEDS +#if ENABLED(NEOPIXEL2_SEPARATE) + + #if ENABLED(NEO2_COLOR_PRESETS) + const LEDColor LEDLights2::defaultLEDColor = MakeLEDColor( + NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, + NEO2_USER_PRESET_WHITE, NEO2_USER_PRESET_BRIGHTNESS + ); + #endif + + #if ENABLED(LED_CONTROL_MENU) + LEDColor LEDLights2::color; + bool LEDLights2::lights_on; + #endif + + LEDLights2 leds2; + + void LEDLights2::setup() { + neo2.init(); + TERN_(NEO2_USER_PRESET_STARTUP, set_default()); + } + + void LEDLights2::set_color(const LEDColor &incol) { + const uint32_t neocolor = LEDColorWhite() == incol + ? neo2.Color(NEO2_WHITE) + : neo2.Color(incol.r, incol.g, incol.b, incol.w); + neo2.set_brightness(incol.i); + neo2.set_color(neocolor); + } + +#endif // NEOPIXEL2_SEPARATE + +#endif // HAS_COLOR_LEDS diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index 1302f63c155f..a13f960a3bb2 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -155,11 +155,9 @@ class LEDLights { static inline void set_color(uint8_t r, uint8_t g, uint8_t b #if HAS_WHITE_LED , uint8_t w=0 - #if ENABLED(NEOPIXEL_LED) - , uint8_t i=NEOPIXEL_BRIGHTNESS - #endif #endif #if ENABLED(NEOPIXEL_LED) + , uint8_t i=NEOPIXEL_BRIGHTNESS , bool isSequence=false #endif ) { @@ -212,3 +210,44 @@ class LEDLights { }; extern LEDLights leds; + +#if ENABLED(NEOPIXEL2_SEPARATE) + + class LEDLights2 { + public: + LEDLights2() {} + + static void setup(); // init() + + static void set_color(const LEDColor &color); + + inline void set_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w=0, uint8_t i=NEOPIXEL2_BRIGHTNESS) { + set_color(MakeLEDColor(r, g, b, w, i)); + } + + static inline void set_off() { set_color(LEDColorOff()); } + static inline void set_green() { set_color(LEDColorGreen()); } + static inline void set_white() { set_color(LEDColorWhite()); } + + #if ENABLED(NEO2_COLOR_PRESETS) + static const LEDColor defaultLEDColor; + static inline void set_default() { set_color(defaultLEDColor); } + static inline void set_red() { set_color(LEDColorRed()); } + static inline void set_orange() { set_color(LEDColorOrange()); } + static inline void set_yellow() { set_color(LEDColorYellow()); } + static inline void set_blue() { set_color(LEDColorBlue()); } + static inline void set_indigo() { set_color(LEDColorIndigo()); } + static inline void set_violet() { set_color(LEDColorViolet()); } + #endif + + #if ENABLED(LED_CONTROL_MENU) + static LEDColor color; // last non-off color + static bool lights_on; // the last set color was "on" + static void toggle(); // swap "off" with color + static inline void update() { set_color(color); } + #endif + }; + + extern LEDLights2 leds2; + +#endif // NEOPIXEL2_SEPARATE diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 12759302e6ca..27bbeb348c5d 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -30,7 +30,7 @@ #include "neopixel.h" -#if ENABLED(NEOPIXEL_STARTUP_TEST) +#if EITHER(NEOPIXEL_STARTUP_TEST, NEOPIXEL2_STARTUP_TEST) #include "../../core/utility.h" #endif @@ -38,7 +38,7 @@ Marlin_NeoPixel neo; int8_t Marlin_NeoPixel::neoindex; Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800) - #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #if CONJOINED_NEOPIXEL , Marlin_NeoPixel::adaneo2(NEOPIXEL_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE + NEO_KHZ800) #endif ; @@ -120,4 +120,53 @@ bool Marlin_NeoPixel::set_led_color(const uint8_t r, const uint8_t g, const uint } #endif +#if ENABLED(NEOPIXEL2_SEPARATE) + + Marlin_NeoPixel2 neo2; + + int8_t Marlin_NeoPixel2::neoindex; + Adafruit_NeoPixel Marlin_NeoPixel2::adaneo(NEOPIXEL2_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE); + + void Marlin_NeoPixel2::set_color(const uint32_t color) { + if (neoindex >= 0) { + set_pixel_color(neoindex, color); + neoindex = -1; + } + else { + for (uint16_t i = 0; i < pixels(); ++i) + set_pixel_color(i, color); + } + show(); + } + + void Marlin_NeoPixel2::set_color_startup(const uint32_t color) { + for (uint16_t i = 0; i < pixels(); ++i) + set_pixel_color(i, color); + show(); + } + + void Marlin_NeoPixel2::init() { + neoindex = -1; // -1 .. NEOPIXEL2_PIXELS-1 range + set_brightness(NEOPIXEL2_BRIGHTNESS); // 0 .. 255 range + begin(); + show(); // initialize to all off + + #if ENABLED(NEOPIXEL2_STARTUP_TEST) + set_color_startup(adaneo.Color(255, 0, 0, 0)); // red + safe_delay(500); + set_color_startup(adaneo.Color(0, 255, 0, 0)); // green + safe_delay(500); + set_color_startup(adaneo.Color(0, 0, 255, 0)); // blue + safe_delay(500); + #endif + + #if ENABLED(NEO2_USER_PRESET_STARTUP) + set_color(adaneo.Color(NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, NEO2_USER_PRESET_WHITE)); + #else + set_color(adaneo.Color(0, 0, 0, 0)); + #endif + } + +#endif // NEOPIXEL2_SEPARATE + #endif // NEOPIXEL_LED diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 0d9fdefc067d..81a0a8b1c660 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -38,10 +38,14 @@ // Defines // ------------------------ -#if defined(NEOPIXEL2_TYPE) && NEOPIXEL2_TYPE != NEOPIXEL_TYPE +#if defined(NEOPIXEL2_TYPE) && NEOPIXEL2_TYPE != NEOPIXEL_TYPE && DISABLED(NEOPIXEL2_SEPARATE) #define MULTIPLE_NEOPIXEL_TYPES 1 #endif +#if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #define CONJOINED_NEOPIXEL 1 +#endif + #if NEOPIXEL_TYPE == NEO_RGB || NEOPIXEL_TYPE == NEO_RBG || NEOPIXEL_TYPE == NEO_GRB || NEOPIXEL_TYPE == NEO_GBR || NEOPIXEL_TYPE == NEO_BRG || NEOPIXEL_TYPE == NEO_BGR #define NEOPIXEL_IS_RGB 1 #else @@ -61,7 +65,7 @@ class Marlin_NeoPixel { private: static Adafruit_NeoPixel adaneo1 - #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #if CONJOINED_NEOPIXEL , adaneo2 #endif ; @@ -80,11 +84,7 @@ class Marlin_NeoPixel { static inline void begin() { adaneo1.begin(); - #if ENABLED(NEOPIXEL2_INSERIES) - adaneo2.begin(); - #else - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.begin()); - #endif + TERN_(CONJOINED_NEOPIXEL, adaneo2.begin()); } static inline void set_pixel_color(const uint16_t n, const uint32_t c) { @@ -93,23 +93,21 @@ class Marlin_NeoPixel { else adaneo1.setPixelColor(n, c); #else adaneo1.setPixelColor(n, c); - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setPixelColor(n, c)); + #if MULTIPLE_NEOPIXEL_TYPES + adaneo2.setPixelColor(n, c); + #endif #endif } static inline void set_brightness(const uint8_t b) { adaneo1.setBrightness(b); - #if ENABLED(NEOPIXEL2_INSERIES) - adaneo2.setBrightness(b); - #else - TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setBrightness(b)); - #endif + TERN_(CONJOINED_NEOPIXEL, adaneo2.setBrightness(b)); } static inline void show() { adaneo1.show(); #if PIN_EXISTS(NEOPIXEL2) - #if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #if CONJOINED_NEOPIXEL adaneo2.show(); #else adaneo1.setPin(NEOPIXEL2_PIN); @@ -132,3 +130,47 @@ class Marlin_NeoPixel { }; extern Marlin_NeoPixel neo; + +// Neo pixel channel 2 +#if ENABLED(NEOPIXEL2_SEPARATE) + + #if NEOPIXEL2_TYPE == NEO_RGB || NEOPIXEL2_TYPE == NEO_RBG || NEOPIXEL2_TYPE == NEO_GRB || NEOPIXEL2_TYPE == NEO_GBR || NEOPIXEL2_TYPE == NEO_BRG || NEOPIXEL2_TYPE == NEO_BGR + #define NEOPIXEL2_IS_RGB 1 + #else + #define NEOPIXEL2_IS_RGBW 1 + #endif + + #if NEOPIXEL2_IS_RGB + #define NEO2_WHITE 255, 255, 255, 0 + #else + #define NEO2_WHITE 0, 0, 0, 255 + #endif + + class Marlin_NeoPixel2 { + private: + static Adafruit_NeoPixel adaneo; + + public: + static int8_t neoindex; + + static void init(); + static void set_color_startup(const uint32_t c); + + static void set_color(const uint32_t c); + + static inline void begin() { adaneo.begin(); } + static inline void set_pixel_color(const uint16_t n, const uint32_t c) { adaneo.setPixelColor(n, c); } + static inline void set_brightness(const uint8_t b) { adaneo.setBrightness(b); } + static inline void show() { adaneo.show(); } + + // Accessors + static inline uint16_t pixels() { return adaneo.numPixels();} + static inline uint8_t brightness() { return adaneo.getBrightness(); } + static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { + return adaneo.Color(r, g, b, w); + } + }; + + extern Marlin_NeoPixel2 neo2; + +#endif // NEOPIXEL2_SEPARATE diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index 83bd24c41cae..cf09bf14ead7 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -37,6 +37,9 @@ * With NEOPIXEL_LED: * I Set the NeoPixel index to affect. Default: All * + * With NEOPIXEL2_SEPARATE: + * S The NeoPixel strip to set. Default is index 0. + * * Examples: * * M150 R255 ; Turn LED red @@ -47,18 +50,35 @@ * M150 P127 ; Set LED 50% brightness * M150 P ; Set LED full brightness * M150 I1 R ; Set NEOPIXEL index 1 to red + * M150 S1 I1 R ; Set SEPARATE index 1 to red */ + void GcodeSuite::M150() { #if ENABLED(NEOPIXEL_LED) - neo.neoindex = parser.intval('I', -1); + const uint8_t index = parser.intval('I', -1); + #if ENABLED(NEOPIXEL2_SEPARATE) + const uint8_t unit = parser.intval('S'), + brightness = unit ? neo2.brightness() : neo.brightness(); + *(unit ? &neo2.neoindex : &neo.neoindex) = index; + #else + const uint8_t brightness = neo.brightness(); + neo.neoindex = index; + #endif #endif - leds.set_color(MakeLEDColor( + + const LEDColor color = MakeLEDColor( parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('U') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('B') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('W') ? (parser.has_value() ? parser.value_byte() : 255) : 0, - parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : neo.brightness() - )); + parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : brightness + ); + + #if ENABLED(NEOPIXEL2_SEPARATE) + if (unit == 1) { leds2.set_color(color); return; } + #endif + + leds.set_color(color); } #endif // HAS_COLOR_LEDS diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 112ff93a0e0e..bbe89b7c5042 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -780,3 +780,8 @@ #ifndef EXTRUDE_MINTEMP #define EXTRUDE_MINTEMP 170 #endif + +// This flag indicates if Neopixel pins are shared or separated +#if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) + #define CONJOINED_NEOPIXEL 1 +#endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index fa4f0cd9b1f6..35542f9412ab 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -246,6 +246,28 @@ #endif #endif +#if BOTH(LED_CONTROL_MENU, NEOPIXEL2_SEPARATE) + #ifndef LED2_USER_PRESET_RED + #define LED2_USER_PRESET_RED 255 + #endif + #ifndef LED2_USER_PRESET_GREEN + #define LED2_USER_PRESET_GREEN 255 + #endif + #ifndef LED2_USER_PRESET_BLUE + #define LED2_USER_PRESET_BLUE 255 + #endif + #ifndef LED2_USER_PRESET_WHITE + #define LED2_USER_PRESET_WHITE 0 + #endif + #ifndef LED2_USER_PRESET_BRIGHTNESS + #ifdef NEOPIXEL2_BRIGHTNESS + #define LED2_USER_PRESET_BRIGHTNESS NEOPIXEL2_BRIGHTNESS + #else + #define LED2_USER_PRESET_BRIGHTNESS 255 + #endif + #endif +#endif + // If platform requires early initialization of watchdog to properly boot #if ENABLED(USE_WATCHDOG) && defined(ARDUINO_ARCH_SAM) #define EARLY_WATCHDOG 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b345147ed9ea..da5ddc1c2ddb 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2120,7 +2120,12 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if !(PIN_EXISTS(NEOPIXEL) && NEOPIXEL_PIXELS > 0) #error "NEOPIXEL_LED requires NEOPIXEL_PIN and NEOPIXEL_PIXELS." #endif + #elif ENABLED(NEOPIXEL2_SEPARATE) + #if !(PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) + #error "NEOPIXEL2 requires NEOPIXEL2_PIN and NEOPIXEL2_PIXELS." + #endif #endif + #undef _RGB_TEST #if DISABLED(NO_COMPILE_TIME_PWM) From 462d3eeab15d173ade700faf961931050aed9d70 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 14:48:42 -0500 Subject: [PATCH 430/483] set_axis_not_trusted => set_axis_never_homed --- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/module/motion.cpp | 8 ++++---- Marlin/src/module/motion.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 786065b34655..7595067dbf85 100755 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -176,7 +176,7 @@ void GcodeSuite::G35() { probe.stow(); // After this operation the Z position needs correction - set_axis_not_trusted(Z_AXIS); + set_axis_never_homed(Z_AXIS); // Home Z after the alignment procedure process_subcommands_now_P(PSTR("G28Z")); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 3360dc050fcf..1fd0754ec780 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -346,7 +346,7 @@ void GcodeSuite::G34() { #if ENABLED(HOME_AFTER_G34) // After this operation the z position needs correction - set_axis_not_trusted(Z_AXIS); + set_axis_never_homed(Z_AXIS); // Home Z after the alignment procedure process_subcommands_now_P(PSTR("G28Z")); #else diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 9b8c1c60ffa5..c6378d67fc26 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1431,15 +1431,15 @@ void set_axis_is_at_home(const AxisEnum axis) { } /** - * Set an axis' to be unhomed. + * Set an axis to be unhomed. */ -void set_axis_not_trusted(const AxisEnum axis) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_not_trusted(", axis_codes[axis], ")"); +void set_axis_never_homed(const AxisEnum axis) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); CBI(axis_known_position, axis); CBI(axis_homed, axis); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_not_trusted(", axis_codes[axis], ")"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); } diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 38ce980dae98..1a0971d281c7 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -251,7 +251,7 @@ bool axis_unhomed_error(uint8_t axis_bits=0x07); void set_axis_is_at_home(const AxisEnum axis); -void set_axis_not_trusted(const AxisEnum axis); +void set_axis_never_homed(const AxisEnum axis); void homeaxis(const AxisEnum axis); From a12ac5e1754f0f66babde400a0406b6cdbff983e Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Thu, 27 Aug 2020 23:05:53 +0200 Subject: [PATCH 431/483] Mark axes not-homed with HOME_AFTER_DEACTIVATE (#18907) --- Marlin/src/feature/babystep.cpp | 5 +++-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/gcode/bedlevel/G26.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/calibrate/G28.cpp | 6 +++--- Marlin/src/gcode/calibrate/G425.cpp | 2 +- Marlin/src/gcode/calibrate/M48.cpp | 2 +- Marlin/src/gcode/feature/camera/M240.cpp | 2 +- Marlin/src/gcode/feature/clean/G12.cpp | 2 +- Marlin/src/gcode/feature/pause/G27.cpp | 2 +- Marlin/src/gcode/feature/pause/M701_M702.cpp | 4 ++-- Marlin/src/gcode/geometry/M206_M428.cpp | 2 +- Marlin/src/gcode/motion/G0_G1.cpp | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 2 +- Marlin/src/module/motion.cpp | 15 +++++++-------- Marlin/src/module/motion.h | 19 +++++++------------ Marlin/src/module/probe.cpp | 2 +- Marlin/src/module/stepper/indirection.h | 7 ++++--- Marlin/src/module/tool_change.cpp | 2 +- 20 files changed, 40 insertions(+), 44 deletions(-) diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp index 41d0a9cb1e91..b07688146110 100644 --- a/Marlin/src/feature/babystep.cpp +++ b/Marlin/src/feature/babystep.cpp @@ -26,7 +26,8 @@ #include "babystep.h" #include "../MarlinCore.h" -#include "../module/planner.h" +#include "../module/motion.h" // for axes_should_home() +#include "../module/planner.h" // for axis_steps_per_mm[] #include "../module/stepper.h" #if ENABLED(BABYSTEP_ALWAYS_AVAILABLE) @@ -54,7 +55,7 @@ void Babystep::add_mm(const AxisEnum axis, const float &mm) { } void Babystep::add_steps(const AxisEnum axis, const int16_t distance) { - if (DISABLED(BABYSTEP_WITHOUT_HOMING) && !TEST(axis_known_position, axis)) return; + if (DISABLED(BABYSTEP_WITHOUT_HOMING) && axes_should_home(_BV(axis))) return; accum += distance; // Count up babysteps for the UI steps[BS_AXIS_IND(axis)] += distance; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 69a66420f898..d13a8c3dc455 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -321,7 +321,7 @@ // Check for commands that require the printer to be homed if (may_move) { planner.synchronize(); - if (axes_need_homing()) gcode.home_all_axes(); + if (axes_should_home()) gcode.home_all_axes(); TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); } diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 2cb9c2df718e..a7ed93425cf1 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -413,7 +413,7 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float unscaled_e_move(retract, PAUSE_PARK_RETRACT_FEEDRATE); // Park the nozzle by moving up by z_lift and then moving to (x_pos, y_pos) - if (!axes_need_homing()) + if (!axes_should_home()) nozzle.park(0, park_point); #if ENABLED(DUAL_X_CARRIAGE) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 2399f207bfa2..cd0dbb13cdcb 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -490,7 +490,7 @@ void GcodeSuite::G26() { // Don't allow Mesh Validation without homing first, // or if the parameter parsing did not go OK, abort - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; // Change the tool first, if specified if (parser.seenval('T')) tool_change(parser.value_int()); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index f25fe32b07e5..e7651cc74394 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -183,7 +183,7 @@ G29_TYPE GcodeSuite::G29() { faux = ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) ? parser.boolval('C') : no_action; // Don't allow auto-leveling without homing first - if (axis_unhomed_error()) G29_RETURN(false); + if (homing_needed_error()) G29_RETURN(false); if (!no_action && planner.leveling_active && parser.boolval('O')) { // Auto-level only if needed if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> Auto-level not needed, skip"); diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 78695bc05b40..0e1f70789814 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -118,7 +118,7 @@ DEBUG_SECTION(log_G28, "home_z_safely", DEBUGGING(LEVELING)); // Disallow Z homing if X or Y homing is needed - if (axis_unhomed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return; + if (homing_needed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return; sync_plan_position(); @@ -299,8 +299,8 @@ void GcodeSuite::G28() { #else // NOT DELTA const bool homeZ = parser.seen('Z'), - needX = homeZ && TERN0(Z_SAFE_HOMING, axes_need_homing(_BV(X_AXIS))), - needY = homeZ && TERN0(Z_SAFE_HOMING, axes_need_homing(_BV(Y_AXIS))), + needX = homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(X_AXIS))), + needY = homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(Y_AXIS))), homeX = needX || parser.seen('X'), homeY = needY || parser.seen('Y'), home_all = homeX == homeY && homeX == homeZ, // All or None doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ; diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index 0ef23d28f92b..746cb108766b 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -584,7 +584,7 @@ void GcodeSuite::G425() { TEMPORARY_SOFT_ENDSTOP_STATE(false); TEMPORARY_BED_LEVELING_STATE(false); - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; measurements_t m; diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index fc9d22957b1a..aaf58eed1c78 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -55,7 +55,7 @@ extern const char SP_Y_STR[]; void GcodeSuite::M48() { - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; const int8_t verbose_level = parser.byteval('V', 1); if (!WITHIN(verbose_level, 0, 4)) { diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp index 9664ce15222b..fc350d8a558c 100644 --- a/Marlin/src/gcode/feature/camera/M240.cpp +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -126,7 +126,7 @@ void GcodeSuite::M240() { #ifdef PHOTO_POSITION - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; const xyz_pos_t old_pos = { current_position.x + parser.linearval('A'), diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp index fc99cc5c1d06..f91db39703f0 100644 --- a/Marlin/src/gcode/feature/clean/G12.cpp +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -45,7 +45,7 @@ */ void GcodeSuite::G12() { // Don't allow nozzle cleaning without homing first - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; #ifdef WIPE_SEQUENCE_COMMANDS if (!parser.seen_any()) { diff --git a/Marlin/src/gcode/feature/pause/G27.cpp b/Marlin/src/gcode/feature/pause/G27.cpp index ea6aadf173c0..3ce618d67568 100644 --- a/Marlin/src/gcode/feature/pause/G27.cpp +++ b/Marlin/src/gcode/feature/pause/G27.cpp @@ -34,7 +34,7 @@ */ void GcodeSuite::G27() { // Don't allow nozzle parking without homing first - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; nozzle.park(parser.ushortval('P')); } diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index 7449787d780b..a02f2368e21c 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -61,7 +61,7 @@ void GcodeSuite::M701() { #if ENABLED(NO_MOTION_BEFORE_HOMING) // Don't raise Z if the machine isn't homed - if (axes_need_homing()) park_point.z = 0; + if (axes_should_home()) park_point.z = 0; #endif #if ENABLED(MIXING_EXTRUDER) @@ -149,7 +149,7 @@ void GcodeSuite::M702() { #if ENABLED(NO_MOTION_BEFORE_HOMING) // Don't raise Z if the machine isn't homed - if (axes_need_homing()) park_point.z = 0; + if (axes_should_home()) park_point.z = 0; #endif #if ENABLED(MIXING_EXTRUDER) diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index 2a007427a79c..a477a1a526ef 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -61,7 +61,7 @@ void GcodeSuite::M206() { * Use M206 to set these values directly. */ void GcodeSuite::M428() { - if (axis_unhomed_error()) return; + if (homing_needed_error()) return; xyz_float_t diff; LOOP_XYZ(i) { diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp index 3aa082c25e83..b6ddf9634b7b 100644 --- a/Marlin/src/gcode/motion/G0_G1.cpp +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -52,7 +52,7 @@ void GcodeSuite::G0_G1( if (IsRunning() #if ENABLED(NO_MOTION_BEFORE_HOMING) - && !axis_unhomed_error( + && !homing_needed_error( (parser.seen('X') ? _BV(X_AXIS) : 0) | (parser.seen('Y') ? _BV(Y_AXIS) : 0) | (parser.seen('Z') ? _BV(Z_AXIS) : 0) ) diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 32fedce23747..a77e9a735462 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -181,7 +181,7 @@ void menu_advanced_settings(); #if ENABLED(DUAL_X_CARRIAGE) void menu_idex() { - const bool need_g28 = !(TEST(axis_known_position, Y_AXIS) && TEST(axis_known_position, Z_AXIS)); + const bool need_g28 = axes_should_home(_BV(Y_AXIS)|_BV(Z_AXIS)); START_MENU(); BACK_ITEM(MSG_CONFIGURATION); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index c6378d67fc26..401721140be7 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1097,17 +1097,16 @@ void prepare_line_to_destination() { current_position = destination; } -uint8_t axes_need_homing(uint8_t axis_bits/*=0x07*/) { - #define HOMED_FLAGS TERN(HOME_AFTER_DEACTIVATE, axis_known_position, axis_homed) - // Clear test bits that are homed - if (TEST(axis_bits, X_AXIS) && TEST(HOMED_FLAGS, X_AXIS)) CBI(axis_bits, X_AXIS); - if (TEST(axis_bits, Y_AXIS) && TEST(HOMED_FLAGS, Y_AXIS)) CBI(axis_bits, Y_AXIS); - if (TEST(axis_bits, Z_AXIS) && TEST(HOMED_FLAGS, Z_AXIS)) CBI(axis_bits, Z_AXIS); +uint8_t axes_should_home(uint8_t axis_bits/*=0x07*/) { + // Clear test bits that are trusted + if (TEST(axis_bits, X_AXIS) && TEST(axis_homed, X_AXIS)) CBI(axis_bits, X_AXIS); + if (TEST(axis_bits, Y_AXIS) && TEST(axis_homed, Y_AXIS)) CBI(axis_bits, Y_AXIS); + if (TEST(axis_bits, Z_AXIS) && TEST(axis_homed, Z_AXIS)) CBI(axis_bits, Z_AXIS); return axis_bits; } -bool axis_unhomed_error(uint8_t axis_bits/*=0x07*/) { - if ((axis_bits = axes_need_homing(axis_bits))) { +bool homing_needed_error(uint8_t axis_bits/*=0x07*/) { + if ((axis_bits = axes_should_home(axis_bits))) { PGM_P home_first = GET_TEXT(MSG_HOME_FIRST); char msg[strlen_P(home_first)+1]; sprintf_P(msg, home_first, diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 1a0971d281c7..d71003906f4a 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -40,8 +40,7 @@ constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); FORCE_INLINE bool no_axes_homed() { return !axis_homed; } FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } -FORCE_INLINE void set_all_unhomed() { axis_homed = 0; } -FORCE_INLINE void set_all_unknown() { axis_known_position = 0; } +FORCE_INLINE void set_all_unhomed() { axis_homed = axis_known_position = 0; } FORCE_INLINE bool homing_needed() { return !TERN(HOME_AFTER_DEACTIVATE, all_axes_known, all_axes_homed)(); @@ -239,22 +238,18 @@ void do_z_clearance(const float &zclear, const bool z_known=true, const bool rai // // Homing // - -uint8_t axes_need_homing(uint8_t axis_bits=0x07); -bool axis_unhomed_error(uint8_t axis_bits=0x07); +void homeaxis(const AxisEnum axis); +void set_axis_is_at_home(const AxisEnum axis); +void set_axis_never_homed(const AxisEnum axis); +uint8_t axes_should_home(uint8_t axis_bits=0x07); +bool homing_needed_error(uint8_t axis_bits=0x07); #if ENABLED(NO_MOTION_BEFORE_HOMING) - #define MOTION_CONDITIONS (IsRunning() && !axis_unhomed_error()) + #define MOTION_CONDITIONS (IsRunning() && !homing_needed_error()) #else #define MOTION_CONDITIONS IsRunning() #endif -void set_axis_is_at_home(const AxisEnum axis); - -void set_axis_never_homed(const AxisEnum axis); - -void homeaxis(const AxisEnum axis); - /** * Workspace offsets */ diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 4fab4ec27b49..12b617ec439e 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -359,7 +359,7 @@ bool Probe::set_deployed(const bool deploy) { do_z_raise(_MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) - if (axis_unhomed_error(TERN_(Z_PROBE_SLED, _BV(X_AXIS)))) { + if (homing_needed_error(TERN_(Z_PROBE_SLED, _BV(X_AXIS)))) { SERIAL_ERROR_MSG(STR_STOP_UNHOMED); stop(); return true; diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index e9705cd3c322..ec0d63a89d97 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -840,12 +840,13 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // // Axis steppers enable / disable macros // +#define FORGET_AXIS(A) TERN(HOME_AFTER_DEACTIVATE, set_axis_never_homed(A), CBI(axis_known_position, A)) #define ENABLE_AXIS_X() do{ ENABLE_STEPPER_X(); ENABLE_STEPPER_X2(); }while(0) -#define DISABLE_AXIS_X() do{ DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); CBI(axis_known_position, X_AXIS); }while(0) +#define DISABLE_AXIS_X() do{ DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); FORGET_AXIS(X_AXIS); }while(0) #define ENABLE_AXIS_Y() do{ ENABLE_STEPPER_Y(); ENABLE_STEPPER_Y2(); }while(0) -#define DISABLE_AXIS_Y() do{ DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); CBI(axis_known_position, Y_AXIS); }while(0) +#define DISABLE_AXIS_Y() do{ DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); FORGET_AXIS(Y_AXIS); }while(0) #define ENABLE_AXIS_Z() do{ ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); }while(0) @@ -854,7 +855,7 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #else #define Z_RESET() #endif -#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); CBI(axis_known_position, Z_AXIS); Z_RESET(); }while(0) +#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); FORGET_AXIS(Z_AXIS); Z_RESET(); }while(0) // // Extruder steppers enable / disable macros diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index d1017cea8078..855756026684 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -174,7 +174,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a grabpos = mpe_settings.parking_xpos[new_tool] + (new_tool ? mpe_settings.grab_distance : -mpe_settings.grab_distance), offsetcompensation = TERN0(HAS_HOTEND_OFFSET, hotend_offset[active_extruder].x * mpe_settings.compensation_factor); - if (axis_unhomed_error(_BV(X_AXIS))) return; + if (homing_needed_error(_BV(X_AXIS))) return; /** * Z Lift and Nozzle Offset shift ar defined in caller method to work equal with any Multi Hotend realization From e0b413cf19af87e73b0476daaddf395817db9b35 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Aug 2020 16:38:02 -0500 Subject: [PATCH 432/483] Add set_all_homed --- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/module/motion.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 9a3eee31b55c..06296dd215fa 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -365,7 +365,7 @@ void PrintJobRecovery::resume() { #endif // Pretend that all axes are homed - axis_homed = axis_known_position = xyz_bits; + set_all_homed(); // Recover volumetric extrusion state #if DISABLED(NO_VOLUMETRICS) diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index d71003906f4a..c3f2d9b779a4 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -40,6 +40,7 @@ constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); FORCE_INLINE bool no_axes_homed() { return !axis_homed; } FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } +FORCE_INLINE void set_all_homed() { axis_homed = axis_known_position = xyz_bits; } FORCE_INLINE void set_all_unhomed() { axis_homed = axis_known_position = 0; } FORCE_INLINE bool homing_needed() { From 6ac8f5abb7ce63e1538085f07eaf32cc3855f130 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 28 Aug 2020 00:13:10 +0000 Subject: [PATCH 433/483] [cron] Bump distribution date (2020-08-28) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ee62ee7aab1b..a26f3e3d9bc2 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-27" + #define STRING_DISTRIBUTION_DATE "2020-08-28" #endif /** From e492c613f7698c82adc5d2317e4b1247536f42fa Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 29 Aug 2020 00:13:59 +0000 Subject: [PATCH 434/483] [cron] Bump distribution date (2020-08-29) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index a26f3e3d9bc2..602261d21e94 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-28" + #define STRING_DISTRIBUTION_DATE "2020-08-29" #endif /** From c8995b91e2bde3e4be361827617f8a6a7d6167b4 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 30 Aug 2020 00:07:24 +0000 Subject: [PATCH 435/483] [cron] Bump distribution date (2020-08-30) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 602261d21e94..5f93083e265f 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-29" + #define STRING_DISTRIBUTION_DATE "2020-08-30" #endif /** From 8d76d8c0810dc14ce1180ff1d7e9d6169199de41 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 31 Aug 2020 00:14:49 +0000 Subject: [PATCH 436/483] [cron] Bump distribution date (2020-08-31) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 5f93083e265f..888291c8be51 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-30" + #define STRING_DISTRIBUTION_DATE "2020-08-31" #endif /** From 2a72961be4a696c9d336d259e761bf3a105589cb Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 1 Sep 2020 08:05:42 +1200 Subject: [PATCH 437/483] Fix 'cmd' array warning (#19193) --- Marlin/src/lcd/menu/menu_filament.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 316b2bc782c5..5d02d674aa84 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -138,8 +138,9 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { SUBMENU_N_P(s, msg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, MenuItemBase::itemIndex); }); else { ACTION_ITEM_N_P(s, msg, []{ - char cmd[13]; - sprintf_P(cmd, PSTR("M600 B0 T%i"), int(MenuItemBase::itemIndex)); + PGM_P const cmdpstr = PSTR("M600 B0 T%i"); + char cmd[strlen_P(cmdpstr) + 3 + 1]; + sprintf_P(cmd, cmdpstr, int(MenuItemBase::itemIndex)); queue.inject(cmd); }); } From 41c7ae5d5466c3a234ac52a97e7b91afa16774b8 Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Mon, 31 Aug 2020 16:06:24 -0500 Subject: [PATCH 438/483] Separate Neopixels followup (#19179) --- Marlin/src/feature/leds/neopixel.h | 9 ++++++--- Marlin/src/inc/Conditionals_LCD.h | 5 ----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 81a0a8b1c660..09a5cf8b39be 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -110,7 +110,7 @@ class Marlin_NeoPixel { #if CONJOINED_NEOPIXEL adaneo2.show(); #else - adaneo1.setPin(NEOPIXEL2_PIN); + TERN_(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); adaneo1.show(); adaneo1.setPin(NEOPIXEL_PIN); #endif @@ -133,7 +133,7 @@ extern Marlin_NeoPixel neo; // Neo pixel channel 2 #if ENABLED(NEOPIXEL2_SEPARATE) - + #if NEOPIXEL2_TYPE == NEO_RGB || NEOPIXEL2_TYPE == NEO_RBG || NEOPIXEL2_TYPE == NEO_GRB || NEOPIXEL2_TYPE == NEO_GBR || NEOPIXEL2_TYPE == NEO_BRG || NEOPIXEL2_TYPE == NEO_BGR #define NEOPIXEL2_IS_RGB 1 #else @@ -161,7 +161,10 @@ extern Marlin_NeoPixel neo; static inline void begin() { adaneo.begin(); } static inline void set_pixel_color(const uint16_t n, const uint32_t c) { adaneo.setPixelColor(n, c); } static inline void set_brightness(const uint8_t b) { adaneo.setBrightness(b); } - static inline void show() { adaneo.show(); } + static inline void show() { + adaneo.show(); + adaneo.setPin(NEOPIXEL2_PIN); + } // Accessors static inline uint16_t pixels() { return adaneo.numPixels();} diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index bbe89b7c5042..112ff93a0e0e 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -780,8 +780,3 @@ #ifndef EXTRUDE_MINTEMP #define EXTRUDE_MINTEMP 170 #endif - -// This flag indicates if Neopixel pins are shared or separated -#if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) - #define CONJOINED_NEOPIXEL 1 -#endif From 4ab4dbb8a16bac92bc38a5a00c164f06e6d16760 Mon Sep 17 00:00:00 2001 From: Martin <34376785+G4Cab@users.noreply.github.com> Date: Tue, 1 Sep 2020 01:56:58 +0200 Subject: [PATCH 439/483] Permit touch params override w/ Robin nano (#19196) --- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index 2c1d016f8cd6..d54a7946161c 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -194,10 +194,18 @@ // LVGL Configs #if ENABLED(TFT_LVGL_UI_FSMC) - #define XPT2046_X_CALIBRATION 17880 - #define XPT2046_Y_CALIBRATION -12234 - #define XPT2046_X_OFFSET -45 - #define XPT2046_Y_OFFSET 349 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 17880 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -12234 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -45 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 349 + #endif // Emulated DOGM Configs #elif ENABLED(FSMC_GRAPHICAL_TFT) @@ -244,10 +252,18 @@ #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 - #define XPT2046_X_CALIBRATION -12246 - #define XPT2046_Y_CALIBRATION 9453 - #define XPT2046_X_OFFSET 360 - #define XPT2046_Y_OFFSET -22 + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -12246 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 9453 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 360 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -22 + #endif #define TOUCH_CS_PIN PA7 // SPI2_NSS #define TOUCH_SCK_PIN PB13 // SPI2_SCK @@ -265,11 +281,19 @@ #define ILI9341_COLOR_RGB #elif ENABLED(TFT_480x320) - #define XPT2046_X_CALIBRATION 17880 - #define XPT2046_Y_CALIBRATION -12234 - #define XPT2046_X_OFFSET -45 - #define XPT2046_Y_OFFSET 349 - + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 17880 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -12234 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -45 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 349 + #endif + #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV From 203e44e0262322b0d764279b2f42875596f060b5 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 1 Sep 2020 00:12:57 +0000 Subject: [PATCH 440/483] [cron] Bump distribution date (2020-09-01) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 888291c8be51..2908ec204cf8 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-08-31" + #define STRING_DISTRIBUTION_DATE "2020-09-01" #endif /** From d3ac4ba83d86be6efc889a508cc74dcffbd43978 Mon Sep 17 00:00:00 2001 From: Ludy Date: Tue, 1 Sep 2020 05:23:28 +0200 Subject: [PATCH 441/483] Update German, fix Mix component index (#19206) --- Marlin/src/lcd/language/language_cz.h | 2 +- Marlin/src/lcd/language/language_de.h | 86 ++++++++++++++++++++++++--- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- 6 files changed, 84 insertions(+), 12 deletions(-) diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index c21cacddc89b..aea831a36dcc 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -527,7 +527,7 @@ namespace Language_cz { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("VytáhnÄ›te, kliknÄ›te"); PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponenta ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponenta ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("PÅ™echod"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Celý pÅ™echod"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index ebd08050373b..90a8ed4bdc59 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -33,10 +33,10 @@ namespace Language_de { using namespace Language_en; // Inherit undefined strings from English constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Deutsche"); + PROGMEM Language_Str LANGUAGE = _UxGT("Deutsch"); PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" bereit"); - + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); PROGMEM Language_Str MSG_YES = _UxGT("JA"); PROGMEM Language_Str MSG_NO = _UxGT("NEIN"); PROGMEM Language_Str MSG_BACK = _UxGT("Zurück"); @@ -44,9 +44,11 @@ namespace Language_de { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Medium erkannt"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Medium entfernt"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Warten auf Medium"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD Init fehlgesch."); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Medium Lesefehler"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB Gerät entfernt"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB Start fehlge."); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall überschritten"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopp"); // Max length 8 characters PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Software-Endstopp"); PROGMEM Language_Str MSG_MAIN = _UxGT("Hauptmenü"); @@ -56,7 +58,13 @@ namespace Language_de { PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren deaktivieren"); // M84 :: Max length 19 characters PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug-Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Statusbalken-Test"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Z-Achsen ausgleichen"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Bett ausrichten"); // Bettausrichtung + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ homen"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klick zum Starten"); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Nächste Koordinate"); PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivellieren fertig!"); @@ -110,9 +118,9 @@ namespace Language_de { PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z-Wert"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Benutzer-Menü"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Berührungspunkt"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Sondentest"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punkt"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Zu weit draußen"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Abweichung"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX-Modus"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Werkzeugversätze"); @@ -126,6 +134,7 @@ namespace Language_de { PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 ausführen"); PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL-Werkzeuge"); PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Berührungspunkt"); PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Netz manuell erst."); PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Unterlegen & messen"); PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Messen"); @@ -154,6 +163,7 @@ namespace Language_de { PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Eig. Netz validieren"); PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 heizt Bett"); PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Düse aufheizen"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manuell Prime..."); PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Feste Länge Prime"); PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Priming fertig"); PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 abgebrochen"); @@ -234,6 +244,7 @@ namespace Language_de { PROGMEM Language_Str MSG_NOZZLE = _UxGT("Düse"); PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Düse ~"); PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Düse geparkt"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Düse bereit"); PROGMEM Language_Str MSG_BED = _UxGT("Bett"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Gehäuse"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Lüfter"); @@ -255,6 +266,22 @@ namespace Language_de { PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto Temperatur"); PROGMEM Language_Str MSG_LCD_ON = _UxGT("an"); PROGMEM Language_Str MSG_LCD_OFF = _UxGT("aus"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID Tuning fertig"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune fehlge. Falscher Extruder"); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune fehlge. Temperatur zu hoch."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autotune fehlge.! Timeout."); + PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); + PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); + PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); + PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); + PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); + PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); + PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); + PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); + PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); + PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); PROGMEM Language_Str MSG_SELECT = _UxGT("Auswählen"); PROGMEM Language_Str MSG_SELECT_E = _UxGT("Auswählen *"); PROGMEM Language_Str MSG_ACC = _UxGT("Beschleunigung"); @@ -281,6 +308,8 @@ namespace Language_de { PROGMEM Language_Str MSG_AMAX_EN = _UxGT("A max *"); PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A Einzug"); PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A Leerfahrt"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("max. Frequenz"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("min. Vorschub"); PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" Steps/mm"); PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" Steps/mm"); @@ -291,6 +320,8 @@ namespace Language_de { PROGMEM Language_Str MSG_MOTION = _UxGT("Bewegung"); PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filamentdurchmesser"); PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Filamentdurchmesser *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Entladen mm"); @@ -302,6 +333,9 @@ namespace Language_de { PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Konfig. laden"); PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Standardwerte laden"); PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Werkseinstellungen"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Fehler"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Fehler"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Fehler"); PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Einstell. gespei."); PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("FW Update vom Medium"); PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Drucker neustarten"); @@ -309,19 +343,26 @@ namespace Language_de { PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info"); PROGMEM Language_Str MSG_PREPARE = _UxGT("Vorbereitung"); PROGMEM Language_Str MSG_TUNE = _UxGT("Justierung"); + PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Power Monitor"); + PROGMEM Language_Str MSG_CURRENT = _UxGT("Strom"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Spannung"); + PROGMEM Language_Str MSG_POWER = _UxGT("Power"); PROGMEM Language_Str MSG_START_PRINT = _UxGT("Starte Druck"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Weiter"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Bestätigen"); PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Drucken"); PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reseten"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignorieren"); PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Abbrechen"); PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Fertig"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Zurück"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Weiter"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Pause..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("SD-Druck pausieren"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("SD-Druck fortsetzen"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("SD-Druck abbrechen"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objekt drucken"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objekt abbrechen"); PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objekt abbrechen ="); PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Wiederh. n. Stroma."); @@ -346,12 +387,22 @@ namespace Language_de { PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Autom. Einzug"); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Einzugslänge"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Einzug"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Entladelänge"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Werkzeugwechsel"); PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z anheben"); PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime-Geschwin."); PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Einzug-Geschwin."); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Düsen-Standby"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Kopf parken"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Rückzugsgeschwindigkeit"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Lüfter Geschwindigkeit"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Lüfter Zeit"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto AN"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto AUS"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Werkzeugmigration"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-Migration"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Letzter Extruder"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrieren zu *"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Filament wechseln"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Filament wechseln *"); PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Filament laden"); @@ -367,6 +418,7 @@ namespace Language_de { PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Selbsttest"); PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Zurücksetzen"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Einfahren"); PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Ausfahren"); PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Modus"); PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Modus"); @@ -374,7 +426,6 @@ namespace Language_de { PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Setze auf 5V"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Setze auf OD"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Einfahren"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Modus: "); PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ACHTUNG: Falsche Einstellung - kann zu Beschädigung führen! Fortfahren?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); @@ -443,6 +494,9 @@ namespace Language_de { PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruder"); PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudrate"); PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: AUS"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: AN"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout"); PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Beleuchtung"); PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Helligkeit"); @@ -508,7 +562,7 @@ namespace Language_de { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Entfernen, klicken"); PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponente ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponente ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); // equal Farbverlauf PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Volle Gradient"); @@ -531,6 +585,20 @@ namespace Language_de { PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("ungült. Seitenzahl"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ungült. Seitengeschw."); + + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Passwort bearbeiten"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login erforderlich"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Passwort Einstellungen"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("PIN eingeben"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Passwort ändern"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Passwort löschen"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Passwort ist "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("von vorn beginnen"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Bald speichern!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Passwort gelöscht"); + // // Die Filament-Change-Bildschirme können bis zu 3 Zeilen auf einem 4-Zeilen-Display anzeigen // ...oder 2 Zeilen auf einem 3-Zeilen-Display. @@ -576,7 +644,11 @@ namespace Language_de { PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Glätten"); PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Achse leveln"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto. Kalibiren"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heizung Timeout"); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Idle Timeout, Temperatur fällt. Drücke Okay, um erneut aufzuheizen und fortzufahren."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heizungs Timeout"); + #endif PROGMEM Language_Str MSG_REHEAT = _UxGT("Erneut aufheizen"); PROGMEM Language_Str MSG_REHEATING = _UxGT("Erneut aufhei. ..."); } diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index d403477eb015..0042a30f8e5f 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -508,7 +508,7 @@ namespace Language_fr { PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Réinit. MMU..."); PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Retrait, click"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Composante ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Composante ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixeur"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Dégradé"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Dégradé complet"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 43765d7c3ac3..930adf3a8749 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -561,7 +561,7 @@ namespace Language_it { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Rimuovi, click"); PROGMEM Language_Str MSG_MIX = _UxGT("Miscela"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Componente ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Componente ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Miscelatore"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradiente"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Gradiente pieno"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 79190ddfcb42..8e0d0904e4f1 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -500,7 +500,7 @@ namespace Language_pl { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("UsuÅ„, kliknij"); PROGMEM Language_Str MSG_MIX = _UxGT("Miks"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponent ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponent ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mikser"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("PeÅ‚ny gradient"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 736e2069d999..4f54ba96aeb1 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -551,7 +551,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Odstráňte, kliknite"); PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka ~"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Plný gradient"); From 2979da73cf9267ae11eff566335c28565b67a18e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane?= <43587190+stef-ladefense@users.noreply.github.com> Date: Tue, 1 Sep 2020 05:27:42 +0200 Subject: [PATCH 442/483] Fix Anycubic I3 Mega (S) original screen % display (#19210) --- .../lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 1c9b9299fc43..1de962826a8c 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -28,6 +28,7 @@ #include "../../../../inc/MarlinConfig.h" #include "../../ui_api.h" #include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage // command sending macro's with debugging capability #define SEND_PGM(x) send_P(PSTR(x)) @@ -412,6 +413,7 @@ void AnycubicTFTClass::RenderCurrentFileList() { uint16_t selectedNumber = 0; SelectedDirectory[0] = 0; SelectedFile[0] = 0; + ExtUI::FileList currentFileList; SENDLINE_PGM("FN "); // Filelist start @@ -427,7 +429,7 @@ void AnycubicTFTClass::RenderCurrentFileList() { if (SpecialMenu) RenderSpecialMenu(selectedNumber); - else + else if (selectedNumber <= currentFileList.count()) RenderCurrentFolder(selectedNumber); } SENDLINE_PGM("END"); // Filelist stop @@ -804,7 +806,6 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 20: { // A20 read printing speed - int16_t feedrate_percentage = 100; if (CodeSeen('S')) feedrate_percentage = constrain(CodeValue(), 40, 999); From 56c44b053d11925c67a32f26ad84c2e76c97fd56 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 1 Sep 2020 23:59:29 +0200 Subject: [PATCH 443/483] Delete old LCD strings (#19227) --- Marlin/src/lcd/language/language_cz.h | 2 -- Marlin/src/lcd/language/language_de.h | 2 -- Marlin/src/lcd/language/language_en.h | 2 -- Marlin/src/lcd/language/language_es.h | 2 -- Marlin/src/lcd/language/language_gl.h | 2 -- Marlin/src/lcd/language/language_hu.h | 2 -- Marlin/src/lcd/language/language_it.h | 4 +--- Marlin/src/lcd/language/language_pl.h | 2 -- Marlin/src/lcd/language/language_pt_br.h | 2 -- Marlin/src/lcd/language/language_ro.h | 2 -- Marlin/src/lcd/language/language_ru.h | 2 -- Marlin/src/lcd/language/language_sk.h | 2 -- Marlin/src/lcd/language/language_tr.h | 2 -- Marlin/src/lcd/language/language_uk.h | 2 -- Marlin/src/lcd/language/language_vi.h | 1 - Marlin/src/lcd/language/language_zh_CN.h | 2 -- Marlin/src/lcd/language/language_zh_TW.h | 2 -- 17 files changed, 1 insertion(+), 34 deletions(-) diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index aea831a36dcc..069a8e5a55a0 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -404,8 +404,6 @@ namespace Language_cz { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkem"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop abort"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba zahřívání"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Chyba zahÅ™.podl."); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chyba zahÅ™.komory"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEPLOTA"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNà ÚNIK"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPL. ÚNIK PODL."); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 90a8ed4bdc59..84b304c242be 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -446,8 +446,6 @@ namespace Language_de { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abbr. mit Endstopp"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("HEIZEN ERFOLGLOS"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bett heizen fehlge."); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Geh. heizen fehlge."); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEMP-ABWEI."); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BETT") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index fde21f2bbabc..39bb85d37815 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -447,8 +447,6 @@ namespace Language_en { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bed Heating Failed"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chamber Heating Fail"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 2b10bfe313e1..5beab6c1c90f 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -415,8 +415,6 @@ namespace Language_es { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Calent. fallido"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Calent. cama fallido"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Calent. Cám. fallido"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP. REDUN."); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 4415fc5e1c12..90e4129abd7c 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -437,8 +437,6 @@ namespace Language_gl { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Erro FinCarro"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fallo Quentando"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Fallo Quent. Cama"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Fallo Quent. Cámara"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 182ed27072bb..64ea482249ef 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -439,8 +439,6 @@ namespace Language_hu { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Teljes"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Végállás megszakítva!"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fütés hiba!"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Ãgy fütés hiba!"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Kamra fütés hiba!"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hiba: SZÃœKSÉGTELEN HÖFOK"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÃœTÉS KIMARADÃS"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÃGY FÃœTÉS KIMARADÃS"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 930adf3a8749..0a56fdf5ecfe 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -445,9 +445,7 @@ namespace Language_it { PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Totali"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Finecorsa annullati"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Riscald. Fallito"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Risc. piatto fallito"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Risc. camera fallito"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Risc.Fallito"); // Max 12 caratteri PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP RIDONDANTE"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEMP FUORI CONTROLLO"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEMP PIAT.FUORI CTRL"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 8e0d0904e4f1..17ca0bd00f45 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -385,8 +385,6 @@ namespace Language_pl { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("ÅÄ…cznie"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("BÅ‚Ä…d kraÅ„cówki"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Rozgrz. nieudane"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Rozgrz. stoÅ‚u nieudane"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Rozgrz. komory nieudane"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("BÅ‚Ä…d temperatury"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ZANIK TEMPERATURY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ZANIK TEMP. STOÅU"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index e0a52fc3906a..2c6c2af1486e 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -351,8 +351,6 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abortar Fim de Curso"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Aquecer mesa falhou"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Aquecer câmara falhou"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ESCAPE TÉRMICO"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ESCAPE TÉRMICO MESA"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 39e5cb9e2cd8..dc5591117602 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -442,8 +442,6 @@ namespace Language_ro { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Bed Heating Failed"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chamber Heating Fail"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 6228e92346ab..e1abfa542972 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -530,8 +530,6 @@ namespace Language_ru { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Сработал концевик"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Разогрев не удалÑÑ"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Сбой нагрева Ñтола"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Сбой нагрева камеры"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Ошибка:Ð˜Ð·Ð±Ñ‹Ñ‚Ð¾Ñ‡Ð½Ð°Ñ Ð¢"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("УТЕЧКРТЕПЛÐ"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("УТЕЧКРТЕПЛРСТОЛÐ"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 4f54ba96aeb1..71949014b7c7 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -435,8 +435,6 @@ namespace Language_sk { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkom"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Zastavenie Endstop"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba ohrevu"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Chyba ohrevu podl."); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Chyba ohrevu komory"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Chyba: REDUND. TEP."); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNà SKOK"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPLOTNà SKOK PODL."); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index bb68a6171766..c0ce4bfdc5d0 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -414,8 +414,6 @@ namespace Language_tr { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Toplam"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop iptal"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Isınma baÅŸarısız"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Yatak Isınma BaÅŸrsız"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Oda Isıtma Hatası"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hata: Sıcaklık Aşımı"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TERMAL PROBLEM"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TABLA TERMAL PROBLEM"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 686657246f3b..30d45338d98d 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -524,8 +524,6 @@ namespace Language_uk { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Кінцевик Ñпрацював"); PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Збій нагріву"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Збій нагріву Ñтолу"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("Збій нагріву камери"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("ЗÐВИЩЕÐРТ") LCD_STR_DEGREE; PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ВИТІК ТЕПЛÐ"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ВИТІК ТЕПЛРСТОЛУ"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 227a4950f367..02453e58792f 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -330,7 +330,6 @@ namespace Language_vi { PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Nhít Z"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Hủy bá» công tắc"); // Endstop abort PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Sưởi đầu phun không thành công"); // Heating failed - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("Sưởi bàn không thành công"); // Bed heating failed PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Äiều sai: nhiệt Ä‘á»™ dÆ°"); // Err: REDUNDANT TEMP PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Vấn Ä‘á» nhiệt"); // THERMAL RUNAWAY | problem PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("Vấn Ä‘á» nhiệt bàn"); // BED THERMAL RUNAWAY diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index cf772caaef66..49d7acd94cc8 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -441,8 +441,6 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("总计"); PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("挡å—终止"); //"Endstop abort" PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("加热失败"); //"Heating failed" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("热床加热失败"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("机箱加热失败"); PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("错误:冗余温度"); //"Err: REDUNDANT TEMP" PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("温控失控"); //"THERMAL RUNAWAY" PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("热床热é‡å¤±æŽ§"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 94a7944b3598..ac543585347f 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -382,8 +382,6 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("總計"); //"Total" PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("擋塊終止"); //"Endstop abort" PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("加熱失敗"); //"Heating failed" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_BED = _UxGT("熱床加熱失敗"); //"Bed Heating Failed" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD_CHAMBER = _UxGT("機箱加熱失敗"); //"Chamber Heating Fail" PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("錯誤:冗餘溫度"); //"Err: REDUNDANT TEMP" PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("溫度失控"); //"THERMAL RUNAWAY" PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("熱床溫度失控"); //"BED THERMAL RUNAWAY" From 09ddb5a7246ef8ec189d35f0e1303229ee6e5cd4 Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Tue, 1 Sep 2020 17:03:28 -0500 Subject: [PATCH 444/483] Separate Neopixel followup (#19224) --- Marlin/src/feature/leds/neopixel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 09a5cf8b39be..f8300c4d988c 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -110,7 +110,7 @@ class Marlin_NeoPixel { #if CONJOINED_NEOPIXEL adaneo2.show(); #else - TERN_(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); + TERN_(NEOPIXEL2_SEPARATE,adaneo1.setPin(NEOPIXEL2_PIN)); adaneo1.show(); adaneo1.setPin(NEOPIXEL_PIN); #endif From 62268aae65b1594fb20b87230eb59bba90260dd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane?= <43587190+stef-ladefense@users.noreply.github.com> Date: Wed, 2 Sep 2020 00:05:52 +0200 Subject: [PATCH 445/483] Fix Anycubic LCDs / Trigorilla 1.4 pins (#19220) --- Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index 708f8fa26cd6..412aa2290223 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -64,7 +64,7 @@ #elif TEMP_SENSOR_BED // EFB (Anycubic Kossel default) #define RAMPS_D9_PIN TG_FAN0_PIN - #if ENABLED(ANYCUBIC_CHIRON) + #if ENABLED(ANYCUBIC_LCD_CHIRON) #define RAMPS_D8_PIN TG_HEATER_1_PIN // Heated bed is connected to HEATER1 output #else #define RAMPS_D8_PIN TG_HEATER_BED_PIN @@ -84,7 +84,7 @@ #define E0_AUTO_FAN_PIN TG_FAN2_PIN // Used in Anycubic Kossel example config #endif -#if ENABLED(ANYCUBIC_I3MEGA) +#if ENABLED(ANYCUBIC_LCD_I3MEGA) #define CONTROLLER_FAN_PIN TG_FAN1_PIN #endif @@ -105,14 +105,14 @@ #if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) #define X_MAX_PIN 43 #define Y_STOP_PIN 19 -#elif EITHER(ANYCUBIC_CHIRON, ANYCUBIC_I3MEGA) +#elif EITHER(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_I3MEGA) #define Y_STOP_PIN 42 #define Z2_MIN_PIN 43 #ifndef Z_MIN_PROBE_PIN #define Z_MIN_PROBE_PIN 2 #endif #ifndef FIL_RUNOUT_PIN - #if ENABLED(ANYCUBIC_CHIRON) + #if ENABLED(ANYCUBIC_LCD_CHIRON) #define FIL_RUNOUT_PIN 33 #else #define FIL_RUNOUT_PIN 19 From e3d855673e38d567231baa5bcc8f3d8f8de5f7a9 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Tue, 1 Sep 2020 19:09:28 -0300 Subject: [PATCH 446/483] Fail SD mount without SPI re-init (#19226) --- Marlin/src/sd/cardreader.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 29f9672e92b5..32bdc73bcda6 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -140,7 +140,7 @@ CardReader::CardReader() { #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) SET_INPUT_PULLUP(SD_DETECT_PIN); #endif - + #if PIN_EXISTS(SDPOWER) OUT_WRITE(SDPOWER_PIN, HIGH); // Power the SD reader #endif @@ -383,10 +383,9 @@ void CardReader::mount() { if (flag.mounted) cdroot(); - else { - spiInit(SPI_SPEED); // Return to base SPI speed + else if (marlin_state != MF_INITIALIZING) ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); - } + ui.refresh(); } From f375d9bd7b9d8169c513a3b38bb839b909ab18e5 Mon Sep 17 00:00:00 2001 From: makerbase <4164049@qq.com> Date: Wed, 2 Sep 2020 07:20:16 +0800 Subject: [PATCH 447/483] MKS SGEN L V2 (#18822) --- Marlin/src/core/boards.h | 1 + Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 357 +++++++++++++++++++ Marlin/src/pins/pins.h | 2 + 3 files changed, 360 insertions(+) create mode 100644 Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index c880b3d3256a..e280d955b800 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -235,6 +235,7 @@ #define BOARD_SMOOTHIEBOARD 2506 // Smoothieboard #define BOARD_TH3D_EZBOARD 2507 // TH3D EZBoard v1.0 #define BOARD_BTT_SKR_V1_4_TURBO 2508 // BigTreeTech SKR v1.4 TURBO (Power outputs: Hotend0, Hotend1, Fan, Bed) +#define BOARD_MKS_SGEN_L_V2 2509 // MKS SGEN_L V2 (Power outputs: Hotend0, Hotend1, Bed, Fan) // // SAM3X8E ARM Cortex M3 diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h new file mode 100644 index 000000000000..d112cc5d5080 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -0,0 +1,357 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * MKS SGen pin assignments + */ + +#ifndef MCU_LPC1769 + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "MKS SGEN_L V2" +#define BOARD_WEBSITE_URL "github.com/makerbase-mks" + +// +// EEPROM, MKS SGEN_L V2.0 hardware has 4K EEPROM on the board +// +#if NO_EEPROM_SELECTED + //#define SDCARD_EEPROM_EMULATION + //#define I2C_EEPROM // AT24C32 + #define FLASH_EEPROM_EMULATION + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// +// Servos +// +#define SERVO0_PIN P1_23 // SERVO P1.23 +#define SERVO1_PIN P2_00 // SERVO P2.0 + +// +// Trinamic Stallguard pins, can connect or disconnect by jumpers cap on the board +// +#define X_DIAG_PIN P1_29 // X- +#define Y_DIAG_PIN P1_27 // Y- +#define Z_DIAG_PIN P1_25 // Z- +#define E0_DIAG_PIN P1_28 // X+ +#define E1_DIAG_PIN P1_26 // Y+ + +// +// Limit Switches +// +#if X_STALL_SENSITIVITY + #define X_STOP_PIN X_DIAG_PIN + #if X_HOME_DIR < 0 + #define X_MAX_PIN P1_28 // X+ + #else + #define X_MIN_PIN P1_28 // X+ + #endif +#else + #define X_MIN_PIN P1_29 // X- + #define X_MAX_PIN P1_28 // X+ +#endif + +#if Y_STALL_SENSITIVITY + #define Y_STOP_PIN Y_DIAG_PIN + #if Y_HOME_DIR < 0 + #define Y_MAX_PIN P1_26 // Y+ + #else + #define Y_MIN_PIN P1_26 // Y+ + #endif +#else + #define Y_MIN_PIN P1_27 // Y- + #define Y_MAX_PIN P1_26 // Y+ +#endif + +#if Z_STALL_SENSITIVITY + #define Z_STOP_PIN Z_DIAG_PIN + #if Z_HOME_DIR < 0 + #define Z_MAX_PIN P1_24 // Z+ + #else + #define Z_MIN_PIN P1_24 // Z+ + #endif +#else + #define Z_MIN_PIN P1_25 // Z- + #define Z_MAX_PIN P1_24 // Z+ +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN P1_24 +#endif + +// +// Steppers +// +#define X_STEP_PIN P2_02 +#define X_DIR_PIN P2_03 +#define X_ENABLE_PIN P2_01 +#ifndef X_CS_PIN + #define X_CS_PIN P1_01 +#endif + +#define Y_STEP_PIN P0_19 +#define Y_DIR_PIN P0_20 +#define Y_ENABLE_PIN P2_08 +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_08 +#endif + +#define Z_STEP_PIN P0_22 +#define Z_DIR_PIN P2_11 +#define Z_ENABLE_PIN P0_21 +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_10 +#endif + +#define E0_STEP_PIN P2_13 +#define E0_DIR_PIN P0_11 +#define E0_ENABLE_PIN P2_12 +#ifndef E0_CS_PIN + #define E0_CS_PIN P1_15 +#endif + +#define E1_STEP_PIN P1_09 +#define E1_DIR_PIN P1_14 +#define E1_ENABLE_PIN P0_10 +#ifndef E1_CS_PIN + #define E1_CS_PIN P1_17 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_16 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P0_05 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P0_04 + #endif +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + #define X_SERIAL_TX_PIN P1_01 + #define X_SERIAL_RX_PIN P1_01 + #define Y_SERIAL_TX_PIN P1_08 + #define Y_SERIAL_RX_PIN P1_08 + #define Z_SERIAL_TX_PIN P1_10 + #define Z_SERIAL_RX_PIN P1_10 + #define E0_SERIAL_TX_PIN P1_15 + #define E0_SERIAL_RX_PIN P1_15 + #define E1_SERIAL_TX_PIN P1_17 + #define E1_SERIAL_RX_PIN P1_17 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif // HAS_TMC_UART + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_23_A0 // Analog Input A0 (TH1) +#define TEMP_BED_PIN P0_24_A1 // Analog Input A1 (TB) +#define TEMP_1_PIN P0_25_A2 // Analog Input A2 (TH2) +#define TEMP_2_PIN P0_26_A3 // Analog Input A3 (P0.26, No pull up) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 +#if HOTENDS == 1 + #ifndef FAN1_PIN + #define FAN1_PIN P2_06 + #endif +#else + #ifndef HEATER_1_PIN + #define HEATER_1_PIN P2_06 + #endif +#endif +#ifndef FAN_PIN + #define FAN_PIN P2_04 +#endif +#ifndef FAN2_PIN + #define FAN2_PIN P1_04 +#endif + +// +// Misc. Functions +// +#define LED_PIN P1_18 // Used as a status indicator +#define LED2_PIN P1_19 +#define LED3_PIN P1_20 +#define LED4_PIN P1_21 + +/** + * _____ _____ + * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) + * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) + * (LCD_D4) 0.15 | · ·| 0.17 (LCD_D5) (BTN_EN2) 3.26 | · ·| 0.9 (SD_MOSI) + * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST + * GND | · · | 5V GND | · · | NC + * ----- ----- + * EXP1 EXP2 + */ +#if HAS_SPI_LCD + #define BEEPER_PIN P1_31 + #define BTN_ENC P1_30 + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS P1_00 + + #define BTN_EN1 P0_18 + #define BTN_EN2 P0_15 + + #define LCD_PINS_ENABLE P1_22 + #define LCD_PINS_D4 P0_17 + + #else + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + + #define LCD_SDSS P0_28 + + #if ENABLED(MKS_12864OLED_SSD1306) + + #define LCD_PINS_DC P0_17 + #define DOGLCD_CS P0_16 + #define DOGLCD_A0 LCD_PINS_DC + #define DOGLCD_SCK P0_15 + #define DOGLCD_MOSI P0_18 + + #define LCD_PINS_RS P1_00 + #define LCD_PINS_D7 P1_22 + #define KILL_PIN -1 // NC + + #else // !MKS_12864OLED_SSD1306 + + #define LCD_PINS_RS P0_16 + + #define LCD_PINS_ENABLE P0_18 + #define LCD_PINS_D4 P0_15 + + #if ENABLED(FYSETC_MINI_12864) + + #define DOGLCD_CS P0_18 + #define DOGLCD_A0 P0_16 + #define DOGLCD_SCK P0_07 + #define DOGLCD_MOSI P1_20 + + #define LCD_BACKLIGHT_PIN -1 + + #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems + // results in LCD soft SPI mode 3, SD soft SPI mode 0 + + #define LCD_RESET_PIN P0_15 // Must be high or open for LCD to operate normally. + + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN P0_17 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN P1_00 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN P1_22 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN P0_17 + #endif + + #else // !FYSETC_MINI_12864 + + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_CS P0_17 + #define DOGLCD_A0 P1_00 + #endif + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 P0_17 + #define LCD_PINS_D6 P1_00 + #define LCD_PINS_D7 P1_22 + #endif + + #endif // !FYSETC_MINI_12864 + + #endif // !MKS_12864OLED_SSD1306 + + #endif // !CR10_STOCKDISPLAY + +#endif // HAS_SPI_LCD + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card + +#if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD) + #define SD_DETECT_PIN P0_27 + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #if SD_CONNECTION_IS(ONBOARD) + #define SS_PIN ONBOARD_SD_CS_PIN + #else + #define SS_PIN P0_28 + #endif +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif + +// +// Other Pins +// +//#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0) +//#define PIN_P0_03 P0_03 // AUX1 (Interrupt Capable/ADC/Serial Port 0) +//#define PS_ON_PIN P1_23 // SERVO P1.23 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 22f6ea663ce0..2dfb2b53b8ea 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -410,6 +410,8 @@ #include "lpc1769/pins_TH3D_EZBOARD.h" // LPC1769 env:LPC1769 #elif MB(BTT_SKR_V1_4_TURBO) #include "lpc1769/pins_BTT_SKR_V1_4_TURBO.h" // LPC1769 env:LPC1769 +#elif MB(MKS_SGEN_L_V2) + #include "lpc1769/pins_MKS_SGEN_L_V2.h" // LPC1769 env:LPC1769 // // Due (ATSAM) boards From f97b8c835a71ca8cc2b92817a35d9326351b2669 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 2 Sep 2020 00:12:22 +0000 Subject: [PATCH 448/483] [cron] Bump distribution date (2020-09-02) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 2908ec204cf8..94aa9504df75 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-09-01" + #define STRING_DISTRIBUTION_DATE "2020-09-02" #endif /** From ab06d5c7fb8faa486bbebe88c5446f062a9cd9e5 Mon Sep 17 00:00:00 2001 From: ManuelMcLure Date: Tue, 1 Sep 2020 23:32:52 -0700 Subject: [PATCH 449/483] Fix UBL 'G29 I' for large meshes (#19231) --- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 809caecf49ea..087fdf42b2ac 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -48,7 +48,7 @@ void unified_bed_leveling::report_current_mesh() { if (!leveling_is_valid()) return; - SERIAL_ECHO_MSG(" G29 I99"); + SERIAL_ECHO_MSG(" G29 I999"); GRID_LOOP(x, y) if (!isnan(z_values[x][y])) { SERIAL_ECHO_START(); From 768182c69135aff36613857d66473fae61310aa2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 3 Sep 2020 00:12:25 +0000 Subject: [PATCH 450/483] [cron] Bump distribution date (2020-09-03) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 94aa9504df75..76d40267683b 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-09-02" + #define STRING_DISTRIBUTION_DATE "2020-09-03" #endif /** From 277042bc4e79fe89824e941605e830391ebcd3c0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 3 Sep 2020 16:52:31 -0500 Subject: [PATCH 451/483] Hide multi-step G29 on Ender 3 V2 --- Marlin/src/lcd/dwin/dwin.cpp | 39 ++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/dwin.cpp index d82efc568918..6bc0d74f23d8 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/dwin.cpp @@ -28,6 +28,10 @@ #if ENABLED(DWIN_CREALITY_LCD) +#if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) && DISABLED(PROBE_MANUALLY) + #define HAS_ONESTEP_LEVELING 1 +#endif + #include "dwin.h" #include @@ -57,7 +61,7 @@ #include "../../feature/host_actions.h" #endif -#if HAS_LEVELING +#if HAS_ONESTEP_LEVELING #include "../../feature/bedlevel/bedlevel.h" #endif @@ -596,7 +600,7 @@ inline void Draw_Prepare_Menu() { inline void Draw_Control_Menu() { Clear_Main_Window(); - const int16_t scroll = TERN(HAS_LEVELING, MROWS - index_control, 0); // Scrolled-up lines + const int16_t scroll = TERN(HAS_ONESTEP_LEVELING, MROWS - index_control, 0); // Scrolled-up lines #define CSCROL(L) (scroll + (L)) #define CLINE(L) MBASE(CSCROL(L)) @@ -976,7 +980,7 @@ void Goto_MainMenu(void) { ICON_Print(); ICON_Prepare(); ICON_Control(); - TERN(HAS_LEVELING, ICON_Leveling, ICON_StartInfo)(select_page.now == 3); + TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(select_page.now == 3); } inline ENCODER_DiffState get_encoder_state() { @@ -1782,7 +1786,7 @@ void HMI_MainMenu(void) { case 0: ICON_Print(); break; case 1: ICON_Print(); ICON_Prepare(); break; case 2: ICON_Prepare(); ICON_Control(); break; - case 3: ICON_Control(); TERN(HAS_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; + case 3: ICON_Control(); TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; } } } @@ -1791,8 +1795,8 @@ void HMI_MainMenu(void) { switch (select_page.now) { case 0: ICON_Print(); ICON_Prepare(); break; case 1: ICON_Prepare(); ICON_Control(); break; - case 2: ICON_Control(); TERN(HAS_LEVELING, ICON_Leveling, ICON_StartInfo)(0); break; - case 3: TERN(HAS_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; + case 2: ICON_Control(); TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(0); break; + case 3: TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; } } } @@ -1822,7 +1826,7 @@ void HMI_MainMenu(void) { /* Leveling */ case 3: - #if HAS_LEVELING + #if HAS_ONESTEP_LEVELING checkkey = Leveling; HMI_Leveling(); #else @@ -2324,7 +2328,7 @@ void HMI_Control(void) { // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - #define CONTROL_ITEMS (5 + ENABLED(HAS_LEVELING)) + #define CONTROL_ITEMS (5 + ENABLED(HAS_ONESTEP_LEVELING)) if (select_control.inc(CONTROL_ITEMS)) { if (select_control.now > MROWS && select_control.now > index_control) { index_control = select_control.now; @@ -2402,12 +2406,17 @@ void HMI_Control(void) { DWIN_UpdateLCD(); } -/* Leveling */ -void HMI_Leveling(void) { - Popup_Window_Leveling(); - DWIN_UpdateLCD(); - queue.inject_P(PSTR("G28O\nG29")); -} + +#if HAS_ONESTEP_LEVELING + + /* Leveling */ + void HMI_Leveling(void) { + Popup_Window_Leveling(); + DWIN_UpdateLCD(); + queue.inject_P(PSTR("G28O\nG29")); + } + +#endif /* Axis Move */ void HMI_AxisMove(void) { @@ -2896,7 +2905,7 @@ void HMI_Info(void) { ENCODER_DiffState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_ENTER) { - #if HAS_LEVELING + #if HAS_ONESTEP_LEVELING checkkey = Control; select_control.set(CONTROL_ITEMS); Draw_Control_Menu(); From 7d8d0010e3e552e8a2e4d555b58fa6764482a7d4 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Fri, 4 Sep 2020 00:40:29 +0200 Subject: [PATCH 452/483] Fix Longer3D TFT defines, disable DMA (#19251) --- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index cbc43a7ac806..d08045ec16d5 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -119,11 +119,12 @@ */ #define LCD_RESET_PIN PC4 // pin 33 -#define LCD_BACKLIGHT_PIN PD12 // pin 59 +#define TFT_RESET_PIN PC4 // pin 33 +#define TFT_BACKLIGHT_PIN PD12 // pin 59 #define FSMC_CS_PIN PD7 // pin 88 = FSMC_NE1 #define FSMC_RS_PIN PD11 // pin 58 A16 Register. Only one address needed -#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT +//#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT (broken) #define FSMC_DMA_DEV DMA2 #define FSMC_DMA_CHANNEL DMA_CH5 @@ -136,6 +137,8 @@ #define TFT_PIXEL_OFFSET_X 32 #define TFT_PIXEL_OFFSET_Y 32 +//#define TFT_DRIVER ILI9341 + /** * Note: Alfawise U20/U30 boards DON'T use SPI2, as the hardware designer * mixed up MOSI and MISO pins. SPI is managed in SW, and needs pins From 26858fdebfff14960bc2234b5346f7caf9690bd6 Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Thu, 3 Sep 2020 17:43:52 -0500 Subject: [PATCH 453/483] Separate Neopixel followup (#19250) --- Marlin/src/feature/leds/neopixel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index f8300c4d988c..42046fa5638f 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -110,7 +110,7 @@ class Marlin_NeoPixel { #if CONJOINED_NEOPIXEL adaneo2.show(); #else - TERN_(NEOPIXEL2_SEPARATE,adaneo1.setPin(NEOPIXEL2_PIN)); + TERN(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); adaneo1.show(); adaneo1.setPin(NEOPIXEL_PIN); #endif From 1f25312b65350c9d500f381b0054cf65d4599583 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 3 Sep 2020 19:46:05 -0300 Subject: [PATCH 454/483] Only show "SD Init Fail" with detectable media (#19236) --- Marlin/src/sd/cardreader.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 32bdc73bcda6..59a5f1da8b82 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -383,8 +383,10 @@ void CardReader::mount() { if (flag.mounted) cdroot(); - else if (marlin_state != MF_INITIALIZING) - ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); + #if ENABLED(USB_FLASH_DRIVE_SUPPORT) || PIN_EXISTS(SD_DETECT) + else if (marlin_state != MF_INITIALIZING) + ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); + #endif ui.refresh(); } From 691f02acab43ebf1e8930dba82097f2da2aedb0b Mon Sep 17 00:00:00 2001 From: Greg Nutt Date: Thu, 3 Sep 2020 18:52:14 -0400 Subject: [PATCH 455/483] Smoothieboard GLCD w/ SD support (#19241) --- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 43 +++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index c9bd9ec3ae1a..67482b3a496f 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -111,7 +111,48 @@ #elif HAS_SPI_LCD - #error "Marlin's Smoothieboard support cannot drive your LCD." + /* + The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either + a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board + found at http://smoothieware.org/rrdglcdadapter + + Other links to information about setting up a display panel with Smoothieboard + http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg + http://smoothieware.org/panel + */ + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + // EXP1 Pins + #define BEEPER_PIN P1_31 // EXP1 Pin 1 + #define BTN_ENC P1_30 // EXP1 Pin 2 + #define LCD_PINS_ENABLE P0_18 // EXP1 Pin 3 (MOSI) + #define LCD_PINS_RS P0_16 // EXP1 Pin 4 (CS) + #define LCD_PINS_D4 P0_15 // EXP1 Pin 5 (SCK) + // EXP2 Pins + #define BTN_EN2 P3_26 // EXP2 Pin 3 + #define BTN_EN1 P3_25 // EXP2 Pin 5 + + /* + SD Support + + For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be + hooked up to the onboard SDCard SPI and use a spare pin for the SDCS. + Also note that an external SDCard sharing the SPI port with the + onboard/internal SDCard must be ejected before rebooting as the bootloader + does not like the external card. NOTE Smoothie will not boot if the external + sdcard is inserted in the RRD LCD sdcard slot at boot time, it must be + inserted after it has booted. + */ + + #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) + #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) + #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) + #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) + #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) + + #else + #error "Marlin's Smoothieboard support cannot drive your LCD." + #endif #endif From 55dcff746b7faec12b9b7d37aff4ac49d9222cfd Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 4 Sep 2020 00:12:46 +0000 Subject: [PATCH 456/483] [cron] Bump distribution date (2020-09-04) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 76d40267683b..ae5a3906b221 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-09-03" + #define STRING_DISTRIBUTION_DATE "2020-09-04" #endif /** From e97e6865c3e587a04ae2878e72a8dfb137534b7e Mon Sep 17 00:00:00 2001 From: Victor Sokolov Date: Fri, 4 Sep 2020 05:12:53 +0400 Subject: [PATCH 457/483] MarkForged kinematics (#19235) --- Marlin/Configuration.h | 3 +- Marlin/src/core/utility.cpp | 9 +++--- Marlin/src/gcode/host/M360.cpp | 9 +++--- Marlin/src/inc/Conditionals_post.h | 7 ++++- Marlin/src/inc/SanityCheck.h | 17 ++++++++--- Marlin/src/module/endstops.cpp | 12 ++++---- Marlin/src/module/motion.cpp | 17 ++++++----- Marlin/src/module/planner.cpp | 48 ++++++++++++++++++++++++++---- Marlin/src/module/stepper.cpp | 12 ++++++-- 9 files changed, 100 insertions(+), 34 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 8cd2faf7f88b..52af1375a509 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -608,7 +608,7 @@ // @section machine -// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics, // either in the usual order or reversed //#define COREXY //#define COREXZ @@ -616,6 +616,7 @@ //#define COREYX //#define COREZX //#define COREZY +//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042 //=========================================================================== //============================== Endstop Settings =========================== diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index 295657fa64f3..f99956816778 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -57,10 +57,11 @@ void safe_delay(millis_t ms) { void log_machine_info() { SERIAL_ECHOLNPGM("Machine Type: " - TERN_(DELTA, "Delta") - TERN_(IS_SCARA, "SCARA") - TERN_(IS_CORE, "Core") - TERN_(IS_CARTESIAN, "Cartesian") + TERN_(DELTA, "Delta") + TERN_(IS_SCARA, "SCARA") + TERN_(IS_CORE, "Core") + TERN_(MARKFORGED_XY, "MarkForged") + TERN_(IS_CARTESIAN, "Cartesian") ); SERIAL_ECHOLNPGM("Probe: " diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 87ca23becd48..9970dc4df95c 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -145,10 +145,11 @@ void GcodeSuite::M360() { config_prefix(PSTR("PrinterType")); SERIAL_ECHOLNPGM( - TERN_(DELTA, "Delta") - TERN_(IS_SCARA, "SCARA") - TERN_(IS_CORE, "Core") - TERN_(IS_CARTESIAN, "Cartesian") + TERN_(DELTA, "Delta") + TERN_(IS_SCARA, "SCARA") + TERN_(IS_CORE, "Core") + TERN_(MARKFORGED_XY, "MarkForged") + TERN_(IS_CARTESIAN, "Cartesian") ); // diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index f566643bdb5b..71ae4bb28539 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -149,11 +149,16 @@ #define CORE_AXIS_2 C_AXIS #endif #define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n)) +#elif ENABLED(MARKFORGED_XY) + // Markforged kinematics + #define CORE_AXIS_1 A_AXIS + #define CORE_AXIS_2 B_AXIS + #define NORMAL_AXIS Z_AXIS #endif // Calibration codes only for non-core axes #if EITHER(BACKLASH_GCODE, CALIBRATION_GCODE) - #if IS_CORE + #if EITHER(IS_CORE, MARKFORGED_XY) #define X_AXIS_INDEX 0 #define Y_AXIS_INDEX 1 #define Z_AXIS_INDEX 2 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index da5ddc1c2ddb..dcd6e4f18b08 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -764,6 +764,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(BABYSTEPPING) #if ENABLED(SCARA) #error "BABYSTEPPING is not implemented for SCARA yet." + #elif BOTH(MARKFORGED_XY, BABYSTEP_XY) + #error "BABYSTEPPING only implemented for Z axis on MarkForged." #elif BOTH(DELTA, BABYSTEP_XY) #error "BABYSTEPPING only implemented for Z axis on deltabots." #elif BOTH(BABYSTEP_ZPROBE_OFFSET, MESH_BED_LEVELING) @@ -1155,8 +1157,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS + ENABLED(COREYZ) \ + ENABLED(COREYX) \ + ENABLED(COREZX) \ - + ENABLED(COREZY) - #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, or COREZY." + + ENABLED(COREZY) \ + + ENABLED(MARKFORGED_XY) + #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." #endif /** @@ -1576,8 +1579,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if ENABLED(DUAL_X_CARRIAGE) #if EXTRUDERS < 2 #error "DUAL_X_CARRIAGE requires 2 (or more) extruders." - #elif CORE_IS_XY || CORE_IS_XZ - #error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, or COREZX." + #elif ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) + #error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, COREZX, or MARKFORGED_XY." #elif !GOOD_AXIS_PINS(X2) #error "DUAL_X_CARRIAGE requires X2 stepper pins to be defined." #elif !HAS_X_MAX @@ -2533,6 +2536,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "CoreXZ requires both X and Z to use sensorless homing if either one does." #elif CORE_IS_YZ && Y_SENSORLESS != Z_SENSORLESS && !HOMING_Z_WITH_PROBE #error "CoreYZ requires both Y and Z to use sensorless homing if either one does." +#elif ENABLED(MARKFORGED_XY) && X_SENSORLESS != Y_SENSORLESS + #error "MARKFORGED_XY requires both X and Y to use sensorless homing if either one does." #endif // Other TMC feature requirements @@ -2848,6 +2853,10 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "BACKLASH_COMPENSATION requires BACKLASH_DISTANCE_MM." #elif !defined(BACKLASH_CORRECTION) #error "BACKLASH_COMPENSATION requires BACKLASH_CORRECTION." + #elif ENABLED(MARKFORGED_XY) + constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM; + static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2], + "BACKLASH_COMPENSATION can only apply to " STRINGIFY(NORMAL_AXIS) " on a MarkForged system."); #elif IS_CORE constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM; static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2], diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 289270072d97..1169ede2dc1e 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -498,7 +498,7 @@ void Endstops::update() { #define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT_TO(live_state, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) #define COPY_LIVE_STATE(SRC_BIT, DST_BIT) SET_BIT_TO(live_state, DST_BIT, TEST(live_state, SRC_BIT)) - #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) + #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && NONE(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) // If G38 command is active check Z_MIN_PROBE for ALL movement if (G38_move) UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); #endif @@ -514,12 +514,12 @@ void Endstops::update() { #endif // Use HEAD for core axes, AXIS for others - #if CORE_IS_XY || CORE_IS_XZ + #if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) #define X_AXIS_HEAD X_HEAD #else #define X_AXIS_HEAD X_AXIS #endif - #if CORE_IS_XY || CORE_IS_YZ + #if ANY(CORE_IS_XY, CORE_IS_YZ, MARKFORGED_XY) #define Y_AXIS_HEAD Y_HEAD #else #define Y_AXIS_HEAD Y_AXIS @@ -736,7 +736,7 @@ void Endstops::update() { #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_DUAL_ENDSTOP(Z, MINMAX) #endif - #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) + #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && NONE(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) #if ENABLED(G38_PROBE_AWAY) #define _G38_OPEN_STATE (G38_move >= 4) #else @@ -865,7 +865,7 @@ void Endstops::update() { bool hit = false; #if X_SPI_SENSORLESS if (tmc_spi_homing.x && (stepperX.test_stall_status() - #if CORE_IS_XY && Y_SPI_SENSORLESS + #if ANY(CORE_IS_XY, MARKFORGED_XY) && Y_SPI_SENSORLESS || stepperY.test_stall_status() #elif CORE_IS_XZ && Z_SPI_SENSORLESS || stepperZ.test_stall_status() @@ -877,7 +877,7 @@ void Endstops::update() { #endif #if Y_SPI_SENSORLESS if (tmc_spi_homing.y && (stepperY.test_stall_status() - #if CORE_IS_XY && X_SPI_SENSORLESS + #if ANY(CORE_IS_XY, MARKFORGED_XY) && X_SPI_SENSORLESS || stepperX.test_stall_status() #elif CORE_IS_YZ && Z_SPI_SENSORLESS || stepperZ.test_stall_status() diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 401721140be7..2f12302e5915 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1152,7 +1152,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if AXIS_HAS_STALLGUARD(X2) stealth_states.x2 = tmc_enable_stallguard(stepperX2); #endif - #if CORE_IS_XY && Y_SENSORLESS + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS stealth_states.y = tmc_enable_stallguard(stepperY); #elif CORE_IS_XZ && Z_SENSORLESS stealth_states.z = tmc_enable_stallguard(stepperZ); @@ -1165,7 +1165,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if AXIS_HAS_STALLGUARD(Y2) stealth_states.y2 = tmc_enable_stallguard(stepperY2); #endif - #if CORE_IS_XY && X_SENSORLESS + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS stealth_states.x = tmc_enable_stallguard(stepperX); #elif CORE_IS_YZ && Z_SENSORLESS stealth_states.z = tmc_enable_stallguard(stepperZ); @@ -1216,7 +1216,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if AXIS_HAS_STALLGUARD(X2) tmc_disable_stallguard(stepperX2, enable_stealth.x2); #endif - #if CORE_IS_XY && Y_SENSORLESS + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS tmc_disable_stallguard(stepperY, enable_stealth.y); #elif CORE_IS_XZ && Z_SENSORLESS tmc_disable_stallguard(stepperZ, enable_stealth.z); @@ -1229,7 +1229,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if AXIS_HAS_STALLGUARD(Y2) tmc_disable_stallguard(stepperY2, enable_stealth.y2); #endif - #if CORE_IS_XY && X_SENSORLESS + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS tmc_disable_stallguard(stepperX, enable_stealth.x); #elif CORE_IS_YZ && Z_SENSORLESS tmc_disable_stallguard(stepperZ, enable_stealth.z); @@ -1789,7 +1789,7 @@ void homeaxis(const AxisEnum axis) { do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis)); } - #else // CARTESIAN / CORE + #else // CARTESIAN / CORE / MARKFORGED_XY set_axis_is_at_home(axis); sync_plan_position(); @@ -1818,8 +1818,11 @@ void homeaxis(const AxisEnum axis) { #if ENABLED(SENSORLESS_HOMING) planner.synchronize(); - if (TERN0(IS_CORE, axis != NORMAL_AXIS)) - safe_delay(200); // Short delay to allow belts to spring back + if (false + #if EITHER(IS_CORE, MARKFORGED_XY) + || axis != NORMAL_AXIS + #endif + ) safe_delay(200); // Short delay to allow belts to spring back #endif } #endif diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 931daa3322b8..82c62ed579de 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1614,6 +1614,7 @@ void Planner::finish_and_disable() { float Planner::get_axis_position_mm(const AxisEnum axis) { float axis_steps; #if IS_CORE + // Requesting one of the "core" axes? if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { @@ -1631,9 +1632,30 @@ float Planner::get_axis_position_mm(const AxisEnum axis) { } else axis_steps = stepper.position(axis); + + #elif ENABLED(MARKFORGED_XY) + + // Requesting one of the joined axes? + if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { + // Protect the access to the position. + const bool was_enabled = stepper.suspend(); + + const int32_t p1 = stepper.position(CORE_AXIS_1), + p2 = stepper.position(CORE_AXIS_2); + + if (was_enabled) stepper.wake_up(); + + axis_steps = ((axis == CORE_AXIS_1) ? p1 - p2 : p2); + } + else + axis_steps = stepper.position(axis); + #else + axis_steps = stepper.position(axis); + #endif + return axis_steps * steps_to_mm[axis]; } @@ -1808,6 +1830,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, if (dc < 0) SBI(dm, Z_HEAD); // ...and Z if (db + dc < 0) SBI(dm, B_AXIS); // Motor B direction if (CORESIGN(db - dc) < 0) SBI(dm, C_AXIS); // Motor C direction + #elif ENABLED(MARKFORGED_XY) + if (da < 0) SBI(dm, X_HEAD); // Save the real Extruder (head) direction in X Axis + if (db < 0) SBI(dm, Y_HEAD); // ...and Y + if (dc < 0) SBI(dm, Z_AXIS); + if (da + db < 0) SBI(dm, A_AXIS); // Motor A direction + if (db < 0) SBI(dm, B_AXIS); // Motor B direction #else if (da < 0) SBI(dm, X_AXIS); if (db < 0) SBI(dm, Y_AXIS); @@ -1843,6 +1871,8 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->steps.set(ABS(da + dc), ABS(db), ABS(da - dc)); #elif CORE_IS_YZ block->steps.set(ABS(da), ABS(db + dc), ABS(db - dc)); + #elif ENABLED(MARKFORGED_XY) + block->steps.set(ABS(da + db), ABS(db), ABS(dc)); #elif IS_SCARA block->steps.set(ABS(da), ABS(db), ABS(dc)); #else @@ -1859,7 +1889,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, * Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. */ struct DistanceMM : abce_float_t { - TERN_(IS_CORE, xyz_pos_t head); + #if EITHER(IS_CORE, MARKFORGED_XY) + xyz_pos_t head; + #endif } steps_dist_mm; #if IS_CORE #if CORE_IS_XY @@ -1881,6 +1913,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, steps_dist_mm.b = (db + dc) * steps_to_mm[B_AXIS]; steps_dist_mm.c = CORESIGN(db - dc) * steps_to_mm[C_AXIS]; #endif + #elif ENABLED(MARKFORGED_XY) + steps_dist_mm.head.x = da * steps_to_mm[A_AXIS]; + steps_dist_mm.head.y = db * steps_to_mm[B_AXIS]; + steps_dist_mm.z = dc * steps_to_mm[Z_AXIS]; + steps_dist_mm.a = (da - db) * steps_to_mm[A_AXIS]; + steps_dist_mm.b = db * steps_to_mm[B_AXIS]; #else steps_dist_mm.a = da * steps_to_mm[A_AXIS]; steps_dist_mm.b = db * steps_to_mm[B_AXIS]; @@ -1907,7 +1945,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->millimeters = millimeters; else block->millimeters = SQRT( - #if CORE_IS_XY + #if EITHER(CORE_IS_XY, MARKFORGED_XY) sq(steps_dist_mm.head.x) + sq(steps_dist_mm.head.y) + sq(steps_dist_mm.z) #elif CORE_IS_XZ sq(steps_dist_mm.head.x) + sq(steps_dist_mm.y) + sq(steps_dist_mm.head.z) @@ -1964,7 +2002,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif // Enable active axes - #if CORE_IS_XY + #if EITHER(CORE_IS_XY, MARKFORGED_XY) if (block->steps.a || block->steps.b) { ENABLE_AXIS_X(); ENABLE_AXIS_Y(); @@ -2325,9 +2363,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, * On CoreXY the length of the vector [A,B] is SQRT(2) times the length of the head movement vector [X,Y]. * So taking Z and E into account, we cannot scale to a unit vector with "inverse_millimeters". * => normalize the complete junction vector. - * Elsewise, when needed JD factors in the E component + * Elsewise, when needed JD will factor-in the E component */ - if (ENABLED(IS_CORE) || esteps > 0) + if (EITHER(IS_CORE, MARKFORGED_XY) || esteps > 0) normalize_junction_vector(unit_vec); // Normalize with XYZE components else unit_vec *= inverse_millimeters; // Use pre-calculated (1 / SQRT(x^2 + y^2 + z^2)) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 0e70fd370cf9..fab1a615482d 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2041,6 +2041,8 @@ uint32_t Stepper::block_phase_isr() { #define X_CMP(A,B) ((A)!=(B)) #endif #define X_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && X_CMP(D_(1),D_(2))) ) + #elif ENABLED(MARKFORGED_XY) + #define X_MOVE_TEST (current_block->steps.a != current_block->steps.b) #else #define X_MOVE_TEST !!current_block->steps.a #endif @@ -2614,6 +2616,8 @@ void Stepper::_set_position(const int32_t &a, const int32_t &b, const int32_t &c #elif CORE_IS_YZ // coreyz planning count_position.set(a, b + c, CORESIGN(b - c)); + #elif ENABLED(MARKFORGED_XY) + count_position.set(a - b, b, c); #else // default non-h-bot planning count_position.set(a, b, c); @@ -2680,6 +2684,10 @@ void Stepper::endstop_triggered(const AxisEnum axis) { ? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2]) : count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2] ) * double(0.5) + #elif ENABLED(MARKFORGED_XY) + axis == CORE_AXIS_1 + ? count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2] + : count_position[CORE_AXIS_2] #else // !IS_CORE count_position[axis] #endif @@ -2709,12 +2717,12 @@ int32_t Stepper::triggered_position(const AxisEnum axis) { } void Stepper::report_a_position(const xyz_long_t &pos) { - #if CORE_IS_XY || CORE_IS_XZ || ENABLED(DELTA) || IS_SCARA + #if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY, DELTA, IS_SCARA) SERIAL_ECHOPAIR(STR_COUNT_A, pos.x, " B:", pos.y); #else SERIAL_ECHOPAIR_P(PSTR(STR_COUNT_X), pos.x, SP_Y_LBL, pos.y); #endif - #if CORE_IS_XZ || CORE_IS_YZ || ENABLED(DELTA) + #if ANY(CORE_IS_XZ, CORE_IS_YZ, DELTA) SERIAL_ECHOLNPAIR(" C:", pos.z); #else SERIAL_ECHOLNPAIR_P(SP_Z_LBL, pos.z); From 1d6a92751b2ac5b96a99688a33ae73f305992a4d Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 3 Sep 2020 21:15:45 -0700 Subject: [PATCH 458/483] Tweak ESP32 Wifi sanity-check message (#19257) --- Marlin/src/inc/SanityCheck.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index dcd6e4f18b08..17501177a822 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3102,7 +3102,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) * Sanity check for WIFI */ #if EITHER(ESP3D_WIFISUPPORT, WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) - #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 controller." + #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 MOTHERBOARD." #endif /** From 00e738e485ad2c67e9aa80a089c580dce5ec44e2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 5 Sep 2020 00:18:44 +0000 Subject: [PATCH 459/483] [cron] Bump distribution date (2020-09-05) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ae5a3906b221..8f05b96ff566 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-09-04" + #define STRING_DISTRIBUTION_DATE "2020-09-05" #endif /** From 3002e1cd60c2cd724c046c50371b3c833eb21a6d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Sep 2020 14:15:06 -0500 Subject: [PATCH 460/483] Fix Creality V4 SD Detect --- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index ded0ba405b4c..090f3ee3f8f9 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -153,6 +153,7 @@ #define ON_BOARD_SPI_DEVICE 1 #define ONBOARD_SD_CS_PIN PA4 // SDSS #define SDIO_SUPPORT +#define NO_SD_HOST_DRIVE // This board's SD is only seen by the printer #if ENABLED(CR10_STOCKDISPLAY) && NONE(RET6_12864_LCD, VET6_12864_LCD) #error "Define RET6_12864_LCD or VET6_12864_LCD to select pins for CR10_STOCKDISPLAY with the Creality V4 controller." From 14314b68ec81072954a4ed445ecd65e1930d180c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Sep 2020 19:57:07 -0500 Subject: [PATCH 461/483] No 'ls' if media isn't mounted --- Marlin/src/core/language.h | 1 + Marlin/src/gcode/sd/M20.cpp | 10 +++++++--- Marlin/src/sd/cardreader.cpp | 6 ++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index f0ddbdd6d096..1d81ee61fb6d 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -120,6 +120,7 @@ #define STR_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " #define STR_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " #define STR_FILE_PRINTED "Done printing file" +#define STR_NO_MEDIA "No media" #define STR_BEGIN_FILE_LIST "Begin file list" #define STR_END_FILE_LIST "End file list" #define STR_INVALID_EXTRUDER "Invalid extruder" diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp index 6d4c55752cc3..7ac4affdae9c 100644 --- a/Marlin/src/gcode/sd/M20.cpp +++ b/Marlin/src/gcode/sd/M20.cpp @@ -31,9 +31,13 @@ * M20: List SD card to serial output */ void GcodeSuite::M20() { - SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); - card.ls(); - SERIAL_ECHOLNPGM(STR_END_FILE_LIST); + if (card.flag.mounted) { + SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); + card.ls(); + SERIAL_ECHOLNPGM(STR_END_FILE_LIST); + } + else + SERIAL_ECHO_MSG(STR_NO_MEDIA); } #endif // SDSUPPORT diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 59a5f1da8b82..3eacf8b69fb9 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -276,8 +276,10 @@ void CardReader::printListing(SdFile parent, const char * const prepend/*=nullpt // List all files on the SD card // void CardReader::ls() { - root.rewind(); - printListing(root); + if (flag.mounted) { + root.rewind(); + printListing(root); + } } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) From d9ad8caf0281398dfe960b4babb4e46512e18b18 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 4 Sep 2020 13:50:08 -0500 Subject: [PATCH 462/483] SD card debugging --- Marlin/src/sd/cardreader.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 3eacf8b69fb9..f8f1bf18e662 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -24,6 +24,8 @@ #if ENABLED(SDSUPPORT) +//#define DEBUG_CARDREADER + #include "cardreader.h" #include "../MarlinCore.h" @@ -51,6 +53,9 @@ #include "../feature/pause.h" #endif +#define DEBUG_OUT ENABLED(DEBUG_CARDREADER) +#include "../core/debug_out.h" + // public: card_flags_t CardReader::flag; @@ -405,6 +410,8 @@ void CardReader::manage_media() { uint8_t stat = uint8_t(IS_SD_INSERTED()); if (stat == prev_stat) return; + DEBUG_ECHOLNPAIR("SD: Status changed from ", prev_stat, " to ", stat); + flag.workDirIsRoot = true; // Return to root on mount/release if (ui.detected()) { @@ -431,12 +438,15 @@ void CardReader::manage_media() { if (stat) { TERN_(SDCARD_EEPROM_EMULATION, settings.first_load()); if (old_stat == 2) // First mount? + DEBUG_ECHOLNPGM("First mount."); TERN(POWER_LOSS_RECOVERY, recovery.check(), // Check for PLR file. (If not there it will beginautostart) beginautostart() // Look for auto0.g on the next loop ); } } + else + DEBUG_ECHOLNPGM("SD: No UI Detected."); } void CardReader::release() { From 2ea1bf0e1db0fe716ca04abd8a520ae10b04aa4e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 6 Sep 2020 00:13:05 +0000 Subject: [PATCH 463/483] [cron] Bump distribution date (2020-09-06) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 8f05b96ff566..643ee5f67098 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-09-05" + #define STRING_DISTRIBUTION_DATE "2020-09-06" #endif /** From b6ab163814270137cca1f4bf57e8d3534f6c35fc Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 6 Sep 2020 19:23:36 -0300 Subject: [PATCH 464/483] Emergency Parser for STM32F1 (#19279) --- Marlin/src/HAL/STM32F1/HAL.h | 13 +--- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 93 ++++++++++++++++++++++++ Marlin/src/HAL/STM32F1/MarlinSerial.h | 50 +++++++++++++ Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 - 4 files changed, 145 insertions(+), 15 deletions(-) create mode 100644 Marlin/src/HAL/STM32F1/MarlinSerial.cpp create mode 100644 Marlin/src/HAL/STM32F1/MarlinSerial.h diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 5a0b0460092b..f76d8c54a0e3 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -46,6 +46,8 @@ #include "msc_sd.h" #endif +#include "MarlinSerial.h" + // ------------------------ // Defines // ------------------------ @@ -64,17 +66,6 @@ #else #define UsbSerial MarlinCompositeSerial #endif - #define MSerial1 Serial1 - #define MSerial2 Serial2 - #define MSerial3 Serial3 - #define MSerial4 Serial4 - #define MSerial5 Serial5 -#else - #define MSerial1 Serial - #define MSerial2 Serial1 - #define MSerial3 Serial2 - #define MSerial4 Serial3 - #define MSerial5 Serial4 #endif #if SERIAL_PORT == 0 diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp new file mode 100644 index 000000000000..f965bc99cf06 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -0,0 +1,93 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfigPre.h" +#include "MarlinSerial.h" +#include + +// Copied from ~/.platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/usart_private.h +// Changed to handle Emergency Parser +static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb, usart_reg_map *regs, MarlinSerial &serial) { + /* Handle RXNEIE and TXEIE interrupts. + * RXNE signifies availability of a byte in DR. + * + * See table 198 (sec 27.4, p809) in STM document RM0008 rev 15. + * We enable RXNEIE. + */ + if ((regs->CR1 & USART_CR1_RXNEIE) && (regs->SR & USART_SR_RXNE)) { + uint8_t c = (uint8)regs->DR; + #ifdef USART_SAFE_INSERT + // If the buffer is full and the user defines USART_SAFE_INSERT, + // ignore new bytes. + rb_safe_insert(rb, c); + #else + // By default, push bytes around in the ring buffer. + rb_push_insert(rb, c); + #endif + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(serial.emergency_state, c); + #endif + } + // TXE signifies readiness to send a byte to DR. + if ((regs->CR1 & USART_CR1_TXEIE) && (regs->SR & USART_SR_TXE)) { + if (!rb_is_empty(wb)) + regs->DR=rb_remove(wb); + else + regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE + } +} + +#define DEFINE_HWSERIAL_MARLIN(name, n) \ + MarlinSerial name(USART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN); \ + extern "C" void __irq_usart##n(void) { \ + my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \ + } + +#define DEFINE_HWSERIAL_UART_MARLIN(name, n) \ + MarlinSerial name(UART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN); \ + extern "C" void __irq_usart##n(void) { \ + my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \ + } + +#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 || DGUS_SERIAL_PORT == 1 + DEFINE_HWSERIAL_MARLIN(MSerial1, 1); +#endif + +#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 || DGUS_SERIAL_PORT == 2 + DEFINE_HWSERIAL_MARLIN(MSerial2, 2); +#endif + +#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 || DGUS_SERIAL_PORT == 3 + DEFINE_HWSERIAL_MARLIN(MSerial3, 3); +#endif + +#if SERIAL_PORT == 4 || SERIAL_PORT_2 == 4 || DGUS_SERIAL_PORT == 4 + DEFINE_HWSERIAL_UART_MARLIN(MSerial4, 4); +#endif + +#if SERIAL_PORT == 5 || SERIAL_PORT_2 == 5 || DGUS_SERIAL_PORT == 5 + DEFINE_HWSERIAL_UART_MARLIN(MSerial5, 5); +#endif diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h new file mode 100644 index 000000000000..4e8a47d2f909 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include +#include + +#include "../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +class MarlinSerial : public HardwareSerial { +public: + MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) : + HardwareSerial(usart_device, tx_pin, rx_pin) + #if ENABLED(EMERGENCY_PARSER) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { } + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif +}; + +extern MarlinSerial MSerial1; +extern MarlinSerial MSerial2; +extern MarlinSerial MSerial3; +extern MarlinSerial MSerial4; +extern MarlinSerial MSerial5; diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index c0cb48695253..9d5026fbab10 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -25,10 +25,6 @@ * Test STM32F1-specific configuration values for errors at compile-time. */ -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for STM32F1. Disable EMERGENCY_PARSER to continue." -#endif - #if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F1." #endif From 486731162faae9f374d0038a2e87f3b2204ae78e Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 6 Sep 2020 19:29:43 -0300 Subject: [PATCH 465/483] Fix STM32F1 SPI device init, MKS_LCD12864 (#19271) --- Marlin/src/HAL/STM32F1/SPI.cpp | 5 +- .../lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp | 1 + Marlin/src/lcd/dogm/ultralcd_DOGM.cpp | 60 +++++++++---------- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 3 - .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 2 - .../src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h | 4 -- 6 files changed, 33 insertions(+), 42 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp index 423772dbc948..0452cf629390 100644 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -40,6 +40,9 @@ #include #include +#include "../../inc/MarlinConfig.h" +#include "spi_pins.h" + /** Time in ms for DMA receive timeout */ #define DMA_TIMEOUT 100 @@ -710,6 +713,6 @@ static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { return baud_rates[i]; } -SPIClass SPI(1); +SPIClass SPI(SPI_DEVICE); #endif // __STM32F1__ diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp index 85339e83495a..e4e387c1907f 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp @@ -112,6 +112,7 @@ static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = { U8G_ESC_CS(1), // enable chip UC1701_ALL_PIX(0), // normal display U8G_ESC_CS(0), // disable chip + U8G_ESC_DLY(150), // delay 150 ms before sending any data U8G_ESC_END // end of sequence }; diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp index 7ebabd6950b3..bf0edbb8ded2 100644 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -240,39 +240,35 @@ bool MarlinUI::detected() { return true; } // Initialize or re-initialize the LCD void MarlinUI::init_lcd() { - #if DISABLED(MKS_LCD12864) - - #if PIN_EXISTS(LCD_BACKLIGHT) - OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away - #endif - - #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) - SET_OUTPUT(LCD_PINS_DC); - #ifndef LCD_RESET_PIN - #define LCD_RESET_PIN LCD_PINS_RS - #endif - #endif - - #if PIN_EXISTS(LCD_RESET) - // Perform a clean hardware reset with needed delays - OUT_WRITE(LCD_RESET_PIN, LOW); - _delay_ms(5); - WRITE(LCD_RESET_PIN, HIGH); - _delay_ms(5); - u8g.begin(); + #if PIN_EXISTS(LCD_BACKLIGHT) + OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away + #endif + + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) + SET_OUTPUT(LCD_PINS_DC); + #ifndef LCD_RESET_PIN + #define LCD_RESET_PIN LCD_PINS_RS #endif - - #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) - WRITE(LCD_BACKLIGHT_PIN, HIGH); - #endif - - TERN_(HAS_LCD_CONTRAST, refresh_contrast()); - - TERN_(LCD_SCREEN_ROT_90, u8g.setRot90()); - TERN_(LCD_SCREEN_ROT_180, u8g.setRot180()); - TERN_(LCD_SCREEN_ROT_270, u8g.setRot270()); - - #endif // !MKS_LCD12864 + #endif + + #if PIN_EXISTS(LCD_RESET) + // Perform a clean hardware reset with needed delays + OUT_WRITE(LCD_RESET_PIN, LOW); + _delay_ms(5); + WRITE(LCD_RESET_PIN, HIGH); + _delay_ms(5); + u8g.begin(); + #endif + + #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) + WRITE(LCD_BACKLIGHT_PIN, HIGH); + #endif + + TERN_(HAS_LCD_CONTRAST, refresh_contrast()); + + TERN_(LCD_SCREEN_ROT_90, u8g.setRot90()); + TERN_(LCD_SCREEN_ROT_180, u8g.setRot180()); + TERN_(LCD_SCREEN_ROT_270, u8g.setRot270()); uxg_SetUtf8Fonts(g_fontinfo, COUNT(g_fontinfo)); } diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index 1346e8099a65..9461a828af01 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -33,7 +33,6 @@ //#define DISABLE_DEBUG #define DISABLE_JTAG -#define ENABLE_SPI2 // // EEPROM @@ -152,8 +151,6 @@ #define DOGLCD_SCK PB13 #define DOGLCD_MOSI PB15 - #undef SHOW_BOOTSCREEN - #else #define LCD_PINS_D4 PA6 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 9cf8685dfab5..6ce6c6010501 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -115,8 +115,6 @@ #define DOGLCD_SCK PB13 #define DOGLCD_MOSI PB15 - #undef SHOW_BOOTSCREEN - #else // !MKS_MINI_12864 #define LCD_PINS_D4 PA6 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 228049d139bd..1295c7c46b12 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -351,10 +351,6 @@ #define DOGLCD_SCK PA5 #define DOGLCD_MOSI PA7 - // Required for MKS_MINI_12864 with this board - #define MKS_LCD12864B - #undef SHOW_BOOTSCREEN - #else // !MKS_MINI_12864 #define LCD_PINS_D4 PE14 From 86b71b83fa1208ce47ee3e3c8baa01dd8d563041 Mon Sep 17 00:00:00 2001 From: cosmoderp <36945803+cosmoderp@users.noreply.github.com> Date: Sun, 6 Sep 2020 18:34:08 -0400 Subject: [PATCH 466/483] Fix Ender 3 V2 (DWIN) buffer overrun (#19268) --- Marlin/src/lcd/dwin/dwin_lcd.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 0ca6b8a3ae62..b3d969cc8c01 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -37,9 +37,9 @@ #include "dwin_lcd.h" #include // for memset -// Make sure DWIN_SendBuf is large enough to hold the largest -// printed string plus the draw command and tail. -uint8_t DWIN_SendBuf[11 + 24] = { 0xAA }; +// Make sure DWIN_SendBuf is large enough to hold the largest string plus draw command and tail. +// Assume the narrowest (6 pixel) font and 2-byte gb2312-encoded characters. +uint8_t DWIN_SendBuf[11 + DWIN_WIDTH / 6 * 2] = { 0xAA }; uint8_t DWIN_BufTail[4] = { 0xCC, 0x33, 0xC3, 0x3C }; uint8_t databuf[26] = { 0 }; uint8_t receivedType; @@ -63,7 +63,7 @@ inline void DWIN_Long(size_t &i, const uint32_t lval) { } inline void DWIN_String(size_t &i, char * const string) { - const size_t len = strlen(string); + const size_t len = _MIN(sizeof(DWIN_SendBuf) - i, strlen(string)); memcpy(&DWIN_SendBuf[i+1], string, len); i += len; } From 2b789ddab968cf7040b5c927c76e6c7bec944cc3 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sun, 6 Sep 2020 16:37:16 -0600 Subject: [PATCH 467/483] Touch UI long filenames fixes (#19262) * Improvements to FTDI DLCache functionality. * Better handling of long file names in Touch UI - Long file names now truncated and shown with ellipsis. - Increased display cache buffer to allow for longer filenames. - Visual error message when display cache is exceeded. --- .../ftdi_eve_lib/basic/commands.h | 1 + .../ftdi_eve_lib/extended/dl_cache.cpp | 80 ++++++++++--------- .../ftdi_eve_lib/extended/dl_cache.h | 18 +++-- .../ftdi_eve_lib/extended/ftdi_extended.h | 1 + .../ftdi_eve_lib/extended/screen_types.h | 11 +++ .../ftdi_eve_lib/extended/text_ellipsis.cpp | 80 +++++++++++++++++++ .../ftdi_eve_lib/extended/text_ellipsis.h | 31 +++++++ .../screens/files_screen.cpp | 15 ++-- .../lib/ftdi_eve_touch_ui/screens/screens.h | 2 +- 9 files changed, 187 insertions(+), 52 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h index 1bb35a599577..a9fdb5c5c73c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h @@ -133,6 +133,7 @@ class CLCD { static void set_brightness (uint8_t brightness); static uint8_t get_brightness(); static void host_cmd (unsigned char host_command, unsigned char byte2); + static uint32_t dl_size() {return CLCD::mem_read_32(REG::CMD_DL) & 0x1FFF;} static void get_font_metrics (uint8_t font, struct FontMetrics &fm); static uint16_t get_text_width(const uint8_t font, const char *str); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp index 728e433154ae..439541bd517a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -32,7 +32,8 @@ * * The cache memory begins with a table at * DL_CACHE_START: each table entry contains - * an address and size for a cached DL slot. + * an address, size and used bytes for a cached + * DL slot. * * Immediately following the table is the * DL_FREE_ADDR, which points to free cache @@ -44,11 +45,14 @@ * * DL_CACHE_START slot0_addr 4 * slot0_size 4 + * slot0_used 4 * slot1_addr 4 * slot1_size 4 + * slot1_used 4 * ... * slotN_addr 4 * slotN_size 4 + * slotN_used 4 * DL_FREE_ADDR dl_free_ptr 4 * cached data * ... @@ -57,7 +61,7 @@ */ #define DL_CACHE_START MAP::RAM_G_SIZE - 0xFFFF -#define DL_FREE_ADDR DL_CACHE_START + DL_CACHE_SLOTS * 8 +#define DL_FREE_ADDR DL_CACHE_START + DL_CACHE_SLOTS * 12 using namespace FTDI; @@ -66,12 +70,12 @@ using namespace FTDI; void DLCache::init() { CLCD::mem_write_32(DL_FREE_ADDR, DL_FREE_ADDR + 4); for(uint8_t slot = 0; slot < DL_CACHE_SLOTS; slot++) { - save_slot(slot, 0, 0); + save_slot(slot, 0, 0, 0); } } bool DLCache::has_data() { - return dl_size != 0; + return dl_slot_size != 0; } bool DLCache::wait_until_idle() { @@ -93,12 +97,12 @@ bool DLCache::wait_until_idle() { * that it can be appended later. The memory is * dynamically allocated following DL_FREE_ADDR. * - * If num_bytes is provided, then that many bytes + * If min_bytes is provided, then that many bytes * will be reserved so that the cache may be re-written * later with potentially a bigger DL. */ -bool DLCache::store(uint32_t num_bytes /* = 0*/) { +bool DLCache::store(uint32_t min_bytes /* = 0*/) { CLCD::CommandFifo cmd; // Execute any commands already in the FIFO @@ -107,67 +111,67 @@ bool DLCache::store(uint32_t num_bytes /* = 0*/) { return false; // Figure out how long the display list is - uint32_t new_dl_size = CLCD::mem_read_32(REG::CMD_DL) & 0x1FFF; - uint32_t free_space = 0; - uint32_t dl_alloc = 0; + const uint32_t dl_size = CLCD::dl_size(); - if (dl_addr == 0) { + if (dl_slot_addr == 0) { // If we are allocating new space... - dl_addr = CLCD::mem_read_32(DL_FREE_ADDR); - free_space = MAP::RAM_G_SIZE - dl_addr; - dl_alloc = num_bytes ?: new_dl_size; - dl_size = new_dl_size; - } else { - // Otherwise, we can only store as much space - // as was previously allocated. - free_space = num_bytes ?: dl_size; - dl_alloc = 0; - dl_size = new_dl_size; + dl_slot_addr = CLCD::mem_read_32(DL_FREE_ADDR); + dl_slot_size = max(dl_size, min_bytes); + + const uint32_t free_space = MAP::RAM_G_SIZE - dl_slot_addr; + if(dl_slot_size <= free_space) { + CLCD::mem_write_32(DL_FREE_ADDR, dl_slot_addr + dl_slot_size); + } else { + dl_slot_addr = 0; + dl_slot_size = 0; + dl_slot_used = 0; + } } - if (dl_size > free_space) { + if (dl_size > dl_slot_size) { // Not enough memory to cache the display list. #if ENABLED(TOUCH_UI_DEBUG) SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Not enough space in GRAM to cache display list, free space: ", free_space); + SERIAL_ECHOPAIR ("Not enough space in GRAM to cache display list, free space: ", dl_slot_size); SERIAL_ECHOLNPAIR(" Required: ", dl_size); #endif + dl_slot_used = 0; + save_slot(); return false; } else { #if ENABLED(TOUCH_UI_DEBUG) SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Saving DL to RAMG cache, bytes: ", dl_size); - SERIAL_ECHOLNPAIR(" Free space: ", free_space); + SERIAL_ECHOPAIR ("Saving DL to RAMG cache, bytes: ", dl_slot_used); + SERIAL_ECHOLNPAIR(" Free space: ", dl_slot_size); #endif - cmd.memcpy(dl_addr, MAP::RAM_DL, dl_size); + dl_slot_used = dl_size; + save_slot(); + cmd.memcpy(dl_slot_addr, MAP::RAM_DL, dl_slot_used); cmd.execute(); - save_slot(dl_slot, dl_addr, dl_size); - if (dl_alloc > 0) { - // If we allocated space dynamically, then adjust dl_free_addr. - CLCD::mem_write_32(DL_FREE_ADDR, dl_addr + dl_alloc); - } return true; } } -void DLCache::save_slot(uint8_t dl_slot, uint32_t dl_addr, uint32_t dl_size) { - CLCD::mem_write_32(DL_CACHE_START + dl_slot * 8 + 0, dl_addr); - CLCD::mem_write_32(DL_CACHE_START + dl_slot * 8 + 4, dl_size); +void DLCache::save_slot(uint8_t indx, uint32_t addr, uint16_t size, uint16_t used) { + CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 0, addr); + CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 4, size); + CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 8, used); } -void DLCache::load_slot() { - dl_addr = CLCD::mem_read_32(DL_CACHE_START + dl_slot * 8 + 0); - dl_size = CLCD::mem_read_32(DL_CACHE_START + dl_slot * 8 + 4); +void DLCache::load_slot(uint8_t indx, uint32_t &addr, uint16_t &size, uint16_t &used) { + addr = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 0); + size = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 4); + used = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 8); } void DLCache::append() { CLCD::CommandFifo cmd; - cmd.append(dl_addr, dl_size); + cmd.append(dl_slot_addr, dl_slot_used); #if ENABLED(TOUCH_UI_DEBUG) cmd.execute(); wait_until_idle(); SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Appending to DL from RAMG cache, bytes: ", dl_size); + SERIAL_ECHOPAIR ("Appending to DL from RAMG cache, bytes: ", dl_slot_used); SERIAL_ECHOLNPAIR(" REG_CMD_DL: ", CLCD::mem_read_32(REG::CMD_DL)); #endif } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h index 4ae4bce3efab..c4bb22fbd760 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h @@ -44,12 +44,16 @@ class DLCache { typedef FTDI::ftdi_registers REG; typedef FTDI::ftdi_memory_map MAP; - uint8_t dl_slot; - uint32_t dl_addr; - uint16_t dl_size; + uint8_t dl_slot_indx; + uint32_t dl_slot_addr; + uint16_t dl_slot_size; + uint16_t dl_slot_used; - void load_slot(); - static void save_slot(uint8_t dl_slot, uint32_t dl_addr, uint32_t dl_size); + void load_slot() {load_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} + void save_slot() {save_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} + + static void load_slot(uint8_t indx, uint32_t &addr, uint16_t &size, uint16_t &used); + static void save_slot(uint8_t indx, uint32_t addr, uint16_t size, uint16_t used); bool wait_until_idle(); @@ -57,12 +61,12 @@ class DLCache { static void init(); DLCache(uint8_t slot) { - dl_slot = slot; + dl_slot_indx = slot; load_slot(); } bool has_data(); - bool store(uint32_t num_bytes = 0); + bool store(uint32_t min_bytes = 0); void append(); }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h index e1904511b264..6e4d0668fe3e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -47,4 +47,5 @@ #include "sound_list.h" #include "polygon.h" #include "text_box.h" + #include "text_ellipsis.h" #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h index b12ab286e19c..d1f84c8a6e86 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -173,10 +173,21 @@ class UncachedScreen { template class CachedScreen { protected: + static void gfxError() { + using namespace FTDI; + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR(true,true,true)) + .font(30) + .text(0, 0, display_width, display_height, F("GFX MEM FULL")); + } + static bool storeBackground() { DLCache dlcache(DL_SLOT); if (!dlcache.store(DL_SIZE)) { SERIAL_ECHO_MSG("CachedScreen::storeBackground() failed: not enough DL cache space"); + gfxError(); // Try to cache a shorter error message instead. + dlcache.store(DL_SIZE); return false; } return true; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp new file mode 100644 index 000000000000..3746f1cde0f5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -0,0 +1,80 @@ +/********************* + * text_ellipsis.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "ftdi_extended.h" + +#ifdef FTDI_EXTENDED + +namespace FTDI { + + /** + * Helper function for drawing text with ellipses. The str buffer may be modified and should have space for up to two extra characters. + */ + static void _draw_text_with_ellipsis(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, char *str, uint16_t options, uint8_t font) { + FontMetrics fm(font); + const uint16_t ellipsisWidth = fm.get_char_width('.') * 3; + + // Compute the total line length, as well as + // the location in the string where it can + // split and still allow the ellipsis to fit. + uint16_t lineWidth = 0; + char *breakPoint = str; + for(char* c = str; *c; c++) { + lineWidth += fm.get_char_width(*c); + if(lineWidth + ellipsisWidth < w) + breakPoint = c; + } + + if(lineWidth > w) { + *breakPoint = '\0'; + strcpy_P(breakPoint,PSTR("...")); + } + + cmd.apply_text_alignment(x, y, w, h, options); + #ifdef TOUCH_UI_USE_UTF8 + if (has_utf8_chars(str)) { + draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options); + } else + #endif + { + cmd.CLCD::CommandFifo::text(x, y, font, options); + cmd.CLCD::CommandFifo::str(str); + } + } + + /** + * These functions draws text inside a bounding box, truncating the text and + * adding ellipsis if the text does not fit. + */ + void draw_text_with_ellipsis(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) { + char tmp[strlen(str) + 3]; + strcpy(tmp, str); + _draw_text_with_ellipsis(cmd, x, y, w, h, tmp, options, font); + } + + void draw_text_with_ellipsis(CommandProcessor& cmd, int x, int y, int w, int h, progmem_str pstr, uint16_t options, uint8_t font) { + char tmp[strlen_P((const char*)pstr) + 3]; + strcpy_P(tmp, (const char*)pstr); + _draw_text_with_ellipsis(cmd, x, y, w, h, tmp, options, font); + } +} // namespace FTDI + +#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h new file mode 100644 index 000000000000..7852b7ec3e38 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h @@ -0,0 +1,31 @@ +/******************* + * text_ellipsis.h * + *******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 - SynDaver Labs, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#pragma once + +/** + * This function draws text inside a bounding box, truncating the text and + * showing ellipsis if it does not fit. + */ +namespace FTDI { + void draw_text_with_ellipsis(class CommandProcessor& cmd, int x, int y, int w, int h, progmem_str str, uint16_t options = 0, uint8_t font = 31); + void draw_text_with_ellipsis(class CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options = 0, uint8_t font = 31); +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index e3043024223a..8d6fb1860394 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -83,15 +83,19 @@ void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, cmd.font(font_medium) .rectangle( 0, BTN_Y(header_h+line), display_width, BTN_H(1)); cmd.cmd(COLOR_RGB(is_highlighted ? normal_btn.rgb : bg_text_enabled)); + constexpr uint16_t dim[2] = {BTN_SIZE(6,1)}; + #define POS_AND_SHORTEN(SHORTEN) BTN_POS(1,header_h+line), dim[0] - (SHORTEN), dim[1] + #define POS_AND_SIZE POS_AND_SHORTEN(0) #if ENABLED(SCROLL_LONG_FILENAMES) if (is_highlighted) { cmd.cmd(SAVE_CONTEXT()); cmd.cmd(MACRO(0)); - } + cmd.text(POS_AND_SIZE, filename, OPT_CENTERY | OPT_NOFIT); + } else #endif - cmd.text (BTN_POS(1,header_h+line), BTN_SIZE(6,1), filename, OPT_CENTERY | TERN0(SCROLL_LONG_FILENAMES, OPT_NOFIT)); - if (is_dir) { - cmd.text(BTN_POS(1,header_h+line), BTN_SIZE(6,1), F("> "), OPT_CENTERY | OPT_RIGHTX); + draw_text_with_ellipsis(cmd, POS_AND_SHORTEN(is_dir ? 20 : 0), filename, OPT_CENTERY, font_medium); + if (is_dir && !is_highlighted) { + cmd.text(POS_AND_SIZE, F("> "), OPT_CENTERY | OPT_RIGHTX); } #if ENABLED(SCROLL_LONG_FILENAMES) if (is_highlighted) { @@ -102,7 +106,7 @@ void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, void FilesScreen::drawFileList() { FileList files; - screen_data.FilesScreen.num_page = max(1,(ceil)(float(files.count()) / files_per_page)); + screen_data.FilesScreen.num_page = max(1,ceil(float(files.count()) / files_per_page)); screen_data.FilesScreen.cur_page = min(screen_data.FilesScreen.cur_page, screen_data.FilesScreen.num_page-1); screen_data.FilesScreen.flags.is_root = files.isAtRootDir(); @@ -134,7 +138,6 @@ void FilesScreen::drawHeader() { sprintf_P(str, PSTR("Page %d of %d"), screen_data.FilesScreen.cur_page + 1, screen_data.FilesScreen.num_page); - CommandProcessor cmd; cmd.colors(normal_btn) .font(font_small) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 92e6b230f7ef..ae48f752406e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -96,7 +96,7 @@ enum { #define STATUS_SCREEN_DL_SIZE 2048 #define ALERT_BOX_DL_SIZE 3072 #define SPINNER_DL_SIZE 3072 -#define FILE_SCREEN_DL_SIZE 3072 +#define FILE_SCREEN_DL_SIZE 4160 #define PRINTING_SCREEN_DL_SIZE 2048 /************************* MENU SCREEN DECLARATIONS *************************/ From d19fc643922e21ecbebd62126ab11206172c8d47 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sun, 6 Sep 2020 15:51:19 -0700 Subject: [PATCH 468/483] Clarify disabling StallGuard for axes (#19263) --- Marlin/Configuration_adv.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index e4b3fbf2ae1b..2712312747de 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2487,7 +2487,7 @@ #define E7_HYBRID_THRESHOLD 30 /** - * Use StallGuard2 to home / probe X, Y, Z. + * Use StallGuard to home / probe X, Y, Z. * * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. @@ -2508,6 +2508,8 @@ * * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when * homing and adds a guard period for endstop triggering. + * + * Comment *_STALL_SENSITIVITY to disable sensorless homing for that axis. */ //#define SENSORLESS_HOMING // StallGuard capable drivers only From f29baed54008b16284394459261f9fd316fa643e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 7 Sep 2020 00:13:11 +0000 Subject: [PATCH 469/483] [cron] Bump distribution date (2020-09-07) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 643ee5f67098..14d019088c8f 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-09-06" + #define STRING_DISTRIBUTION_DATE "2020-09-07" #endif /** From 5ea7a8373ab03ece1179b45d9205dcf8dd737240 Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Sun, 6 Sep 2020 20:00:24 -0500 Subject: [PATCH 470/483] Menu items for Separate NeoPixel (#19280) --- Marlin/src/feature/leds/leds.cpp | 10 ++++++ Marlin/src/feature/leds/leds.h | 2 +- Marlin/src/inc/SanityCheck.h | 18 ++++++----- Marlin/src/lcd/language/language_en.h | 4 +++ Marlin/src/lcd/menu/menu_led.cpp | 44 +++++++++++++++++++++++++-- 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index 01bca809260e..28a6814b4397 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -183,7 +183,17 @@ void LEDLights::set_color(const LEDColor &incol : neo2.Color(incol.r, incol.g, incol.b, incol.w); neo2.set_brightness(incol.i); neo2.set_color(neocolor); + + #if ENABLED(LED_CONTROL_MENU) + // Don't update the color when OFF + lights_on = !incol.is_off(); + if (lights_on) color = incol; + #endif } + + #if ENABLED(LED_CONTROL_MENU) + void LEDLights2::toggle() { if (lights_on) set_off(); else update(); } + #endif #endif // NEOPIXEL2_SEPARATE diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index a13f960a3bb2..055ea0df37ad 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -240,7 +240,7 @@ extern LEDLights leds; static inline void set_violet() { set_color(LEDColorViolet()); } #endif - #if ENABLED(LED_CONTROL_MENU) + #if ENABLED(NEOPIXEL2_SEPARATE) static LEDColor color; // last non-off color static bool lights_on; // the last set color was "on" static void toggle(); // swap "off" with color diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 17501177a822..0c79ead37387 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2119,18 +2119,20 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if !(_RGB_TEST && PIN_EXISTS(RGB_LED_W)) #error "RGBW_LED requires RGB_LED_R_PIN, RGB_LED_G_PIN, RGB_LED_B_PIN, and RGB_LED_W_PIN." #endif -#elif ENABLED(NEOPIXEL_LED) - #if !(PIN_EXISTS(NEOPIXEL) && NEOPIXEL_PIXELS > 0) +#endif +#undef _RGB_TEST + +// NeoPixel requirements +#if ENABLED(NEOPIXEL_LED) + #if !PIN_EXISTS(NEOPIXEL) || NEOPIXEL_PIXELS == 0 #error "NEOPIXEL_LED requires NEOPIXEL_PIN and NEOPIXEL_PIXELS." - #endif - #elif ENABLED(NEOPIXEL2_SEPARATE) - #if !(PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) - #error "NEOPIXEL2 requires NEOPIXEL2_PIN and NEOPIXEL2_PIXELS." + #elif ENABLED(NEOPIXEL2_SEPARATE) && !(NEOPIXEL2_TYPE && PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) + #error "NEOPIXEL2_SEPARATE requires NEOPIXEL2_PIN, NEOPIXEL2_TYPE and NEOPIXEL2_PIXELS." + #elif ENABLED(NEO2_COLOR_PRESETS) && DISABLED(NEOPIXEL2_SEPARATE) + #error "NEO2_COLOR_PRESETS requires NEOPIXEL2_SEPARATE to be enabled." #endif #endif -#undef _RGB_TEST - #if DISABLED(NO_COMPILE_TIME_PWM) #define _TEST_PWM(P) PWM_PIN(P) #else diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 39bb85d37815..8ae40304bdf3 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -222,6 +222,10 @@ namespace Language_en { PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("White"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Default"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Channel ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Lights #2"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Light #2 Presets"); + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Brightness"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Custom Lights"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Red Intensity"); PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Green Intensity"); diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index 290b0ddf63cd..386a4d799aa2 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -54,9 +54,33 @@ #endif + #if ENABLED(NEO2_COLOR_PRESETS) + + void menu_leds2_presets() { + START_MENU(); + #if LCD_HEIGHT > 2 + STATIC_ITEM(MSG_NEO2_PRESETS, SS_DEFAULT|SS_INVERT); + #endif + BACK_ITEM(MSG_LED_CONTROL); + ACTION_ITEM(MSG_SET_LEDS_WHITE, leds2.set_white); + ACTION_ITEM(MSG_SET_LEDS_RED, leds2.set_red); + ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds2.set_orange); + ACTION_ITEM(MSG_SET_LEDS_YELLOW, leds2.set_yellow); + ACTION_ITEM(MSG_SET_LEDS_GREEN, leds2.set_green); + ACTION_ITEM(MSG_SET_LEDS_BLUE, leds2.set_blue); + ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds2.set_indigo); + ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds2.set_violet); + END_MENU(); + } + + #endif + void menu_led_custom() { START_MENU(); BACK_ITEM(MSG_LED_CONTROL); + #if ENABLED(NEOPIXEL2_SEPARATE) + STATIC_ITEM_N(MSG_LED_CHANNEL_N, 1, SS_DEFAULT|SS_INVERT); + #endif EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds.color.r, 0, 255, leds.update, true); EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds.color.g, 0, 255, leds.update, true); EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds.color.b, 0, 255, leds.update, true); @@ -66,6 +90,14 @@ EDIT_ITEM(uint8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true); #endif #endif + #if ENABLED(NEOPIXEL2_SEPARATE) + STATIC_ITEM_N(MSG_LED_CHANNEL_N, 2, SS_DEFAULT|SS_INVERT); + EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds2.color.r, 0, 255, leds2.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds2.color.g, 0, 255, leds2.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds2.color.b, 0, 255, leds2.update, true); + EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds2.color.w, 0, 255, leds2.update, true); + EDIT_ITEM(uint8, MSG_NEO2_BRIGHTNESS, &leds2.color.i, 0, 255, leds2.update, true); + #endif END_MENU(); } #endif @@ -89,12 +121,20 @@ void menu_led() { BACK_ITEM(MSG_MAIN); #if ENABLED(LED_CONTROL_MENU) - bool led_on = leds.lights_on; - EDIT_ITEM(bool, MSG_LEDS, &led_on, leds.toggle); + editable.state = leds.lights_on; + EDIT_ITEM(bool, MSG_LEDS, &editable.state, leds.toggle); ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds.set_default); + #if ENABLED(NEOPIXEL2_SEPARATE) + editable.state = leds2.lights_on; + EDIT_ITEM(bool, MSG_LEDS2, &editable.state, leds2.toggle); + ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds2.set_default); + #endif #if ENABLED(LED_COLOR_PRESETS) SUBMENU(MSG_LED_PRESETS, menu_led_presets); #endif + #if ENABLED(NEO2_COLOR_PRESETS) + SUBMENU(MSG_NEO2_PRESETS, menu_leds2_presets); + #endif SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom); #endif From a4bc9e669c291f78f64ab4022f448eb594988448 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 6 Sep 2020 22:04:20 -0300 Subject: [PATCH 471/483] STM32F1 EP with USB_COMPOSITE (#19281) --- Marlin/src/HAL/STM32F1/msc_sd.cpp | 18 +++++++++++++++++- Marlin/src/HAL/STM32F1/msc_sd.h | 20 +++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index ab5530174e3b..6a4652e467fb 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -21,7 +21,7 @@ #define PRODUCT_ID 0x29 USBMassStorage MarlinMSC; -USBCompositeSerial MarlinCompositeSerial; +MarlinUSBCompositeSerial MarlinCompositeSerial; #include "../../inc/MarlinConfig.h" @@ -38,6 +38,17 @@ USBCompositeSerial MarlinCompositeSerial; #endif +#if ENABLED(EMERGENCY_PARSER) + void (*real_rx_callback)(void); + + void my_rx_callback(void) { + real_rx_callback(); + int len = MarlinCompositeSerial.available(); + while (len-- > 0) // >0 because available() may return a negative value + emergency_parser.update(MarlinCompositeSerial.emergency_state, MarlinCompositeSerial.peek()); + } +#endif + void MSC_SD_init() { USBComposite.setProductId(PRODUCT_ID); // Just set MarlinCompositeSerial enabled to true @@ -59,6 +70,11 @@ void MSC_SD_init() { // Register composite Serial MarlinCompositeSerial.registerComponent(); USBComposite.begin(); + #if ENABLED(EMERGENCY_PARSER) + //rx is usbSerialPart.endpoints[2] + real_rx_callback = usbSerialPart.endpoints[2].callback; + usbSerialPart.endpoints[2].callback = my_rx_callback; + #endif } #endif // USE_USB_COMPOSITE diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h index 8715888f474c..d9cdbe6bb3d1 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.h +++ b/Marlin/src/HAL/STM32F1/msc_sd.h @@ -17,7 +17,25 @@ #include +#include "../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +class MarlinUSBCompositeSerial : public USBCompositeSerial { +public: + MarlinUSBCompositeSerial() : USBCompositeSerial() + #if ENABLED(EMERGENCY_PARSER) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { } + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif +}; + extern USBMassStorage MarlinMSC; -extern USBCompositeSerial MarlinCompositeSerial; +extern MarlinUSBCompositeSerial MarlinCompositeSerial; void MSC_SD_init(); From ef1d154a4ad28296fd7f51395795c33ad5d1ab0a Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 6 Sep 2020 18:10:25 -0700 Subject: [PATCH 472/483] Adjust GTR PeripheralPins to avoid timer conflicts (#19183) --- .../variants/BIGTREE_GTR_V1/PeripheralPins.c | 101 ++++++++++-------- .../variants/BIGTREE_GTR_V1/variant.h | 4 +- 2 files changed, 56 insertions(+), 49 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c index 4014a519a305..db0a439562a6 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c @@ -125,38 +125,62 @@ const PinMap PinMap_I2C_SCL[] = { #ifdef HAL_TIM_MODULE_ENABLED const PinMap PinMap_PWM[] = { + + // Some pins can perform PWM from more than one timer. These were selected to utilize as many channels as + // possible from timers which were already dedicated to PWM output. + // TIM1 = [FAN4, FAN5, HEATER6, FAN7] + // TIM2 = [, HEATER1, BED, ] + // TIM3 = [, , HEATER2, HEATER0] + // TIM4 = [HEATER5, HEATER4, , HEATER3] + // TIM8 = [FAN3, HEATER7, FAN2, FAN6] + // TIM9 = [FAN0, FAN1, , ] + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 HEATER0 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 HEATER1 + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 HEATER1 {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 HEATER2 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 BED - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN0 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN2 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 EXTENSION1-4 - {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 BL-TOUCH-SERVO - - // These pins have been defined for something else on the board but they MIGHT be - // used by the user as PWM pins if they aren't used for their primary purpose. + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 HEATER3 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 HEATER4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 HEATER5 + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 HEATER6 + {PI_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 HEATER7 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BED + + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN0 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN1 + {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN2 + {PI_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 FAN3 + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 FAN4 + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 FAN5 + {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 FAN6 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 FAN7 + + + // Alternate timer assignments for pins commonly using PWM + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N HEATER0 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N HEATER0 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 HEATER1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N HEATER2 + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N HEATER2 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 BED + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 BED + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 FAN2 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 FAN6 + + // Pins with an available timer channel, on a timer already allocated for PWM. + // These can be freely used for purposes requiring PWM, without creating new timer conflicts. + // This pins are very likely already used for other purposes and enabling PWM on them won't be useful. + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 BLTouch / Probe Output {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 ESP8266 connector. Available if 8266 isn't used {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 ESP8266 connector. Available if 8266 isn't used - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 I2C connector, SDA pin. Available if I2C isn't used. - // TIM5_CH1 is used by the Servo Library - {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 BL-TOUCH port. Available if Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - /** - * Unused by specifications on SKR-Pro. + /* + * Pins not utilizing hardware PWM on the GTR. * Uncomment the corresponding line if you want to have HardwarePWM on some pins. * WARNING: check timers' usage first to avoid conflicts. * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) - * If you alter this section DO NOT report bugs to Marlin team since they are most likely caused by you. Thank you. */ //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 BLTOUCH is a "servo" - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BLTOUCH is a "servo" - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 @@ -173,20 +197,16 @@ const PinMap PinMap_PWM[] = { //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N @@ -197,30 +217,17 @@ const PinMap PinMap_PWM[] = { //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - #endif - #if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - {PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - {PI_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - {PI_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - #endif + //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 {NC, NP, 0} }; #endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h index 1ba0a18d6af6..2da195c6cff0 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h @@ -255,8 +255,8 @@ extern "C" { // Timer Definitions //Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c -#define TIMER_TONE TIM2 -#define TIMER_SERVO TIM5 // Only 1 Servo PIN on SKR-PRO, so use the same timer as defined in PeripheralPins +#define TIMER_TONE TIM10 +#define TIMER_SERVO TIM5 #define TIMER_SERIAL TIM7 // UART Definitions From b709baba7a437559ab285f0ed9c5c4da8e54606d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 6 Sep 2020 22:51:53 -0500 Subject: [PATCH 473/483] Whitespace cleanup --- Marlin/src/feature/leds/leds.cpp | 4 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 2 +- .../ftdi_eve_lib/extended/dl_cache.cpp | 10 +- .../ftdi_eve_lib/extended/dl_cache.h | 2 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h | 2 +- .../variants/megaextendedpins/pins_arduino.h | 428 +++++++++--------- 7 files changed, 227 insertions(+), 225 deletions(-) diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index 28a6814b4397..ef9099fb2093 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -183,14 +183,14 @@ void LEDLights::set_color(const LEDColor &incol : neo2.Color(incol.r, incol.g, incol.b, incol.w); neo2.set_brightness(incol.i); neo2.set_color(neocolor); - + #if ENABLED(LED_CONTROL_MENU) // Don't update the color when OFF lights_on = !incol.is_off(); if (lights_on) color = incol; #endif } - + #if ENABLED(LED_CONTROL_MENU) void LEDLights2::toggle() { if (lights_on) set_off(); else update(); } #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 1de962826a8c..9b54dbdd2ba2 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -413,7 +413,7 @@ void AnycubicTFTClass::RenderCurrentFileList() { uint16_t selectedNumber = 0; SelectedDirectory[0] = 0; SelectedFile[0] = 0; - ExtUI::FileList currentFileList; + ExtUI::FileList currentFileList; SENDLINE_PGM("FN "); // Filelist start diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp index 439541bd517a..f736916a3be4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -117,11 +117,12 @@ bool DLCache::store(uint32_t min_bytes /* = 0*/) { // If we are allocating new space... dl_slot_addr = CLCD::mem_read_32(DL_FREE_ADDR); dl_slot_size = max(dl_size, min_bytes); - + const uint32_t free_space = MAP::RAM_G_SIZE - dl_slot_addr; - if(dl_slot_size <= free_space) { + if (dl_slot_size <= free_space) { CLCD::mem_write_32(DL_FREE_ADDR, dl_slot_addr + dl_slot_size); - } else { + } + else { dl_slot_addr = 0; dl_slot_size = 0; dl_slot_used = 0; @@ -138,7 +139,8 @@ bool DLCache::store(uint32_t min_bytes /* = 0*/) { dl_slot_used = 0; save_slot(); return false; - } else { + } + else { #if ENABLED(TOUCH_UI_DEBUG) SERIAL_ECHO_START(); SERIAL_ECHOPAIR ("Saving DL to RAMG cache, bytes: ", dl_slot_used); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h index c4bb22fbd760..da927aeae23a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h @@ -51,7 +51,7 @@ class DLCache { void load_slot() {load_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} void save_slot() {save_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} - + static void load_slot(uint8_t indx, uint32_t &addr, uint16_t &size, uint16_t &used); static void save_slot(uint8_t indx, uint32_t addr, uint16_t size, uint16_t used); diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index cb3ab62cc25c..19b04c9e7c6f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -87,7 +87,7 @@ #define MOTOR_CURRENT_PWM_E_PIN PB0 #define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp #ifndef DEFAULT_PWM_MOTOR_CURRENT - #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } + #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } #endif // // Temperature Sensors @@ -180,7 +180,7 @@ #define TFT_DRIVER ILI9341 #define TFT_BUFFER_SIZE 14400 - + // YV for normal screen mounting #define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV // XV for 180° rotated screen mounting diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h index d54a7946161c..d66338b8ad32 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -293,7 +293,7 @@ #ifndef XPT2046_Y_OFFSET #define XPT2046_Y_OFFSET 349 #endif - + #define TFT_DRIVER ILI9488 #define TFT_BUFFER_SIZE 14400 #define ILI9488_ORIENTATION ILI9488_MADCTL_MX | ILI9488_MADCTL_MV diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h index 77d0beca9b9d..81f2ae3e19a1 100755 --- a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h +++ b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h @@ -160,77 +160,77 @@ const uint16_t PROGMEM port_to_input_PGM[] = { }; const uint8_t PROGMEM digital_pin_to_port_PGM[] = { - // PORTLIST - // ------------------------------------------- - PE , // PE 0 ** 0 ** USART0_RX - PE , // PE 1 ** 1 ** USART0_TX - PE , // PE 4 ** 2 ** PWM2 - PE , // PE 5 ** 3 ** PWM3 - PG , // PG 5 ** 4 ** PWM4 - PE , // PE 3 ** 5 ** PWM5 - PH , // PH 3 ** 6 ** PWM6 - PH , // PH 4 ** 7 ** PWM7 - PH , // PH 5 ** 8 ** PWM8 - PH , // PH 6 ** 9 ** PWM9 - PB , // PB 4 ** 10 ** PWM10 - PB , // PB 5 ** 11 ** PWM11 - PB , // PB 6 ** 12 ** PWM12 - PB , // PB 7 ** 13 ** PWM13 - PJ , // PJ 1 ** 14 ** USART3_TX - PJ , // PJ 0 ** 15 ** USART3_RX - PH , // PH 1 ** 16 ** USART2_TX - PH , // PH 0 ** 17 ** USART2_RX - PD , // PD 3 ** 18 ** USART1_TX - PD , // PD 2 ** 19 ** USART1_RX - PD , // PD 1 ** 20 ** I2C_SDA - PD , // PD 0 ** 21 ** I2C_SCL - PA , // PA 0 ** 22 ** D22 - PA , // PA 1 ** 23 ** D23 - PA , // PA 2 ** 24 ** D24 - PA , // PA 3 ** 25 ** D25 - PA , // PA 4 ** 26 ** D26 - PA , // PA 5 ** 27 ** D27 - PA , // PA 6 ** 28 ** D28 - PA , // PA 7 ** 29 ** D29 - PC , // PC 7 ** 30 ** D30 - PC , // PC 6 ** 31 ** D31 - PC , // PC 5 ** 32 ** D32 - PC , // PC 4 ** 33 ** D33 - PC , // PC 3 ** 34 ** D34 - PC , // PC 2 ** 35 ** D35 - PC , // PC 1 ** 36 ** D36 - PC , // PC 0 ** 37 ** D37 - PD , // PD 7 ** 38 ** D38 - PG , // PG 2 ** 39 ** D39 - PG , // PG 1 ** 40 ** D40 - PG , // PG 0 ** 41 ** D41 - PL , // PL 7 ** 42 ** D42 - PL , // PL 6 ** 43 ** D43 - PL , // PL 5 ** 44 ** D44 - PL , // PL 4 ** 45 ** D45 - PL , // PL 3 ** 46 ** D46 - PL , // PL 2 ** 47 ** D47 - PL , // PL 1 ** 48 ** D48 - PL , // PL 0 ** 49 ** D49 - PB , // PB 3 ** 50 ** SPI_MISO - PB , // PB 2 ** 51 ** SPI_MOSI - PB , // PB 1 ** 52 ** SPI_SCK - PB , // PB 0 ** 53 ** SPI_SS - PF , // PF 0 ** 54 ** A0 - PF , // PF 1 ** 55 ** A1 - PF , // PF 2 ** 56 ** A2 - PF , // PF 3 ** 57 ** A3 - PF , // PF 4 ** 58 ** A4 - PF , // PF 5 ** 59 ** A5 - PF , // PF 6 ** 60 ** A6 - PF , // PF 7 ** 61 ** A7 - PK , // PK 0 ** 62 ** A8 - PK , // PK 1 ** 63 ** A9 - PK , // PK 2 ** 64 ** A10 - PK , // PK 3 ** 65 ** A11 - PK , // PK 4 ** 66 ** A12 - PK , // PK 5 ** 67 ** A13 - PK , // PK 6 ** 68 ** A14 + // PORTLIST + // ------------------------------------------- + PE , // PE 0 ** 0 ** USART0_RX + PE , // PE 1 ** 1 ** USART0_TX + PE , // PE 4 ** 2 ** PWM2 + PE , // PE 5 ** 3 ** PWM3 + PG , // PG 5 ** 4 ** PWM4 + PE , // PE 3 ** 5 ** PWM5 + PH , // PH 3 ** 6 ** PWM6 + PH , // PH 4 ** 7 ** PWM7 + PH , // PH 5 ** 8 ** PWM8 + PH , // PH 6 ** 9 ** PWM9 + PB , // PB 4 ** 10 ** PWM10 + PB , // PB 5 ** 11 ** PWM11 + PB , // PB 6 ** 12 ** PWM12 + PB , // PB 7 ** 13 ** PWM13 + PJ , // PJ 1 ** 14 ** USART3_TX + PJ , // PJ 0 ** 15 ** USART3_RX + PH , // PH 1 ** 16 ** USART2_TX + PH , // PH 0 ** 17 ** USART2_RX + PD , // PD 3 ** 18 ** USART1_TX + PD , // PD 2 ** 19 ** USART1_RX + PD , // PD 1 ** 20 ** I2C_SDA + PD , // PD 0 ** 21 ** I2C_SCL + PA , // PA 0 ** 22 ** D22 + PA , // PA 1 ** 23 ** D23 + PA , // PA 2 ** 24 ** D24 + PA , // PA 3 ** 25 ** D25 + PA , // PA 4 ** 26 ** D26 + PA , // PA 5 ** 27 ** D27 + PA , // PA 6 ** 28 ** D28 + PA , // PA 7 ** 29 ** D29 + PC , // PC 7 ** 30 ** D30 + PC , // PC 6 ** 31 ** D31 + PC , // PC 5 ** 32 ** D32 + PC , // PC 4 ** 33 ** D33 + PC , // PC 3 ** 34 ** D34 + PC , // PC 2 ** 35 ** D35 + PC , // PC 1 ** 36 ** D36 + PC , // PC 0 ** 37 ** D37 + PD , // PD 7 ** 38 ** D38 + PG , // PG 2 ** 39 ** D39 + PG , // PG 1 ** 40 ** D40 + PG , // PG 0 ** 41 ** D41 + PL , // PL 7 ** 42 ** D42 + PL , // PL 6 ** 43 ** D43 + PL , // PL 5 ** 44 ** D44 + PL , // PL 4 ** 45 ** D45 + PL , // PL 3 ** 46 ** D46 + PL , // PL 2 ** 47 ** D47 + PL , // PL 1 ** 48 ** D48 + PL , // PL 0 ** 49 ** D49 + PB , // PB 3 ** 50 ** SPI_MISO + PB , // PB 2 ** 51 ** SPI_MOSI + PB , // PB 1 ** 52 ** SPI_SCK + PB , // PB 0 ** 53 ** SPI_SS + PF , // PF 0 ** 54 ** A0 + PF , // PF 1 ** 55 ** A1 + PF , // PF 2 ** 56 ** A2 + PF , // PF 3 ** 57 ** A3 + PF , // PF 4 ** 58 ** A4 + PF , // PF 5 ** 59 ** A5 + PF , // PF 6 ** 60 ** A6 + PF , // PF 7 ** 61 ** A7 + PK , // PK 0 ** 62 ** A8 + PK , // PK 1 ** 63 ** A9 + PK , // PK 2 ** 64 ** A10 + PK , // PK 3 ** 65 ** A11 + PK , // PK 4 ** 66 ** A12 + PK , // PK 5 ** 67 ** A13 + PK , // PK 6 ** 68 ** A14 PK , // PK 7 ** 69 ** A15 PG , // PG 4 ** 70 ** D70 PG , // PG 3 ** 71 ** D71 @@ -251,78 +251,78 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = { }; const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { - // PIN IN PORT - // ------------------------------------------- - _BV( 0 ) , // PE 0 ** 0 ** USART0_RX - _BV( 1 ) , // PE 1 ** 1 ** USART0_TX - _BV( 4 ) , // PE 4 ** 2 ** PWM2 - _BV( 5 ) , // PE 5 ** 3 ** PWM3 - _BV( 5 ) , // PG 5 ** 4 ** PWM4 - _BV( 3 ) , // PE 3 ** 5 ** PWM5 - _BV( 3 ) , // PH 3 ** 6 ** PWM6 - _BV( 4 ) , // PH 4 ** 7 ** PWM7 - _BV( 5 ) , // PH 5 ** 8 ** PWM8 - _BV( 6 ) , // PH 6 ** 9 ** PWM9 - _BV( 4 ) , // PB 4 ** 10 ** PWM10 - _BV( 5 ) , // PB 5 ** 11 ** PWM11 - _BV( 6 ) , // PB 6 ** 12 ** PWM12 - _BV( 7 ) , // PB 7 ** 13 ** PWM13 - _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX - _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX - _BV( 1 ) , // PH 1 ** 16 ** USART2_TX - _BV( 0 ) , // PH 0 ** 17 ** USART2_RX - _BV( 3 ) , // PD 3 ** 18 ** USART1_TX - _BV( 2 ) , // PD 2 ** 19 ** USART1_RX - _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA - _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL - _BV( 0 ) , // PA 0 ** 22 ** D22 - _BV( 1 ) , // PA 1 ** 23 ** D23 - _BV( 2 ) , // PA 2 ** 24 ** D24 - _BV( 3 ) , // PA 3 ** 25 ** D25 - _BV( 4 ) , // PA 4 ** 26 ** D26 - _BV( 5 ) , // PA 5 ** 27 ** D27 - _BV( 6 ) , // PA 6 ** 28 ** D28 - _BV( 7 ) , // PA 7 ** 29 ** D29 - _BV( 7 ) , // PC 7 ** 30 ** D30 - _BV( 6 ) , // PC 6 ** 31 ** D31 - _BV( 5 ) , // PC 5 ** 32 ** D32 - _BV( 4 ) , // PC 4 ** 33 ** D33 - _BV( 3 ) , // PC 3 ** 34 ** D34 - _BV( 2 ) , // PC 2 ** 35 ** D35 - _BV( 1 ) , // PC 1 ** 36 ** D36 - _BV( 0 ) , // PC 0 ** 37 ** D37 - _BV( 7 ) , // PD 7 ** 38 ** D38 - _BV( 2 ) , // PG 2 ** 39 ** D39 - _BV( 1 ) , // PG 1 ** 40 ** D40 - _BV( 0 ) , // PG 0 ** 41 ** D41 - _BV( 7 ) , // PL 7 ** 42 ** D42 - _BV( 6 ) , // PL 6 ** 43 ** D43 - _BV( 5 ) , // PL 5 ** 44 ** D44 - _BV( 4 ) , // PL 4 ** 45 ** D45 - _BV( 3 ) , // PL 3 ** 46 ** D46 - _BV( 2 ) , // PL 2 ** 47 ** D47 - _BV( 1 ) , // PL 1 ** 48 ** D48 - _BV( 0 ) , // PL 0 ** 49 ** D49 - _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO - _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI - _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK - _BV( 0 ) , // PB 0 ** 53 ** SPI_SS - _BV( 0 ) , // PF 0 ** 54 ** A0 - _BV( 1 ) , // PF 1 ** 55 ** A1 - _BV( 2 ) , // PF 2 ** 56 ** A2 - _BV( 3 ) , // PF 3 ** 57 ** A3 - _BV( 4 ) , // PF 4 ** 58 ** A4 - _BV( 5 ) , // PF 5 ** 59 ** A5 - _BV( 6 ) , // PF 6 ** 60 ** A6 - _BV( 7 ) , // PF 7 ** 61 ** A7 - _BV( 0 ) , // PK 0 ** 62 ** A8 - _BV( 1 ) , // PK 1 ** 63 ** A9 - _BV( 2 ) , // PK 2 ** 64 ** A10 - _BV( 3 ) , // PK 3 ** 65 ** A11 - _BV( 4 ) , // PK 4 ** 66 ** A12 - _BV( 5 ) , // PK 5 ** 67 ** A13 - _BV( 6 ) , // PK 6 ** 68 ** A14 - _BV( 7 ) , // PK 7 ** 69 ** A15 + // PIN IN PORT + // ------------------------------------------- + _BV( 0 ) , // PE 0 ** 0 ** USART0_RX + _BV( 1 ) , // PE 1 ** 1 ** USART0_TX + _BV( 4 ) , // PE 4 ** 2 ** PWM2 + _BV( 5 ) , // PE 5 ** 3 ** PWM3 + _BV( 5 ) , // PG 5 ** 4 ** PWM4 + _BV( 3 ) , // PE 3 ** 5 ** PWM5 + _BV( 3 ) , // PH 3 ** 6 ** PWM6 + _BV( 4 ) , // PH 4 ** 7 ** PWM7 + _BV( 5 ) , // PH 5 ** 8 ** PWM8 + _BV( 6 ) , // PH 6 ** 9 ** PWM9 + _BV( 4 ) , // PB 4 ** 10 ** PWM10 + _BV( 5 ) , // PB 5 ** 11 ** PWM11 + _BV( 6 ) , // PB 6 ** 12 ** PWM12 + _BV( 7 ) , // PB 7 ** 13 ** PWM13 + _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX + _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX + _BV( 1 ) , // PH 1 ** 16 ** USART2_TX + _BV( 0 ) , // PH 0 ** 17 ** USART2_RX + _BV( 3 ) , // PD 3 ** 18 ** USART1_TX + _BV( 2 ) , // PD 2 ** 19 ** USART1_RX + _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA + _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL + _BV( 0 ) , // PA 0 ** 22 ** D22 + _BV( 1 ) , // PA 1 ** 23 ** D23 + _BV( 2 ) , // PA 2 ** 24 ** D24 + _BV( 3 ) , // PA 3 ** 25 ** D25 + _BV( 4 ) , // PA 4 ** 26 ** D26 + _BV( 5 ) , // PA 5 ** 27 ** D27 + _BV( 6 ) , // PA 6 ** 28 ** D28 + _BV( 7 ) , // PA 7 ** 29 ** D29 + _BV( 7 ) , // PC 7 ** 30 ** D30 + _BV( 6 ) , // PC 6 ** 31 ** D31 + _BV( 5 ) , // PC 5 ** 32 ** D32 + _BV( 4 ) , // PC 4 ** 33 ** D33 + _BV( 3 ) , // PC 3 ** 34 ** D34 + _BV( 2 ) , // PC 2 ** 35 ** D35 + _BV( 1 ) , // PC 1 ** 36 ** D36 + _BV( 0 ) , // PC 0 ** 37 ** D37 + _BV( 7 ) , // PD 7 ** 38 ** D38 + _BV( 2 ) , // PG 2 ** 39 ** D39 + _BV( 1 ) , // PG 1 ** 40 ** D40 + _BV( 0 ) , // PG 0 ** 41 ** D41 + _BV( 7 ) , // PL 7 ** 42 ** D42 + _BV( 6 ) , // PL 6 ** 43 ** D43 + _BV( 5 ) , // PL 5 ** 44 ** D44 + _BV( 4 ) , // PL 4 ** 45 ** D45 + _BV( 3 ) , // PL 3 ** 46 ** D46 + _BV( 2 ) , // PL 2 ** 47 ** D47 + _BV( 1 ) , // PL 1 ** 48 ** D48 + _BV( 0 ) , // PL 0 ** 49 ** D49 + _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO + _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI + _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK + _BV( 0 ) , // PB 0 ** 53 ** SPI_SS + _BV( 0 ) , // PF 0 ** 54 ** A0 + _BV( 1 ) , // PF 1 ** 55 ** A1 + _BV( 2 ) , // PF 2 ** 56 ** A2 + _BV( 3 ) , // PF 3 ** 57 ** A3 + _BV( 4 ) , // PF 4 ** 58 ** A4 + _BV( 5 ) , // PF 5 ** 59 ** A5 + _BV( 6 ) , // PF 6 ** 60 ** A6 + _BV( 7 ) , // PF 7 ** 61 ** A7 + _BV( 0 ) , // PK 0 ** 62 ** A8 + _BV( 1 ) , // PK 1 ** 63 ** A9 + _BV( 2 ) , // PK 2 ** 64 ** A10 + _BV( 3 ) , // PK 3 ** 65 ** A11 + _BV( 4 ) , // PK 4 ** 66 ** A12 + _BV( 5 ) , // PK 5 ** 67 ** A13 + _BV( 6 ) , // PK 6 ** 68 ** A14 + _BV( 7 ) , // PK 7 ** 69 ** A15 _BV( 4 ) , // PG 4 ** 70 ** D70 _BV( 3 ) , // PG 3 ** 71 ** D71 _BV( 2 ) , // PJ 2 ** 72 ** D72 @@ -342,77 +342,77 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { }; const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { - // TIMERS - // ------------------------------------------- - NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX - NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX - TIMER3B , // PE 4 ** 2 ** PWM2 - TIMER3C , // PE 5 ** 3 ** PWM3 - TIMER0B , // PG 5 ** 4 ** PWM4 - TIMER3A , // PE 3 ** 5 ** PWM5 - TIMER4A , // PH 3 ** 6 ** PWM6 - TIMER4B , // PH 4 ** 7 ** PWM7 - TIMER4C , // PH 5 ** 8 ** PWM8 - TIMER2B , // PH 6 ** 9 ** PWM9 - TIMER2A , // PB 4 ** 10 ** PWM10 - TIMER1A , // PB 5 ** 11 ** PWM11 - TIMER1B , // PB 6 ** 12 ** PWM12 - TIMER0A , // PB 7 ** 13 ** PWM13 - NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX - NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX - NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX - NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX - NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX - NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX - NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA - NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL - NOT_ON_TIMER , // PA 0 ** 22 ** D22 - NOT_ON_TIMER , // PA 1 ** 23 ** D23 - NOT_ON_TIMER , // PA 2 ** 24 ** D24 - NOT_ON_TIMER , // PA 3 ** 25 ** D25 - NOT_ON_TIMER , // PA 4 ** 26 ** D26 - NOT_ON_TIMER , // PA 5 ** 27 ** D27 - NOT_ON_TIMER , // PA 6 ** 28 ** D28 - NOT_ON_TIMER , // PA 7 ** 29 ** D29 - NOT_ON_TIMER , // PC 7 ** 30 ** D30 - NOT_ON_TIMER , // PC 6 ** 31 ** D31 - NOT_ON_TIMER , // PC 5 ** 32 ** D32 - NOT_ON_TIMER , // PC 4 ** 33 ** D33 - NOT_ON_TIMER , // PC 3 ** 34 ** D34 - NOT_ON_TIMER , // PC 2 ** 35 ** D35 - NOT_ON_TIMER , // PC 1 ** 36 ** D36 - NOT_ON_TIMER , // PC 0 ** 37 ** D37 - NOT_ON_TIMER , // PD 7 ** 38 ** D38 - NOT_ON_TIMER , // PG 2 ** 39 ** D39 - NOT_ON_TIMER , // PG 1 ** 40 ** D40 - NOT_ON_TIMER , // PG 0 ** 41 ** D41 - NOT_ON_TIMER , // PL 7 ** 42 ** D42 - NOT_ON_TIMER , // PL 6 ** 43 ** D43 - TIMER5C , // PL 5 ** 44 ** D44 - TIMER5B , // PL 4 ** 45 ** D45 - TIMER5A , // PL 3 ** 46 ** D46 - NOT_ON_TIMER , // PL 2 ** 47 ** D47 - NOT_ON_TIMER , // PL 1 ** 48 ** D48 - NOT_ON_TIMER , // PL 0 ** 49 ** D49 - NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO - NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI - NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK - NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS - NOT_ON_TIMER , // PF 0 ** 54 ** A0 - NOT_ON_TIMER , // PF 1 ** 55 ** A1 - NOT_ON_TIMER , // PF 2 ** 56 ** A2 - NOT_ON_TIMER , // PF 3 ** 57 ** A3 - NOT_ON_TIMER , // PF 4 ** 58 ** A4 - NOT_ON_TIMER , // PF 5 ** 59 ** A5 - NOT_ON_TIMER , // PF 6 ** 60 ** A6 - NOT_ON_TIMER , // PF 7 ** 61 ** A7 - NOT_ON_TIMER , // PK 0 ** 62 ** A8 - NOT_ON_TIMER , // PK 1 ** 63 ** A9 - NOT_ON_TIMER , // PK 2 ** 64 ** A10 - NOT_ON_TIMER , // PK 3 ** 65 ** A11 - NOT_ON_TIMER , // PK 4 ** 66 ** A12 - NOT_ON_TIMER , // PK 5 ** 67 ** A13 - NOT_ON_TIMER , // PK 6 ** 68 ** A14 + // TIMERS + // ------------------------------------------- + NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX + NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX + TIMER3B , // PE 4 ** 2 ** PWM2 + TIMER3C , // PE 5 ** 3 ** PWM3 + TIMER0B , // PG 5 ** 4 ** PWM4 + TIMER3A , // PE 3 ** 5 ** PWM5 + TIMER4A , // PH 3 ** 6 ** PWM6 + TIMER4B , // PH 4 ** 7 ** PWM7 + TIMER4C , // PH 5 ** 8 ** PWM8 + TIMER2B , // PH 6 ** 9 ** PWM9 + TIMER2A , // PB 4 ** 10 ** PWM10 + TIMER1A , // PB 5 ** 11 ** PWM11 + TIMER1B , // PB 6 ** 12 ** PWM12 + TIMER0A , // PB 7 ** 13 ** PWM13 + NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX + NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX + NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX + NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX + NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX + NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX + NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA + NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL + NOT_ON_TIMER , // PA 0 ** 22 ** D22 + NOT_ON_TIMER , // PA 1 ** 23 ** D23 + NOT_ON_TIMER , // PA 2 ** 24 ** D24 + NOT_ON_TIMER , // PA 3 ** 25 ** D25 + NOT_ON_TIMER , // PA 4 ** 26 ** D26 + NOT_ON_TIMER , // PA 5 ** 27 ** D27 + NOT_ON_TIMER , // PA 6 ** 28 ** D28 + NOT_ON_TIMER , // PA 7 ** 29 ** D29 + NOT_ON_TIMER , // PC 7 ** 30 ** D30 + NOT_ON_TIMER , // PC 6 ** 31 ** D31 + NOT_ON_TIMER , // PC 5 ** 32 ** D32 + NOT_ON_TIMER , // PC 4 ** 33 ** D33 + NOT_ON_TIMER , // PC 3 ** 34 ** D34 + NOT_ON_TIMER , // PC 2 ** 35 ** D35 + NOT_ON_TIMER , // PC 1 ** 36 ** D36 + NOT_ON_TIMER , // PC 0 ** 37 ** D37 + NOT_ON_TIMER , // PD 7 ** 38 ** D38 + NOT_ON_TIMER , // PG 2 ** 39 ** D39 + NOT_ON_TIMER , // PG 1 ** 40 ** D40 + NOT_ON_TIMER , // PG 0 ** 41 ** D41 + NOT_ON_TIMER , // PL 7 ** 42 ** D42 + NOT_ON_TIMER , // PL 6 ** 43 ** D43 + TIMER5C , // PL 5 ** 44 ** D44 + TIMER5B , // PL 4 ** 45 ** D45 + TIMER5A , // PL 3 ** 46 ** D46 + NOT_ON_TIMER , // PL 2 ** 47 ** D47 + NOT_ON_TIMER , // PL 1 ** 48 ** D48 + NOT_ON_TIMER , // PL 0 ** 49 ** D49 + NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO + NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI + NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK + NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS + NOT_ON_TIMER , // PF 0 ** 54 ** A0 + NOT_ON_TIMER , // PF 1 ** 55 ** A1 + NOT_ON_TIMER , // PF 2 ** 56 ** A2 + NOT_ON_TIMER , // PF 3 ** 57 ** A3 + NOT_ON_TIMER , // PF 4 ** 58 ** A4 + NOT_ON_TIMER , // PF 5 ** 59 ** A5 + NOT_ON_TIMER , // PF 6 ** 60 ** A6 + NOT_ON_TIMER , // PF 7 ** 61 ** A7 + NOT_ON_TIMER , // PK 0 ** 62 ** A8 + NOT_ON_TIMER , // PK 1 ** 63 ** A9 + NOT_ON_TIMER , // PK 2 ** 64 ** A10 + NOT_ON_TIMER , // PK 3 ** 65 ** A11 + NOT_ON_TIMER , // PK 4 ** 66 ** A12 + NOT_ON_TIMER , // PK 5 ** 67 ** A13 + NOT_ON_TIMER , // PK 6 ** 68 ** A14 NOT_ON_TIMER , // PK 7 ** 69 ** A15 NOT_ON_TIMER , // PG 4 ** 70 ** D70 NOT_ON_TIMER , // PG 3 ** 71 ** D71 From a445746a8b6dd752de725eb67d264153c3b393d7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 6 Sep 2020 21:40:58 -0500 Subject: [PATCH 474/483] Clean up LCD conditionals, DWIN --- Marlin/src/MarlinCore.cpp | 4 +- Marlin/src/feature/power_monitor.h | 4 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 28 +++- Marlin/src/inc/Conditionals_post.h | 4 +- Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp | 2 +- Marlin/src/lcd/dwin/dwin_lcd.cpp | 28 +--- Marlin/src/lcd/dwin/dwin_lcd.h | 139 ++++++++++++++---- Marlin/src/lcd/dwin/{ => e3v2}/README.md | 0 Marlin/src/lcd/dwin/{ => e3v2}/dwin.cpp | 40 ++--- Marlin/src/lcd/dwin/{ => e3v2}/dwin.h | 4 +- .../lcd/dwin/{ => e3v2}/rotary_encoder.cpp | 8 +- .../src/lcd/dwin/{ => e3v2}/rotary_encoder.h | 4 +- Marlin/src/lcd/lcdprint.h | 2 +- Marlin/src/lcd/ultralcd.h | 24 +-- Marlin/src/module/settings.cpp | 2 +- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 27 ++-- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 14 +- Marlin/src/pins/mega/pins_MEGATRONICS.h | 2 +- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 9 +- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 2 +- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 11 +- Marlin/src/pins/sam/pins_ARCHIM2.h | 8 +- Marlin/src/pins/sam/pins_DUE3DOM.h | 2 +- Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 2 +- Marlin/src/pins/sam/pins_RADDS.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 2 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 2 +- Marlin/src/pins/sanguino/pins_ANET_10.h | 2 +- Marlin/src/pins/teensy2/pins_PRINTRBOARD.h | 2 +- Marlin/src/pins/teensy2/pins_TEENSYLU.h | 2 +- Marlin/src/sd/cardreader.cpp | 2 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 32 ++-- 35 files changed, 253 insertions(+), 169 deletions(-) rename Marlin/src/lcd/dwin/{ => e3v2}/README.md (100%) rename Marlin/src/lcd/dwin/{ => e3v2}/dwin.cpp (99%) rename Marlin/src/lcd/dwin/{ => e3v2}/dwin.h (99%) rename Marlin/src/lcd/dwin/{ => e3v2}/rotary_encoder.cpp (98%) rename Marlin/src/lcd/dwin/{ => e3v2}/rotary_encoder.h (97%) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e703eaf8d999..89791c90820b 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -72,9 +72,9 @@ #endif #if ENABLED(DWIN_CREALITY_LCD) - #include "lcd/dwin/dwin.h" + #include "lcd/dwin/e3v2/dwin.h" #include "lcd/dwin/dwin_lcd.h" - #include "lcd/dwin/rotary_encoder.h" + #include "lcd/dwin/e3v2/rotary_encoder.h" #endif #if ENABLED(IIC_BL24CXX_EEPROM) diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h index ca52ed74c6bc..a86bd07ec4d1 100644 --- a/Marlin/src/feature/power_monitor.h +++ b/Marlin/src/feature/power_monitor.h @@ -89,7 +89,9 @@ class PowerMonitor { #endif #if HAS_SPI_LCD - FORCE_INLINE static bool display_enabled() { return flags != 0x00; } + #if HAS_GRAPHICAL_LCD && DISABLED(LIGHTWEIGHT_UI) + FORCE_INLINE static bool display_enabled() { return flags != 0x00; } + #endif #if ENABLED(POWER_MONITOR_CURRENT) static void draw_current(); FORCE_INLINE static bool current_display_enabled() { return TEST(flags, PM_DISP_BIT_I); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index e7651cc74394..9bb1ebe23819 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -61,7 +61,7 @@ #endif #if ENABLED(DWIN_CREALITY_LCD) - #include "../../../lcd/dwin/dwin.h" + #include "../../../lcd/dwin/e3v2/dwin.h" #endif #if HAS_MULTI_HOTEND diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 0e1f70789814..be222a7b1724 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -47,7 +47,7 @@ #include "../../lcd/ultralcd.h" #if ENABLED(DWIN_CREALITY_LCD) - #include "../../lcd/dwin/dwin.h" + #include "../../lcd/dwin/e3v2/dwin.h" #endif #if HAS_L64XX // set L6470 absolute position registers to counts diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 112ff93a0e0e..d5ef62b621b6 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -26,6 +26,7 @@ * Conditionals that need to be set before Configuration_adv.h or pins.h */ +// Kinematics #if ENABLED(MORGAN_SCARA) #define IS_SCARA 1 #define IS_KINEMATIC 1 @@ -35,10 +36,26 @@ #define IS_CARTESIAN 1 #endif +// MKS_LCD12864 is a variant of MKS_MINI_12864 #if ENABLED(MKS_LCD12864) #define MKS_MINI_12864 #endif +/** + * General Flags that may be set below by specific LCDs + * + * DOGLCD : Run a Graphical LCD through U8GLib (with MarlinUI) + * IS_ULTIPANEL : Define LCD_PINS_D5/6/7 for direct-connected "Ultipanel" LCDs + * IS_ULTRA_LCD : Ultra LCD, not necessarily Ultipanel. Used most often with NEWPANEL. + * IS_RRD_SC : Common RRD Smart Controller digital interface pins + * IS_RRD_FG_SC : Common RRD Full Graphical Smart Controller digital interface pins + * U8GLIB_ST7920 : Most common DOGM display SPI interface, supporting a "lightweight" display mode. + * U8GLIB_SH1106 : SH1106 OLED with I2C interface via U8GLib + * IS_U8GLIB_SSD1306 : SSD1306 OLED with I2C interface via U8GLib + * U8GLIB_SSD1309 : SSD1309 OLED with I2C interface via U8GLib + * U8GLIB_ST7565_64128N : ST7565 128x64 LCD with SPI interface via U8GLib + * U8GLIB_LM6059_AF : LM6059 with Hardware SPI via U8GLib + */ #if EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define MINIPANEL @@ -48,6 +65,11 @@ #define DOGLCD #define IS_ULTIPANEL +#elif EITHER(DWIN_MARLINUI_PORTRAIT, DWIN_MARLINUI_LANDSCAPE) + + #define IS_DWIN_MARLINUI 1 + #define IS_ULTIPANEL + #elif ENABLED(ZONESTAR_LCD) #define ADC_KEYPAD @@ -85,7 +107,6 @@ #elif ANY(miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864) - #define IS_ULTRA_LCD #define DOGLCD #define IS_ULTIPANEL @@ -234,9 +255,9 @@ // 128x64 I2C OLED LCDs - SSD1306/SSD1309/SH1106 #if ANY(U8GLIB_SSD1306, U8GLIB_SSD1309, U8GLIB_SH1106) - #define HAS_SSD1306_OLED_I2C 1 + #define HAS_U8GLIB_I2C_OLED 1 #endif -#if HAS_SSD1306_OLED_I2C +#if HAS_U8GLIB_I2C_OLED #define IS_ULTRA_LCD #define DOGLCD #endif @@ -402,7 +423,6 @@ #define IS_ULTRA_LCD #define NEWPANEL #endif - #if ENABLED(IS_ULTRA_LCD) #define ULTRA_LCD #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 71ae4bb28539..89dc73fb5c61 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2612,14 +2612,14 @@ #ifndef LCD_WIDTH #if HAS_GRAPHICAL_LCD #define LCD_WIDTH 21 - #else + #elif HAS_CHARACTER_LCD #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) #endif #endif #ifndef LCD_HEIGHT #if HAS_GRAPHICAL_LCD #define LCD_HEIGHT 5 - #else + #elif HAS_CHARACTER_LCD #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) #endif #endif diff --git a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp index 9ba9b871ecca..9fe69d442832 100644 --- a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp +++ b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp @@ -982,7 +982,7 @@ int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { if (max_length < 1) return 0; - // TODO: fix the '\\' that doesnt exist in the HD44870 + // TODO: fix the '\\' that doesn't exist in the HD44870 if (c < 128) { lcd.write((uint8_t)c); return 1; diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index b3d969cc8c01..3b30629a8dae 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -37,6 +37,9 @@ #include "dwin_lcd.h" #include // for memset +//#define DEBUG_OUT 1 +#include "../../core/debug_out.h" + // Make sure DWIN_SendBuf is large enough to hold the largest string plus draw command and tail. // Assume the narrowest (6 pixel) font and 2-byte gb2312-encoded characters. uint8_t DWIN_SendBuf[11 + DWIN_WIDTH / 6 * 2] = { 0xAA }; @@ -79,10 +82,8 @@ inline void DWIN_String(size_t &i, const __FlashStringHelper * string) { // Send the data in the buffer and the packet end inline void DWIN_Send(size_t &i) { ++i; - LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); - delayMicroseconds(1); } - LOOP_L_N(n, 4) { MYSERIAL1.write(DWIN_BufTail[n]); - delayMicroseconds(1); } + LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); delayMicroseconds(1); } + LOOP_L_N(n, 4) { MYSERIAL1.write(DWIN_BufTail[n]); delayMicroseconds(1); } } /*-------------------------------------- System variable function --------------------------------------*/ @@ -185,7 +186,6 @@ void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, DWIN_Send(i); } -// // Move a screen area // mode: 0, circle shift; 1, translation // dir: 0=left, 1=right, 2=up, 3=down @@ -230,19 +230,6 @@ void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, DWIN_Send(i); } -void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, - uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const __FlashStringHelper *string) { - size_t i = 0; - DWIN_Byte(i, 0x11); - DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); - DWIN_Word(i, color); - DWIN_Word(i, bColor); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_String(i, string); - DWIN_Send(i); -} - // Draw a positive integer // bShow: true=display background color; false=don't display background color // zeroFill: true=zero fill; false=no zero fill @@ -343,8 +330,9 @@ void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { DWIN_Send(i); } -// Unzip the JPG picture to virtual display area #1 -// id: picture ID +// Unzip the JPG picture to a virtual display area +// n: Cache index +// id: Picture ID void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { size_t i = 0; DWIN_Byte(i, 0x25); diff --git a/Marlin/src/lcd/dwin/dwin_lcd.h b/Marlin/src/lcd/dwin/dwin_lcd.h index 3fae1ccfc91a..0893974e4c3f 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.h +++ b/Marlin/src/lcd/dwin/dwin_lcd.h @@ -42,70 +42,151 @@ #define DWIN_WIDTH 272 #define DWIN_HEIGHT 480 -/*接收数æ®è§£æž 返回值:true,接收到数æ®;false,未接收到数æ®*/ -bool DWIN_ReceiveAnalyze(void); +/*-------------------------------------- System variable function --------------------------------------*/ -/*å‘é€å½“å‰BUF中的数æ®ä»¥åŠåŒ…å°¾æ•°æ® len:整包数æ®é•¿åº¦*/ -void DWIN_Send_BufTail(const uint8_t len); - -/*----------------------------------------------系统å˜é‡å‡½æ•°----------------------------------------------*/ -/*æ¡æ‰‹ 1: æ¡æ‰‹æˆåŠŸ 2: æ¡æ‰‹å¤±è´¥*/ +// Handshake (1: Success, 0: Fail) bool DWIN_Handshake(void); -/*设定背光亮度 luminance:亮度(0x00~0xFF)*/ +// Common DWIN startup +void DWIN_Startup(void); + +// Set the backlight luminance +// luminance: (0x00-0xFF) void DWIN_Backlight_SetLuminance(const uint8_t luminance); -/*设定画é¢æ˜¾ç¤ºæ–¹å‘ dir:0,0°; 1,90°; 2,180°; 3,270°*/ +// Set screen display direction +// dir: 0=0°, 1=90°, 2=180°, 3=270° void DWIN_Frame_SetDir(uint8_t dir); -/*更新显示*/ +// Update display void DWIN_UpdateLCD(void); -/*----------------------------------------------绘图相关函数----------------------------------------------*/ -/*ç”»é¢æ¸…å± color:清å±é¢œè‰²*/ +/*---------------------------------------- Drawing functions ----------------------------------------*/ + +// Clear screen +// color: Clear screen color void DWIN_Frame_Clear(const uint16_t color); -/*ç”»é¢ç”»çº¿ color:线段颜色 xStart:X起始åæ ‡ yStart:Y起始åæ ‡ xEnd:X终止åæ ‡ yEnd:Y终止åæ ‡*/ +// Draw a line +// color: Line segment color +// xStart/yStart: Start point +// xEnd/yEnd: End point void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); -/*ç”»é¢ç”»çŸ©å½¢ mode:0,外框;1,å¡«å……;2,异或填充 color:颜色 xStart/yStart:矩形左上åæ ‡ xEnd/yEnd:矩形å³ä¸‹åæ ‡*/ +// Draw a Horizontal line +// color: Line segment color +// xStart/yStart: Start point +// xLength: Line Length +inline void DWIN_Draw_HLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xLength) { + DWIN_Draw_Line(color, xStart, yStart, xStart + xLength - 1, yStart); +} + +// Draw a Vertical line +// color: Line segment color +// xStart/yStart: Start point +// yLength: Line Length +inline void DWIN_Draw_VLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t yLength) { + DWIN_Draw_Line(color, xStart, yStart, xStart, yStart + yLength - 1); +} + +// Draw a rectangle +// mode: 0=frame, 1=fill, 2=XOR fill +// color: Rectangle color +// xStart/yStart: upper left point +// xEnd/yEnd: lower right point void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); -/*ç”»é¢åŒºåŸŸç§»åŠ¨ mode:0,环移;1,平移 dir:0,å‘左移动;1,å‘å³ç§»åŠ¨;2,å‘上移动;3,å‘下移动 dis:移动è·ç¦» - color:填充颜色 xStart/yStart:选定区域左上åæ ‡ xEnd/yEnd:选定区域å³ä¸‹åæ ‡*/ +// Draw a box +// mode: 0=frame, 1=fill, 2=XOR fill +// color: Rectangle color +// xStart/yStart: upper left point +// xSize/ySize: box size +inline void DWIN_Draw_Box(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xSize, uint16_t ySize) { + DWIN_Draw_Rectangle(mode, color, xStart, yStart, xStart + xSize - 1, yStart + ySize - 1); +} + +// Move a screen area +// mode: 0, circle shift; 1, translation +// dir: 0=left, 1=right, 2=up, 3=down +// dis: Distance +// color: Fill color +// xStart/yStart: upper left point +// xEnd/yEnd: bottom right point void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); -/*----------------------------------------------文本相关函数----------------------------------------------*/ -/*ç”»é¢æ˜¾ç¤ºå­—符串 widthAdjust:true,自调整字符宽度;false,ä¸è°ƒæ•´å­—符宽度 bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 x/y:字符串左上åæ ‡ *string:字符串*/ +/*---------------------------------------- Text related functions ----------------------------------------*/ + +// Draw a string +// widthAdjust: true=self-adjust character width; false=no adjustment +// bShow: true=display background color; false=don't display background color +// size: Font size +// color: Character color +// bColor: Background color +// x/y: Upper-left coordinate of the string +// *string: The string void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, char *string); -/*ç”»é¢æ˜¾ç¤ºæ­£æ•´æ•° bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² zeroFill:true,补零;false,ä¸è¡¥é›¶ zeroMode:1,无效0显示为0; 0,无效0显示为空格 size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 iNum:ä½æ•° x/y:å˜é‡å·¦ä¸Šåæ ‡ value:æ•´åž‹å˜é‡*/ +class __FlashStringHelper; + +inline void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const __FlashStringHelper *title) { + DWIN_Draw_String(widthAdjust, bShow, size, color, bColor, x, y, (char *)title); +} + +// Draw a positive integer +// bShow: true=display background color; false=don't display background color +// zeroFill: true=zero fill; false=no zero fill +// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space +// size: Font size +// color: Character color +// bColor: Background color +// iNum: Number of digits +// x/y: Upper-left coordinate +// value: Integer value void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint16_t value); -/*ç”»é¢æ˜¾ç¤ºæµ®ç‚¹æ•° bShow:true,显示背景色;false,ä¸æ˜¾ç¤ºèƒŒæ™¯è‰² zeroFill:true,补零;false,ä¸è¡¥é›¶ zeroMode:1,无效0显示为0; 0,无效0显示为空格 size:å­—å·å¤§å° - color:字符颜色 bColor:背景颜色 iNum:æ•´æ•°ä½æ•° fNum:å°æ•°ä½æ•° x/y:å˜é‡å·¦ä¸Šåæ ‡ value:浮点数å˜é‡*/ +// Draw a floating point number +// bShow: true=display background color; false=don't display background color +// zeroFill: true=zero fill; false=no zero fill +// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space +// size: Font size +// color: Character color +// bColor: Background color +// iNum: Number of whole digits +// fNum: Number of decimal digits +// x/y: Upper-left point +// value: Float value void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); -/*----------------------------------------------图片相关函数----------------------------------------------*/ -/*jpg图片显示并缓存在#0虚拟显示区 id:图片ID*/ +/*---------------------------------------- Picture related functions ----------------------------------------*/ + +// Draw JPG and cached in #0 virtual display area +// id: Picture ID void DWIN_JPG_ShowAndCache(const uint8_t id); -/*图标显示 libID:图标库ID picID:图标ID x/y:图标左上åæ ‡*/ +// Draw an Icon +// libID: Icon library ID +// picID: Icon ID +// x/y: Upper-left point void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y); -/*jpg图片解压到#1虚拟显示区 id:图片ID*/ +// Unzip the JPG picture to a virtual display area +// n: Cache index +// id: Picture ID void DWIN_JPG_CacheToN(uint8_t n, uint8_t id); -/*jpg图片解压到#1虚拟显示区 id:图片ID*/ +// Unzip the JPG picture to virtual display area #1 +// id: Picture ID inline void DWIN_JPG_CacheTo1(uint8_t id) { DWIN_JPG_CacheToN(1, id); } -/*从虚拟显示区å¤åˆ¶åŒºåŸŸè‡³å½“å‰ç”»é¢ cacheID:è™šæ‹ŸåŒºå· xStart/yStart:虚拟区左上åæ ‡ xEnd/yEnd:虚拟区å³ä¸‹åæ ‡ x/y:当å‰ç”»é¢ç²˜è´´åæ ‡*/ +// Copy area from virtual display area to current screen +// cacheID: virtual area number +// xStart/yStart: Upper-left of virtual area +// xEnd/yEnd: Lower-right of virtual area +// x/y: Screen paste point void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y); diff --git a/Marlin/src/lcd/dwin/README.md b/Marlin/src/lcd/dwin/e3v2/README.md similarity index 100% rename from Marlin/src/lcd/dwin/README.md rename to Marlin/src/lcd/dwin/e3v2/README.md diff --git a/Marlin/src/lcd/dwin/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp similarity index 99% rename from Marlin/src/lcd/dwin/dwin.cpp rename to Marlin/src/lcd/dwin/e3v2/dwin.cpp index 6bc0d74f23d8..1d9c83e6da8a 100644 --- a/Marlin/src/lcd/dwin/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -24,7 +24,7 @@ * DWIN by Creality3D */ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if ENABLED(DWIN_CREALITY_LCD) @@ -38,35 +38,35 @@ #include #include -#include "../fontutils.h" -#include "../ultralcd.h" +#include "../../fontutils.h" +#include "../../ultralcd.h" -#include "../../sd/cardreader.h" +#include "../../../sd/cardreader.h" -#include "../../MarlinCore.h" -#include "../../core/serial.h" -#include "../../core/macros.h" -#include "../../gcode/queue.h" +#include "../../../MarlinCore.h" +#include "../../../core/serial.h" +#include "../../../core/macros.h" +#include "../../../gcode/queue.h" -#include "../../feature/powerloss.h" -#include "../../feature/babystep.h" +#include "../../../feature/powerloss.h" +#include "../../../feature/babystep.h" -#include "../../module/settings.h" -#include "../../module/temperature.h" -#include "../../module/printcounter.h" -#include "../../module/motion.h" -#include "../../module/planner.h" +#include "../../../module/settings.h" +#include "../../../module/temperature.h" +#include "../../../module/printcounter.h" +#include "../../../module/motion.h" +#include "../../../module/planner.h" #if ENABLED(HOST_ACTION_COMMANDS) - #include "../../feature/host_actions.h" + #include "../../../feature/host_actions.h" #endif #if HAS_ONESTEP_LEVELING - #include "../../feature/bedlevel/bedlevel.h" + #include "../../../feature/bedlevel/bedlevel.h" #endif #if HAS_BED_PROBE - #include "../../module/probe.h" + #include "../../../module/probe.h" #endif #ifndef MACHINE_SIZE @@ -1532,7 +1532,7 @@ void update_variable(void) { #define strcasecmp_P(a, b) strcasecmp((a), (b)) #endif -inline void make_name_without_ext(char *dst, char *src, int maxlen=MENU_CHAR_LIMIT) { +inline void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_LIMIT) { char * const name = card.longest_filename(); size_t pos = strlen(name); // index of ending nul @@ -2137,7 +2137,7 @@ inline void Draw_Move_Menu() { LOOP_L_N(i, MROWS) Draw_Menu_Line(i + 1, ICON_MoveX + i); } -#include "../../libs/buzzer.h" +#include "../../../libs/buzzer.h" void HMI_AudioFeedback(const bool success=true) { if (success) { diff --git a/Marlin/src/lcd/dwin/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h similarity index 99% rename from Marlin/src/lcd/dwin/dwin.h rename to Marlin/src/lcd/dwin/e3v2/dwin.h index 3446a0d4c18e..dffd40bd03fb 100644 --- a/Marlin/src/lcd/dwin/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -25,9 +25,9 @@ * DWIN by Creality3D */ -#include "dwin_lcd.h" +#include "../dwin_lcd.h" #include "rotary_encoder.h" -#include "../../libs/BL24CXX.h" +#include "../../../libs/BL24CXX.h" #include diff --git a/Marlin/src/lcd/dwin/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp similarity index 98% rename from Marlin/src/lcd/dwin/rotary_encoder.cpp rename to Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp index 62e2cda35126..e4c563cf6b98 100644 --- a/Marlin/src/lcd/dwin/rotary_encoder.cpp +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp @@ -30,17 +30,17 @@ ****************************************************************************** **/ -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if ENABLED(DWIN_CREALITY_LCD) #include "rotary_encoder.h" -#include "../../MarlinCore.h" -#include "../../HAL/shared/Delay.h" +#include "../../../MarlinCore.h" +#include "../../../HAL/shared/Delay.h" #if HAS_BUZZER - #include "../../libs/buzzer.h" + #include "../../../libs/buzzer.h" #endif #include diff --git a/Marlin/src/lcd/dwin/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h similarity index 97% rename from Marlin/src/lcd/dwin/rotary_encoder.h rename to Marlin/src/lcd/dwin/e3v2/rotary_encoder.h index 5c5a8f86a29b..db074098ebf1 100644 --- a/Marlin/src/lcd/dwin/rotary_encoder.h +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h @@ -31,8 +31,8 @@ ****************************************************************************** **/ -#include "../../inc/MarlinConfig.h" -#include "../../MarlinCore.h" +#include "../../../inc/MarlinConfig.h" +#include "../../../MarlinCore.h" /*********************** Encoder Set ***********************/ diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 031d467bf947..8ea174bd65fc 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -79,7 +79,7 @@ #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) -#else +#elif HAS_CHARACTER_LCD #define _UxGT(a) a typedef uint8_t lcd_uint_t; diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index d6a9f31e6c77..0200d39014c1 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -312,16 +312,18 @@ class MarlinUI { static void media_changed(const uint8_t old_stat, const uint8_t stat); #endif + #if ENABLED(DWIN_CREALITY_LCD) + static void refresh(); + #else + FORCE_INLINE static void refresh() { + TERN_(HAS_SPI_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW)); + } + #endif + #if HAS_SPI_LCD static bool detected(); static void init_lcd(); - FORCE_INLINE static void refresh() { refresh(LCDVIEW_CLEAR_CALL_REDRAW); } #else - #if ENABLED(DWIN_CREALITY_LCD) - static void refresh(); - #else - static inline void refresh() {} - #endif static inline bool detected() { return true; } static inline void init_lcd() {} #endif @@ -403,14 +405,10 @@ class MarlinUI { #if HAS_GRAPHICAL_LCD - static bool drawing_screen, first_page; - static void set_font(const MarlinFont font_nr); #else - static constexpr bool drawing_screen = false, first_page = true; - static void set_custom_characters(const HD44780CharSet screen_charset=CHARSET_INFO); #if ENABLED(LCD_PROGRESS_BAR) @@ -460,6 +458,12 @@ class MarlinUI { #endif + #if HAS_GRAPHICAL_LCD + static bool drawing_screen, first_page; + #else + static constexpr bool drawing_screen = false, first_page = true; + #endif + static bool get_blink(); static void kill_screen(PGM_P const lcd_error, PGM_P const lcd_component); static void draw_kill_screen(); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d5f41a324664..8af2071e3600 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -52,7 +52,7 @@ #include "temperature.h" #if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/dwin.h" + #include "../lcd/dwin/e3v2/dwin.h" #endif #include "../lcd/ultralcd.h" diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index b162173bc606..6b22c50a7b14 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -37,7 +37,7 @@ #include "../lcd/ultralcd.h" #if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/dwin.h" + #include "../lcd/dwin/e3v2/dwin.h" #endif #if ENABLED(EXTENSIBLE_UI) diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index c89807227892..54f3dfd95c16 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -289,20 +289,21 @@ #define E0_CS_PIN P2_11 #define E1_CS_PIN P4_28 -// Hardware SPI is on EXP2. See if you can make it work: -// https://github.com/makerbase-mks/MKS-SBASE/issues/25 -#define TMC_USE_SW_SPI -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P0_03 // AUX1 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P0_02 // AUX1 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P0_26 // TH4 + // Hardware SPI is on EXP2. See if you can make it work: + // https://github.com/makerbase-mks/MKS-SBASE/issues/25 + #define TMC_USE_SW_SPI + #if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P0_03 // AUX1 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P0_02 // AUX1 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P0_26 // TH4 + #endif #endif - #endif + #endif #if MB(MKS_SBASE) && HAS_TMC_UART diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 67482b3a496f..de148995cacb 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -125,16 +125,16 @@ // EXP1 Pins #define BEEPER_PIN P1_31 // EXP1 Pin 1 #define BTN_ENC P1_30 // EXP1 Pin 2 - #define LCD_PINS_ENABLE P0_18 // EXP1 Pin 3 (MOSI) - #define LCD_PINS_RS P0_16 // EXP1 Pin 4 (CS) + #define LCD_PINS_ENABLE P0_18 // EXP1 Pin 3 (MOSI) + #define LCD_PINS_RS P0_16 // EXP1 Pin 4 (CS) #define LCD_PINS_D4 P0_15 // EXP1 Pin 5 (SCK) - // EXP2 Pins + // EXP2 Pins #define BTN_EN2 P3_26 // EXP2 Pin 3 #define BTN_EN1 P3_25 // EXP2 Pin 5 - + /* SD Support - + For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be hooked up to the onboard SDCard SPI and use a spare pin for the SDCS. Also note that an external SDCard sharing the SPI port with the @@ -145,11 +145,11 @@ */ #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) - #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) + #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) - + #else #error "Marlin's Smoothieboard support cannot drive your LCD." #endif diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index 84346e5f6696..2d98256fe71f 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -124,7 +124,7 @@ #define SD_DETECT_PIN -1 // RAMPS doesn't use this -#endif // HAS_SPI_LCD && NEWPANEL +#endif // ULTRA_LCD && NEWPANEL // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index 0df977a05bbd..672c37241464 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -166,11 +166,11 @@ // // LCD / Controller // -#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL || ENABLED(TOUCH_UI_FTDI_EVE) +#if ANY(HAS_SPI_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #define KILL_PIN 32 - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL || ENABLED(TOUCH_UI_FTDI_EVE) + #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS 85 @@ -194,5 +194,6 @@ #define SD_DETECT_PIN 15 - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_SPI_LCD + #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE + +#endif // HAS_SPI_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index f89bba2d7ff1..0c14d9f46b29 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -189,4 +189,4 @@ #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_SPI_LCD +#endif // HAS_SPI_LCD || TOUCH_UI_ULTIPANEL diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index 7cd81456b17d..4d08ed784d68 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -144,17 +144,16 @@ // LCD / Controller // #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCD_PINS_RS 18 #define LCD_PINS_ENABLE 15 #define LCD_PINS_D4 19 #define BEEPER_PIN 64 + #undef UI_VOLTAGE_LEVEL + #define UI_VOLTAGE_LEVEL 1 +#endif +#if ENABLED(NEWPANEL) #define BTN_EN1 14 #define BTN_EN2 16 #define BTN_ENC 17 - - #undef UI_VOLTAGE_LEVEL - #define UI_VOLTAGE_LEVEL 1 - -#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +#endif diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h index bbd4804dbd50..b527b511835f 100644 --- a/Marlin/src/pins/sam/pins_ARCHIM2.h +++ b/Marlin/src/pins/sam/pins_ARCHIM2.h @@ -237,7 +237,7 @@ // // LCD / Controller // -#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL || ENABLED(TOUCH_UI_FTDI_EVE) +#if ANY(HAS_SPI_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) #define BEEPER_PIN 23 // D24 PA15_CTS1 #define LCD_PINS_RS 17 // D17 PA12_RXD1 #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 @@ -248,10 +248,10 @@ #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL || ENABLED(TOUCH_UI_FTDI_EVE) + #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) // Buttons on AUX-2 #define BTN_EN1 60 // D60 PA3_TIOB1 #define BTN_EN2 13 // D13 PB27_TIOB0 #define BTN_ENC 16 // D16 PA13_TXD1 // the click - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_SPI_LCD + #endif +#endif diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index e0a56137f730..260a2810f5e8 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -147,7 +147,7 @@ #define SDSS 4 #define SD_DETECT_PIN 14 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BTN_EN1 50 #define BTN_EN2 52 diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 9a488e312682..946cadcfa943 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -139,7 +139,7 @@ #define SDSS 4 #define SD_DETECT_PIN 14 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BTN_EN1 50 #define BTN_EN2 52 diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index a0192aadb6f4..bbbfb2e55826 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -266,7 +266,7 @@ #define SDSS 10 #define SD_DETECT_PIN 14 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BTN_EN1 50 #define BTN_EN2 52 diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index dd490e38933a..3ecd64aa8aee 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -221,7 +221,7 @@ #define LCD_PINS_RS 52 #define LCD_PINS_ENABLE 53 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BEEPER_PIN 62 #define LCD_SDSS 10 diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 8a6287fb659f..2b52338d35ca 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -207,7 +207,7 @@ #define LCD_PINS_RS 52 #define LCD_PINS_ENABLE 53 - #elif HAS_SSD1306_OLED_I2C + #elif HAS_U8GLIB_I2C_OLED #define BEEPER_PIN 62 #define LCD_SDSS 10 diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index a2ef1e2c17dd..6830192f319b 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -163,7 +163,7 @@ #define LCD_PINS_D6 16 #define LCD_PINS_D7 17 #define ADC_KEYPAD_PIN 1 - #elif EITHER(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD) + #elif EITHER(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index 51080b2fd19f..7d96bd12ff9c 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -166,4 +166,4 @@ #endif -#endif // HAS_SPI_LCD && NEWPANEL +#endif // ULTRA_LCD && NEWPANEL diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index 8ee07a427d8c..c69a1c06a785 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -155,7 +155,7 @@ #define SD_DETECT_PIN -1 -#endif // HAS_SPI_LCD && NEWPANEL +#endif // ULTRA_LCD && NEWPANEL // // M3/M4/M5 - Spindle/Laser Control diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index f8f1bf18e662..538fca3c881f 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -32,7 +32,7 @@ #include "../lcd/ultralcd.h" #if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/dwin.h" + #include "../lcd/dwin/e3v2/dwin.h" #endif #include "../module/planner.h" // for synchronize diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index 78f338fdae0c..a097df510523 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -94,9 +94,7 @@ static_assert(USB_INTR_PIN != -1, "USB_INTR_PIN must be defined"); #include "Sd2Card_FlashDrive.h" -#if HAS_DISPLAY - #include "../../lcd/ultralcd.h" -#endif +#include "../../lcd/ultralcd.h" static enum { UNINITIALIZED, @@ -116,9 +114,7 @@ bool Sd2Card::usbStartup() { SERIAL_ECHOPGM("Starting USB host..."); if (!UHS_START) { SERIAL_ECHOLNPGM(" failed."); - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - LCD_MESSAGEPGM(MSG_MEDIA_USB_FAILED); - #endif + LCD_MESSAGEPGM(MSG_MEDIA_USB_FAILED); return false; } @@ -213,9 +209,7 @@ void Sd2Card::idle() { #if USB_DEBUG >= 1 SERIAL_ECHOLNPGM("Waiting for media"); #endif - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - LCD_MESSAGEPGM(MSG_MEDIA_WAITING); - #endif + LCD_MESSAGEPGM(MSG_MEDIA_WAITING); GOTO_STATE_AFTER_DELAY(state, 2000); } break; @@ -229,11 +223,9 @@ void Sd2Card::idle() { #if USB_DEBUG >= 1 SERIAL_ECHOLNPGM("USB device removed"); #endif - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - if (state != MEDIA_READY) - LCD_MESSAGEPGM(MSG_MEDIA_USB_REMOVED); - #endif - GOTO_STATE_AFTER_DELAY( WAIT_FOR_DEVICE, 0 ); + if (state != MEDIA_READY) + LCD_MESSAGEPGM(MSG_MEDIA_USB_REMOVED); + GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0); } else if (state > WAIT_FOR_LUN && !bulk.LUNIsGood(0)) { @@ -241,17 +233,13 @@ void Sd2Card::idle() { #if USB_DEBUG >= 1 SERIAL_ECHOLNPGM("Media removed"); #endif - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - LCD_MESSAGEPGM(MSG_MEDIA_REMOVED); - #endif - GOTO_STATE_AFTER_DELAY( WAIT_FOR_DEVICE, 0 ); + LCD_MESSAGEPGM(MSG_MEDIA_REMOVED); + GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0); } else if (task_state == UHS_STATE(ERROR)) { - #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - LCD_MESSAGEPGM(MSG_MEDIA_READ_ERROR); - #endif - GOTO_STATE_AFTER_DELAY( MEDIA_ERROR, 0 ); + LCD_MESSAGEPGM(MSG_MEDIA_READ_ERROR); + GOTO_STATE_AFTER_DELAY(MEDIA_ERROR, 0); } } } From d3f1f3533d4d0f4d0ce62f30b02909ebd9f3c69b Mon Sep 17 00:00:00 2001 From: Zachary Annand Date: Mon, 7 Sep 2020 02:59:31 -0500 Subject: [PATCH 475/483] Separate Neopixel followup (#19287) --- Marlin/src/inc/SanityCheck.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 0c79ead37387..9d051941841e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2126,8 +2126,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if ENABLED(NEOPIXEL_LED) #if !PIN_EXISTS(NEOPIXEL) || NEOPIXEL_PIXELS == 0 #error "NEOPIXEL_LED requires NEOPIXEL_PIN and NEOPIXEL_PIXELS." - #elif ENABLED(NEOPIXEL2_SEPARATE) && !(NEOPIXEL2_TYPE && PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) - #error "NEOPIXEL2_SEPARATE requires NEOPIXEL2_PIN, NEOPIXEL2_TYPE and NEOPIXEL2_PIXELS." + #elif ENABLED(NEOPIXEL2_SEPARATE) && !(defined(NEOPIXEL2_TYPE) && PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) + #error "NEOPIXEL2_SEPARATE requires NEOPIXEL2_TYPE, NEOPIXEL2_PIN and NEOPIXEL2_PIXELS." #elif ENABLED(NEO2_COLOR_PRESETS) && DISABLED(NEOPIXEL2_SEPARATE) #error "NEO2_COLOR_PRESETS requires NEOPIXEL2_SEPARATE to be enabled." #endif From bb017038d4594eb1f36d78f9784260d41498dd43 Mon Sep 17 00:00:00 2001 From: Kadah Date: Mon, 7 Sep 2020 01:15:42 -0700 Subject: [PATCH 476/483] Fix M166 Gradient Mix for DELTA (#19285) --- Marlin/src/feature/mixing.cpp | 7 ++++++- Marlin/src/gcode/feature/mixing/M166.cpp | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index 7de4eb79ea67..b002e9808adc 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -180,7 +180,12 @@ void Mixer::refresh_collector(const float proportion/*=1.0*/, const uint8_t t/*= } void Mixer::update_gradient_for_planner_z() { - update_gradient_for_z(planner.get_axis_position_mm(Z_AXIS)); + #if ENABLED(DELTA) + get_cartesian_from_steppers(); + update_gradient_for_z(cartes.z); + #else + update_gradient_for_z(planner.get_axis_position_mm(Z_AXIS)); + #endif } #endif // GRADIENT_MIX diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp index 5f2c4f042a56..9e071a47ec27 100644 --- a/Marlin/src/gcode/feature/mixing/M166.cpp +++ b/Marlin/src/gcode/feature/mixing/M166.cpp @@ -86,7 +86,14 @@ void GcodeSuite::M166() { echo_zt(mixer.gradient.end_vtool, mixer.gradient.end_z); mixer.update_mix_from_gradient(); - SERIAL_ECHOPAIR(" ; Current Z", planner.get_axis_position_mm(Z_AXIS)); + + SERIAL_ECHOPGM(" ; Current Z"); + #if ENABLED(DELTA) + get_cartesian_from_steppers(); + SERIAL_ECHO(cartes.z); + #else + SERIAL_ECHO(planner.get_axis_position_mm(Z_AXIS)); + #endif echo_mix(); } From 4268d86da18ce8ffffc8236e0895fd2f3ba7f95d Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 7 Sep 2020 05:17:35 -0300 Subject: [PATCH 477/483] Sanity-check BABYSTEP_DISPLAY_TOTAL with ColorUI (#19284) --- Marlin/src/inc/SanityCheck.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9d051941841e..775899febb16 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -789,6 +789,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(BABYSTEP_XY) static_assert(BABYSTEP_MULTIPLICATOR_XY <= 0.25f, "BABYSTEP_MULTIPLICATOR_XY must be less than or equal to 0.25mm."); #endif + #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) && ANY(TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI) + #error "New Color UI (TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI) does not support BABYSTEP_DISPLAY_TOTAL yet." #endif #endif From 5c3140811d499caad9376b1316b7a1f12f64b335 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 7 Sep 2020 15:07:53 -0700 Subject: [PATCH 478/483] TFT is neither "graphical" nor "character" (#19297) --- Marlin/src/inc/Conditionals_post.h | 4 ++-- Marlin/src/lcd/lcdprint.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 89dc73fb5c61..71ae4bb28539 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2612,14 +2612,14 @@ #ifndef LCD_WIDTH #if HAS_GRAPHICAL_LCD #define LCD_WIDTH 21 - #elif HAS_CHARACTER_LCD + #else #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) #endif #endif #ifndef LCD_HEIGHT #if HAS_GRAPHICAL_LCD #define LCD_HEIGHT 5 - #elif HAS_CHARACTER_LCD + #else #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) #endif #endif diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 8ea174bd65fc..031d467bf947 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -79,7 +79,7 @@ #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) -#elif HAS_CHARACTER_LCD +#else #define _UxGT(a) a typedef uint8_t lcd_uint_t; From d1d8417a6127ea5b2a2bc4fea087f73197a2a4ee Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 8 Sep 2020 00:12:45 +0000 Subject: [PATCH 479/483] [cron] Bump distribution date (2020-09-08) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 14d019088c8f..1d14b8e086bd 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-09-07" + #define STRING_DISTRIBUTION_DATE "2020-09-08" #endif /** From 828a582f4dfc719dbb519b89cccf621a5184d2a1 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 8 Sep 2020 04:29:45 +0200 Subject: [PATCH 480/483] Make M600 heat up the nozzle. Reset runout on fail. (#19298) Co-authored-by: Scott Lahteine --- Marlin/src/feature/pause.cpp | 58 ++++++++++++++++++++----- Marlin/src/feature/pause.h | 2 + Marlin/src/gcode/feature/pause/M600.cpp | 7 +++ Marlin/src/module/temperature.h | 2 +- 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index a7ed93425cf1..4089e2b87b05 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -29,6 +29,8 @@ #if ENABLED(ADVANCED_PAUSE_FEATURE) +//#define DEBUG_PAUSE_RESUME + #include "../MarlinCore.h" #include "../gcode/gcode.h" #include "../module/motion.h" @@ -62,6 +64,9 @@ #include "../libs/nozzle.h" #include "pause.h" +#define DEBUG_OUT ENABLED(DEBUG_PAUSE_RESUME) +#include "../core/debug_out.h" + // private: static xyze_pos_t resume_position; @@ -120,25 +125,32 @@ fil_change_settings_t fc_settings[EXTRUDERS]; * Returns 'true' if heating was completed, 'false' for abort */ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=PAUSE_MODE_SAME) { + DEBUG_SECTION(est, "ensure_safe_temperature", true); + DEBUG_ECHOLNPAIR("... wait:", int(wait), " mode:", int(mode)); - #if ENABLED(PREVENT_COLD_EXTRUSION) - if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) { - SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD); - return false; - } - #endif + if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder); #if HAS_LCD_MENU lcd_pause_show_message(PAUSE_MESSAGE_HEATING, mode); - #else - UNUSED(mode); #endif + UNUSED(mode); if (wait) return thermalManager.wait_for_hotend(active_extruder); - while (ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW) + wait_for_heatup = true; // Allow interruption by Emergency Parser M108 + while (wait_for_heatup && ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW) idle(); + wait_for_heatup = false; + + #if ENABLED(PREVENT_COLD_EXTRUSION) + // A user can cancel wait-for-heating with M108 + if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) { + SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD); + return false; + } + #endif return true; } @@ -160,7 +172,10 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ DXC_ARGS ) { - TERN(HAS_LCD_MENU,,UNUSED(show_lcd)); + DEBUG_SECTION(lf, "load_filament", true); + DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " showlcd:", int(show_lcd), " pauseforuser:", int(pause_for_user), " pausemode:", int(mode) DXC_SAY); + + UNUSED(show_lcd); if (!ensure_safe_temperature(false, mode)) { #if HAS_LCD_MENU @@ -292,7 +307,14 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, , const float &mix_multiplier/*=1.0*/ #endif ) { - TERN(HAS_LCD_MENU,,UNUSED(show_lcd)); + DEBUG_SECTION(uf, "unload_filament", true); + DEBUG_ECHOLNPAIR("... unloadlen:", unload_length, " showlcd:", int(show_lcd), " mode:", int(mode) + #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) + , " mixmult:", mix_multiplier + #endif + ); + + UNUSED(show_lcd); #if !BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) constexpr float mix_multiplier = 1.0; @@ -358,7 +380,10 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, uint8_t did_pause_print = 0; bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { - TERN(HAS_LCD_MENU,,UNUSED(show_lcd)); + DEBUG_SECTION(pp, "pause_print", true); + DEBUG_ECHOLNPAIR("... retract:", retract, " park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", int(show_lcd) DXC_SAY); + + UNUSED(show_lcd); if (did_pause_print) return false; // already paused @@ -449,12 +474,18 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float */ void show_continue_prompt(const bool is_reload) { + DEBUG_SECTION(scp, "pause_print", true); + DEBUG_ECHOLNPAIR("... is_reload:", int(is_reload)); + TERN_(HAS_LCD_MENU, lcd_pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING)); SERIAL_ECHO_START(); serialprintPGM(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); } void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) { + DEBUG_SECTION(wfc, "wait_for_confirmation", true); + DEBUG_ECHOLNPAIR("... is_reload:", is_reload, " maxbeep:", int(max_beep_count) DXC_SAY); + bool nozzle_timed_out = false; show_continue_prompt(is_reload); @@ -551,6 +582,9 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep * - Resume the current SD print job, if any */ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, int16_t targetTemp/*=0*/ DXC_ARGS) { + DEBUG_SECTION(rp, "resume_print", true); + DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " targetTemp:", targetTemp DXC_SAY); + /* SERIAL_ECHOLNPAIR( "start of resume_print()\ndual_x_carriage_mode:", dual_x_carriage_mode, diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index d8a676afa479..016b0ce3f7d9 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -77,10 +77,12 @@ extern uint8_t did_pause_print; #define DXC_PARAMS , const int8_t DXC_ext=-1 #define DXC_ARGS , const int8_t DXC_ext #define DXC_PASS , DXC_ext + #define DXC_SAY , " dxc:", int(DXC_ext) #else #define DXC_PARAMS #define DXC_ARGS #define DXC_PASS + #define DXC_SAY #endif bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length=0, const bool show_lcd=false DXC_PARAMS); diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 673c7387ef98..b78608f7aee7 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -45,6 +45,10 @@ #include "../../../feature/mixing.h" #endif +#if HAS_FILAMENT_SENSOR + #include "../../../feature/runout.h" +#endif + /** * M600: Pause for filament change * @@ -158,6 +162,9 @@ void GcodeSuite::M600() { beep_count, (parser.seenval('R') ? parser.value_celsius() : 0) DXC_PASS); #endif } + else { + TERN_(HAS_FILAMENT_SENSOR, runout.reset()); + } #if EXTRUDERS > 1 // Restore toolhead if it was changed diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 94eb42fd0fcd..4d3efceafd75 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -330,7 +330,7 @@ class Temperature { #if ENABLED(PREVENT_COLD_EXTRUSION) static bool allow_cold_extrude; static int16_t extrude_min_temp; - FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp; } + FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } FORCE_INLINE static bool tooColdToExtrude(const uint8_t E_NAME) { return tooCold(degHotend(HOTEND_INDEX)); } From 4fc1aba8482920bcd5905f26642cec0de314ea09 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Mon, 7 Sep 2020 19:41:48 -0700 Subject: [PATCH 481/483] Update HAL/STM32 platform to 8.0 (#18496) --- .github/workflows/test-builds.yml | 1 + Marlin/Makefile | 2 +- Marlin/src/HAL/STM32/SoftwareSerial.cpp | 396 ------------------ Marlin/src/HAL/STM32/SoftwareSerial.h | 114 ----- Marlin/src/HAL/STM32/timers.cpp | 130 ++++-- Marlin/src/HAL/STM32/timers.h | 22 +- Marlin/src/core/boards.h | 2 +- Marlin/src/pins/pins.h | 2 +- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 2 +- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 2 +- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 11 +- buildroot/share/PlatformIO/boards/LERDGE.json | 3 +- .../share/PlatformIO/boards/malyanM200v2.json | 2 +- .../{fysetc_s6.json => marlin_fysetc_s6.json} | 4 +- .../PlatformIO/scripts/fysetc_STM32S6.py | 33 -- .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../{FYSETC_S6 => MARLIN_FYSETC_S6}/variant.h | 2 +- buildroot/tests/STM32F070CB_malyan-tests | 15 + platformio.ini | 68 ++- 23 files changed, 180 insertions(+), 633 deletions(-) delete mode 100644 Marlin/src/HAL/STM32/SoftwareSerial.cpp delete mode 100644 Marlin/src/HAL/STM32/SoftwareSerial.h rename buildroot/share/PlatformIO/boards/{fysetc_s6.json => marlin_fysetc_s6.json} (94%) delete mode 100644 buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{FYSETC_S6 => MARLIN_FYSETC_S6}/variant.h (99%) create mode 100644 buildroot/tests/STM32F070CB_malyan-tests diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index fdb81fbdc9d2..35cd920adff8 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -70,6 +70,7 @@ jobs: - mks_robin_stm32 - ARMED - FYSETC_S6 + - STM32F070CB_malyan - STM32F070RB_malyan - malyan_M300 - mks_robin_lite diff --git a/Marlin/Makefile b/Marlin/Makefile index 95135ab594d9..5ab0d1eefd11 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -694,7 +694,7 @@ ifeq ($(HARDWARE_VARIANT), Teensy) LIB_CXXSRC += usb_api.cpp else ifeq ($(HARDWARE_VARIANT), archim) - CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT="Archim"' + CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"' LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp PluggableUSB.cpp USBCore.cpp LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c diff --git a/Marlin/src/HAL/STM32/SoftwareSerial.cpp b/Marlin/src/HAL/STM32/SoftwareSerial.cpp deleted file mode 100644 index 2228a177be66..000000000000 --- a/Marlin/src/HAL/STM32/SoftwareSerial.cpp +++ /dev/null @@ -1,396 +0,0 @@ -/* - * SoftwareSerial.cpp (formerly NewSoftSerial.cpp) - * - * Multi-instance software serial library for Arduino/Wiring - * -- Interrupt-driven receive and other improvements by ladyada - * - * -- Tuning, circular buffer, derivation from class Print/Stream, - * multi-instance support, porting to 8MHz processors, - * various optimizations, PROGMEM delay tables, inverse logic and - * direct port writing by Mikal Hart - * -- Pin change interrupt macros by Paul Stoffregen - * -- 20MHz processor support by Garrett Mace - * -- ATmega1280/2560 support by Brett Hagman - * -- STM32 support by Armin van der Togt - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * The latest version of this library can always be found at - * http://arduiniana.org. - */ - -// -// Includes -// -#if defined(PLATFORMIO) && defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -#include "SoftwareSerial.h" - -#define OVERSAMPLE 3 // in RX, Timer will generate interruption OVERSAMPLE time during a bit. Thus OVERSAMPLE ticks in a bit. (interrupt not synchonized with edge). - -// defined in bit-periods -#define HALFDUPLEX_SWITCH_DELAY 5 -// It's best to define TIMER_SERIAL in variant.h. If not defined, we choose one here -// The order is based on (lack of) features and compare channels, we choose the simplest available -// because we only need an update interrupt -#if !defined(TIMER_SERIAL) -#if defined(TIM18_BASE) -#define TIMER_SERIAL TIM18 -#elif defined(TIM7_BASE) -#define TIMER_SERIAL TIM7 -#elif defined(TIM6_BASE) -#define TIMER_SERIAL TIM6 -#elif defined(TIM22_BASE) -#define TIMER_SERIAL TIM22 -#elif defined(TIM21_BASE) -#define TIMER_SERIAL TIM21 -#elif defined(TIM17_BASE) -#define TIMER_SERIAL TIM17 -#elif defined(TIM16_BASE) -#define TIMER_SERIAL TIM16 -#elif defined(TIM15_BASE) -#define TIMER_SERIAL TIM15 -#elif defined(TIM14_BASE) -#define TIMER_SERIAL TIM14 -#elif defined(TIM13_BASE) -#define TIMER_SERIAL TIM13 -#elif defined(TIM11_BASE) -#define TIMER_SERIAL TIM11 -#elif defined(TIM10_BASE) -#define TIMER_SERIAL TIM10 -#elif defined(TIM12_BASE) -#define TIMER_SERIAL TIM12 -#elif defined(TIM19_BASE) -#define TIMER_SERIAL TIM19 -#elif defined(TIM9_BASE) -#define TIMER_SERIAL TIM9 -#elif defined(TIM5_BASE) -#define TIMER_SERIAL TIM5 -#elif defined(TIM4_BASE) -#define TIMER_SERIAL TIM4 -#elif defined(TIM3_BASE) -#define TIMER_SERIAL TIM3 -#elif defined(TIM2_BASE) -#define TIMER_SERIAL TIM2 -#elif defined(TIM20_BASE) -#define TIMER_SERIAL TIM20 -#elif defined(TIM8_BASE) -#define TIMER_SERIAL TIM8 -#elif defined(TIM1_BASE) -#define TIMER_SERIAL TIM1 -#else -#error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h -#endif -#endif -// -// Statics -// -HardwareTimer SoftwareSerial::timer(TIMER_SERIAL); -const IRQn_Type SoftwareSerial::timer_interrupt_number = static_cast(getTimerUpIrq(TIMER_SERIAL)); -uint32_t SoftwareSerial::timer_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO); -SoftwareSerial *SoftwareSerial::active_listener = nullptr; -SoftwareSerial *volatile SoftwareSerial::active_out = nullptr; -SoftwareSerial *volatile SoftwareSerial::active_in = nullptr; -int32_t SoftwareSerial::tx_tick_cnt = 0; // OVERSAMPLE ticks needed for a bit -int32_t volatile SoftwareSerial::rx_tick_cnt = 0; // OVERSAMPLE ticks needed for a bit -uint32_t SoftwareSerial::tx_buffer = 0; -int32_t SoftwareSerial::tx_bit_cnt = 0; -uint32_t SoftwareSerial::rx_buffer = 0; -int32_t SoftwareSerial::rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit -uint32_t SoftwareSerial::cur_speed = 0; - -void SoftwareSerial::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { - timer_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority); -} - -// -// Private methods -// - -void SoftwareSerial::setSpeed(uint32_t speed) { - if (speed != cur_speed) { - timer.pause(); - if (speed != 0) { - // Disable the timer - uint32_t clock_rate, cmp_value; - // Get timer clock - clock_rate = timer.getTimerClkFreq(); - int pre = 1; - // Calculate prescale an compare value - do { - cmp_value = clock_rate / (speed * OVERSAMPLE); - if (cmp_value >= UINT16_MAX) { - clock_rate /= 2; - pre *= 2; - } - } while (cmp_value >= UINT16_MAX); - timer.setPrescaleFactor(pre); - timer.setOverflow(cmp_value); - timer.setCount(0); - timer.attachInterrupt(&handleInterrupt); - timer.resume(); - NVIC_SetPriority(timer_interrupt_number, timer_interrupt_priority); - } - else - timer.detachInterrupt(); - cur_speed = speed; - } -} - -// This function sets the current object as the "listening" -// one and returns true if it replaces another -bool SoftwareSerial::listen() { - if (active_listener != this) { - // wait for any transmit to complete as we may change speed - while (active_out); - active_listener->stopListening(); - rx_tick_cnt = 1; // 1 : next interrupt will decrease rx_tick_cnt to 0 which means RX pin level will be considered. - rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit - setSpeed(_speed); - active_listener = this; - if (!_half_duplex) active_in = this; - return true; - } - return false; -} - -// Stop listening. Returns true if we were actually listening. -bool SoftwareSerial::stopListening() { - if (active_listener == this) { - // wait for any output to complete - while (active_out); - if (_half_duplex) setRXTX(false); - active_listener = nullptr; - active_in = nullptr; - // turn off ints - setSpeed(0); - return true; - } - return false; -} - -inline void SoftwareSerial::setTX() { - if (_inverse_logic) - LL_GPIO_ResetOutputPin(_transmitPinPort, _transmitPinNumber); - else - LL_GPIO_SetOutputPin(_transmitPinPort, _transmitPinNumber); - pinMode(_transmitPin, OUTPUT); -} - -inline void SoftwareSerial::setRX() { - pinMode(_receivePin, _inverse_logic ? INPUT_PULLDOWN : INPUT_PULLUP); // pullup for normal logic! -} - -inline void SoftwareSerial::setRXTX(bool input) { - if (_half_duplex) { - if (input) { - if (active_in != this) { - setRX(); - rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit - rx_tick_cnt = 2; // 2 : next interrupt will be discarded. 2 interrupts required to consider RX pin level - active_in = this; - } - } - else { - if (active_in == this) { - setTX(); - active_in = nullptr; - } - } - } -} - -inline void SoftwareSerial::send() { - if (--tx_tick_cnt <= 0) { // if tx_tick_cnt > 0 interrupt is discarded. Only when tx_tick_cnt reaches 0 is TX pin set. - if (tx_bit_cnt++ < 10) { // tx_bit_cnt < 10 transmission is not finished (10 = 1 start +8 bits + 1 stop) - // Send data (including start and stop bits) - if (tx_buffer & 1) - LL_GPIO_SetOutputPin(_transmitPinPort, _transmitPinNumber); - else - LL_GPIO_ResetOutputPin(_transmitPinPort, _transmitPinNumber); - tx_buffer >>= 1; - tx_tick_cnt = OVERSAMPLE; // Wait OVERSAMPLE ticks to send next bit - } - else { // Transmission finished - tx_tick_cnt = 1; - if (_output_pending) { - active_out = nullptr; - - // In half-duplex mode wait HALFDUPLEX_SWITCH_DELAY bit-periods after the byte has - // been transmitted before allowing the switch to RX mode - } - else if (tx_bit_cnt > 10 + OVERSAMPLE * HALFDUPLEX_SWITCH_DELAY) { - if (_half_duplex && active_listener == this) setRXTX(true); - active_out = nullptr; - } - } - } -} - -// -// The receive routine called by the interrupt handler -// -inline void SoftwareSerial::recv() { - if (--rx_tick_cnt <= 0) { // if rx_tick_cnt > 0 interrupt is discarded. Only when rx_tick_cnt reaches 0 is RX pin considered - bool inbit = LL_GPIO_IsInputPinSet(_receivePinPort, _receivePinNumber) ^ _inverse_logic; - if (rx_bit_cnt == -1) { // rx_bit_cnt = -1 : waiting for start bit - if (!inbit) { - // got start bit - rx_bit_cnt = 0; // rx_bit_cnt == 0 : start bit received - rx_tick_cnt = OVERSAMPLE + 1; // Wait 1 bit (OVERSAMPLE ticks) + 1 tick in order to sample RX pin in the middle of the edge (and not too close to the edge) - rx_buffer = 0; - } - else - rx_tick_cnt = 1; // Waiting for start bit, but wrong level. Wait for next Interrupt to check RX pin level - } - else if (rx_bit_cnt >= 8) { // rx_bit_cnt >= 8 : waiting for stop bit - if (inbit) { - // Stop-bit read complete. Add to buffer. - uint8_t next = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF; - if (next != _receive_buffer_head) { - // save new data in buffer: tail points to byte destination - _receive_buffer[_receive_buffer_tail] = rx_buffer; // save new byte - _receive_buffer_tail = next; - } - else // rx_bit_cnt = x with x = [0..7] correspond to new bit x received - _buffer_overflow = true; - } - // Full trame received. Restart waiting for start bit at next interrupt - rx_tick_cnt = 1; - rx_bit_cnt = -1; - } - else { - // data bits - rx_buffer >>= 1; - if (inbit) rx_buffer |= 0x80; - rx_bit_cnt++; // Prepare for next bit - rx_tick_cnt = OVERSAMPLE; // Wait OVERSAMPLE ticks before sampling next bit - } - } -} - -// -// Interrupt handling -// - -/* static */ -inline void SoftwareSerial::handleInterrupt(HardwareTimer*) { - if (active_in) active_in->recv(); - if (active_out) active_out->send(); -} - -// -// Constructor -// -SoftwareSerial::SoftwareSerial(uint16_t receivePin, uint16_t transmitPin, bool inverse_logic /* = false */) : - _receivePin(receivePin), - _transmitPin(transmitPin), - _receivePinPort(digitalPinToPort(receivePin)), - _receivePinNumber(STM_LL_GPIO_PIN(digitalPinToPinName(receivePin))), - _transmitPinPort(digitalPinToPort(transmitPin)), - _transmitPinNumber(STM_LL_GPIO_PIN(digitalPinToPinName(transmitPin))), - _speed(0), - _buffer_overflow(false), - _inverse_logic(inverse_logic), - _half_duplex(receivePin == transmitPin), - _output_pending(0), - _receive_buffer_tail(0), - _receive_buffer_head(0) -{ - if ((receivePin < NUM_DIGITAL_PINS) || (transmitPin < NUM_DIGITAL_PINS)) { - /* Enable GPIO clock for tx and rx pin*/ - set_GPIO_Port_Clock(STM_PORT(digitalPinToPinName(transmitPin))); - set_GPIO_Port_Clock(STM_PORT(digitalPinToPinName(receivePin))); - } - else - _Error_Handler("ERROR: invalid pin number\n", -1); -} - -// -// Destructor -// -SoftwareSerial::~SoftwareSerial() { end(); } - -// -// Public methods -// - -void SoftwareSerial::begin(long speed) { - #ifdef FORCE_BAUD_RATE - speed = FORCE_BAUD_RATE; - #endif - _speed = speed; - if (!_half_duplex) { - setTX(); - setRX(); - listen(); - } - else - setTX(); -} - -void SoftwareSerial::end() { - stopListening(); -} - -// Read data from buffer -int SoftwareSerial::read() { - // Empty buffer? - if (_receive_buffer_head == _receive_buffer_tail) return -1; - - // Read from "head" - uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte - _receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF; - return d; -} - -int SoftwareSerial::available() { - return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF; -} - -size_t SoftwareSerial::write(uint8_t b) { - // wait for previous transmit to complete - _output_pending = 1; - while (active_out) { /* nada */ } - // add start and stop bits. - tx_buffer = b << 1 | 0x200; - if (_inverse_logic) tx_buffer = ~tx_buffer; - tx_bit_cnt = 0; - tx_tick_cnt = OVERSAMPLE; - setSpeed(_speed); - if (_half_duplex) setRXTX(false); - _output_pending = 0; - // make us active - active_out = this; - return 1; -} - -void SoftwareSerial::flush() { - noInterrupts(); - _receive_buffer_head = _receive_buffer_tail = 0; - interrupts(); -} - -int SoftwareSerial::peek() { - // Empty buffer? - if (_receive_buffer_head == _receive_buffer_tail) return -1; - - // Read from "head" - return _receive_buffer[_receive_buffer_head]; -} - -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/SoftwareSerial.h b/Marlin/src/HAL/STM32/SoftwareSerial.h deleted file mode 100644 index 1a4f742c32fa..000000000000 --- a/Marlin/src/HAL/STM32/SoftwareSerial.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * SoftwareSerial.h (formerly NewSoftSerial.h) - * - * Multi-instance software serial library for Arduino/Wiring - * -- Interrupt-driven receive and other improvements by ladyada - * (https://ladyada.net) - * -- Tuning, circular buffer, derivation from class Print/Stream, - * multi-instance support, porting to 8MHz processors, - * various optimizations, PROGMEM delay tables, inverse logic and - * direct port writing by Mikal Hart (http://www.arduiniana.org) - * -- Pin change interrupt macros by Paul Stoffregen (https://www.pjrc.com) - * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) - * -- ATmega1280/2560 support by Brett Hagman (https://www.roguerobotics.com/) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * The latest version of this library can always be found at - * http://arduiniana.org. - */ -#pragma once - -#include - -/****************************************************************************** - * Definitions - ******************************************************************************/ - -#define _SS_MAX_RX_BUFF 64 // RX buffer size - -class SoftwareSerial : public Stream { - private: - // per object data - uint16_t _receivePin; - uint16_t _transmitPin; - GPIO_TypeDef *_receivePinPort; - uint32_t _receivePinNumber; - GPIO_TypeDef *_transmitPinPort; - uint32_t _transmitPinNumber; - uint32_t _speed; - - uint16_t _buffer_overflow: 1; - uint16_t _inverse_logic: 1; - uint16_t _half_duplex: 1; - uint16_t _output_pending: 1; - - unsigned char _receive_buffer[_SS_MAX_RX_BUFF]; - volatile uint8_t _receive_buffer_tail; - volatile uint8_t _receive_buffer_head; - - uint32_t delta_start = 0; - - // static data - static HardwareTimer timer; - static const IRQn_Type timer_interrupt_number; - static uint32_t timer_interrupt_priority; - static SoftwareSerial *active_listener; - static SoftwareSerial *volatile active_out; - static SoftwareSerial *volatile active_in; - static int32_t tx_tick_cnt; - static volatile int32_t rx_tick_cnt; - static uint32_t tx_buffer; - static int32_t tx_bit_cnt; - static uint32_t rx_buffer; - static int32_t rx_bit_cnt; - static uint32_t cur_speed; - - // private methods - void send(); - void recv(); - void setTX(); - void setRX(); - void setSpeed(uint32_t speed); - void setRXTX(bool input); - static void handleInterrupt(HardwareTimer *timer); - - public: - // public methods - - SoftwareSerial(uint16_t receivePin, uint16_t transmitPin, bool inverse_logic=false); - virtual ~SoftwareSerial(); - void begin(long speed); - bool listen(); - void end(); - bool isListening() { return active_listener == this; } - bool stopListening(); - bool overflow() { - bool ret = _buffer_overflow; - if (ret) _buffer_overflow = false; - return ret; - } - int peek(); - - virtual size_t write(uint8_t byte); - virtual int read(); - virtual int available(); - virtual void flush(); - operator bool() { return true; } - - static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); - - using Print::write; -}; diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index 11967314480f..c0ba19abe545 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -110,7 +110,6 @@ // ------------------------ HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { NULL }; -bool timer_enabled[NUM_HARDWARE_TIMERS] = { false }; // ------------------------ // Public functions @@ -135,6 +134,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { * which changes the prescaler when an IRQ frequency change is needed * (for example when steppers are turned on) */ + timer_instance[timer_num]->setPrescaleFactor(STEPPER_TIMER_PRESCALE); //the -1 is done internally timer_instance[timer_num]->setOverflow(_MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE) /* /frequency */), TICK_FORMAT); break; @@ -145,15 +145,13 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { break; } + // Disable preload. Leaving it default-enabled can cause the timer to stop if it happens + // to exit the ISR after the start time for the next interrupt has already passed. + timer_instance[timer_num]->setPreloadEnable(false); + HAL_timer_enable_interrupt(timer_num); - /* - * Initializes (and unfortunately starts) the timer. - * This is needed to set correct IRQ priority at the moment but causes - * no harm since every call to HAL_timer_start() is actually followed by - * a call to HAL_timer_enable_interrupt() which means that there isn't - * a case in which you want the timer to run without a callback. - */ + // Start the timer. timer_instance[timer_num]->resume(); // First call to resume() MUST follow the attachInterrupt() // This is fixed in Arduino_Core_STM32 1.8. @@ -161,47 +159,34 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { // timer_instance[timer_num]->setInterruptPriority switch (timer_num) { case STEP_TIMER_NUM: - HAL_NVIC_SetPriority(STEP_TIMER_IRQ_NAME, STEP_TIMER_IRQ_PRIO, 0); + timer_instance[timer_num]->setInterruptPriority(STEP_TIMER_IRQ_PRIO, 0); break; case TEMP_TIMER_NUM: - HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_NAME, TEMP_TIMER_IRQ_PRIO, 0); + timer_instance[timer_num]->setInterruptPriority(TEMP_TIMER_IRQ_PRIO, 0); break; } } } void HAL_timer_enable_interrupt(const uint8_t timer_num) { - if (HAL_timer_initialized(timer_num) && !timer_enabled[timer_num]) { - timer_enabled[timer_num] = true; + if (HAL_timer_initialized(timer_num) && !timer_instance[timer_num]->hasInterrupt()) { switch (timer_num) { case STEP_TIMER_NUM: - timer_instance[timer_num]->attachInterrupt(Step_Handler); - break; - case TEMP_TIMER_NUM: - timer_instance[timer_num]->attachInterrupt(Temp_Handler); - break; + timer_instance[timer_num]->attachInterrupt(Step_Handler); + break; + case TEMP_TIMER_NUM: + timer_instance[timer_num]->attachInterrupt(Temp_Handler); + break; } } } void HAL_timer_disable_interrupt(const uint8_t timer_num) { - if (HAL_timer_interrupt_enabled(timer_num)) { - timer_instance[timer_num]->detachInterrupt(); - timer_enabled[timer_num] = false; - } + if (HAL_timer_initialized(timer_num)) timer_instance[timer_num]->detachInterrupt(); } bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - return HAL_timer_initialized(timer_num) && timer_enabled[timer_num]; -} - -// Only for use within the HAL -TIM_TypeDef * HAL_timer_device(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: return STEP_TIMER_DEV; - case TEMP_TIMER_NUM: return TEMP_TIMER_DEV; - } - return nullptr; + return HAL_timer_initialized(timer_num) && timer_instance[timer_num]->hasInterrupt(); } void SetTimerInterruptPriorities() { @@ -209,4 +194,87 @@ void SetTimerInterruptPriorities() { TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIO, 0)); } +// This is a terrible hack to replicate the behavior used in the framework's SoftwareSerial.cpp +// to choose a serial timer. It will select TIM7 on most boards used by Marlin, but this is more +// resiliant to new MCUs which may not have a TIM7. Best practice is to explicitly specify +// TIMER_SERIAL to avoid relying on framework selections which may not be predictable. +#if !defined(TIMER_SERIAL) + #if defined (TIM18_BASE) + #define TIMER_SERIAL TIM18 + #elif defined (TIM7_BASE) + #define TIMER_SERIAL TIM7 + #elif defined (TIM6_BASE) + #define TIMER_SERIAL TIM6 + #elif defined (TIM22_BASE) + #define TIMER_SERIAL TIM22 + #elif defined (TIM21_BASE) + #define TIMER_SERIAL TIM21 + #elif defined (TIM17_BASE) + #define TIMER_SERIAL TIM17 + #elif defined (TIM16_BASE) + #define TIMER_SERIAL TIM16 + #elif defined (TIM15_BASE) + #define TIMER_SERIAL TIM15 + #elif defined (TIM14_BASE) + #define TIMER_SERIAL TIM14 + #elif defined (TIM13_BASE) + #define TIMER_SERIAL TIM13 + #elif defined (TIM11_BASE) + #define TIMER_SERIAL TIM11 + #elif defined (TIM10_BASE) + #define TIMER_SERIAL TIM10 + #elif defined (TIM12_BASE) + #define TIMER_SERIAL TIM12 + #elif defined (TIM19_BASE) + #define TIMER_SERIAL TIM19 + #elif defined (TIM9_BASE) + #define TIMER_SERIAL TIM9 + #elif defined (TIM5_BASE) + #define TIMER_SERIAL TIM5 + #elif defined (TIM4_BASE) + #define TIMER_SERIAL TIM4 + #elif defined (TIM3_BASE) + #define TIMER_SERIAL TIM3 + #elif defined (TIM2_BASE) + #define TIMER_SERIAL TIM2 + #elif defined (TIM20_BASE) + #define TIMER_SERIAL TIM20 + #elif defined (TIM8_BASE) + #define TIMER_SERIAL TIM8 + #elif defined (TIM1_BASE) + #define TIMER_SERIAL TIM1 + #else + #error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h + #endif +#endif + +// Place all timers used into an array, then recursively check for duplicates during compilation. +// This does not currently account for timers used for PWM, such as for fans. +// Timers are actually pointers. Convert to integers to simplify constexpr logic. +static constexpr uintptr_t timers_in_use[] = { + uintptr_t(TEMP_TIMER_DEV), // Override in pins file + uintptr_t(STEP_TIMER_DEV), // Override in pins file + #if HAS_TMC_SW_SERIAL + uintptr_t(TIMER_SERIAL), // Set in variant.h, or as a define in platformio.h if not present in variant.h + #endif + #if ENABLED(SPEAKER) + uintptr_t(TIMER_TONE), // Set in variant.h, or as a define in platformio.h if not present in variant.h + #endif + #if HAS_SERVOS + uintptr_t(TIMER_SERVO), // Set in variant.h, or as a define in platformio.h if not present in variant.h + #endif + }; + +static constexpr bool verify_no_duplicate_timers() { + LOOP_L_N(i, COUNT(timers_in_use)) + LOOP_S_L_N(j, i + 1, COUNT(timers_in_use)) + if (timers_in_use[i] == timers_in_use[j]) return false; + return true; +} + +// If this assertion fails at compile time, review the timers_in_use array. If default_envs is +// defined properly in platformio.ini, VS Code can evaluate the array when hovering over it, +// making it easy to identify the conflicting timers. +static_assert(verify_no_duplicate_timers(), "One or more timer conflict detected"); + #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/timers.h b/Marlin/src/HAL/STM32/timers.h index 000f86043bb3..5515219ead00 100644 --- a/Marlin/src/HAL/STM32/timers.h +++ b/Marlin/src/HAL/STM32/timers.h @@ -30,8 +30,18 @@ #define FORCE_INLINE __attribute__((always_inline)) inline +// STM32 timers may be 16 or 32 bit. Limiting HAL_TIMER_TYPE_MAX to 16 bits +// avoids issues with STM32F0 MCUs, which seem to pause timers if UINT32_MAX +// is written to the register. STM32F4 timers do not manifest this issue, +// even when writing to 16 bit timers. +// +// The range of the timer can be queried at runtime using IS_TIM_32B_COUNTER_INSTANCE. +// This is a more expensive check than a simple compile-time constant, so its +// implementation is deferred until the desire for a 32-bit range outweighs the cost +// of adding a run-time check and HAL_TIMER_TYPE_MAX is refactored to allow unique +// values for each timer. #define hal_timer_t uint32_t -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF // Timers can be 16 or 32 bit +#define HAL_TIMER_TYPE_MAX UINT16_MAX #ifndef STEP_TIMER_NUM #define STEP_TIMER_NUM 0 // Timer Index for Stepper @@ -61,14 +71,14 @@ #define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) #define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) -extern void Step_Handler(HardwareTimer *htim); -extern void Temp_Handler(HardwareTimer *htim); +extern void Step_Handler(); +extern void Temp_Handler(); #ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() void Step_Handler(HardwareTimer *htim) + #define HAL_STEP_TIMER_ISR() void Step_Handler() #endif #ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() void Temp_Handler(HardwareTimer *htim) + #define HAL_TEMP_TIMER_ISR() void Temp_Handler() #endif // ------------------------ @@ -90,8 +100,6 @@ bool HAL_timer_interrupt_enabled(const uint8_t timer_num); // Exposed here to allow all timer priority information to reside in timers.cpp void SetTimerInterruptPriorities(); -//TIM_TypeDef* HAL_timer_device(const uint8_t timer_num); no need to be public for now. not public = not used externally - // FORCE_INLINE because these are used in performance-critical situations FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_num) { return timer_instance[timer_num] != NULL; diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index e280d955b800..c8e1f287548d 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -282,7 +282,7 @@ #define BOARD_STM32F103RE 4000 // STM32F103RE Libmaple-based STM32F1 controller #define BOARD_MALYAN_M200 4001 // STM32C8T6 Libmaple-based STM32F1 controller -#define BOARD_MALYAN_M200_V2 4002 // STM32F070RB Libmaple-based STM32F0 controller +#define BOARD_MALYAN_M200_V2 4002 // STM32F070CB STM32F0 controller #define BOARD_STM3R_MINI 4003 // STM32F103RE Libmaple-based STM32F1 controller #define BOARD_GTM32_PRO_VB 4004 // STM32F103VET6 controller #define BOARD_MORPHEUS 4005 // STM32F103C8 / STM32F103CB Libmaple-based STM32F1 controller diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 2dfb2b53b8ea..9f120b8b0091 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -480,7 +480,7 @@ // STM32 ARM Cortex-M0 // #elif MB(MALYAN_M200_V2) - #include "stm32f0/pins_MALYAN_M200_V2.h" // STM32F0 env:STM32F070RB_malyan + #include "stm32f0/pins_MALYAN_M200_V2.h" // STM32F0 env:STM32F070RB_malyan env:STM32F070CB_malyan #elif MB(MALYAN_M300) #include "stm32f0/pins_MALYAN_M300.h" // STM32F070 env:malyan_M300 diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index d3510b1ff815..009b1b65f1e8 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F4 +#ifndef STM32F4 #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 1 || E_STEPPERS > 1 #error "BIGTREE BTT002 V1.0 supports up to 1 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index ea643322b67b..55d1a37aa7f7 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F4 +#ifndef STM32F4 #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #elif HOTENDS > 8 || E_STEPPERS > 8 #error "BIGTREE GTR V1.0 supports up to 8 hotends / E-steppers." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 56c509562fc5..9e6a43c36b9a 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -21,7 +21,7 @@ */ #pragma once -#ifndef TARGET_STM32F4 +#ifndef STM32F4 #error "Oops! Select an STM32F4 board in 'Tools > Board.'" #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 3b513b31ca8c..90f9e500133a 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -42,11 +42,12 @@ // Configure Timers // TIM6 is used for TONE // TIM7 is used for SERVO -// TIMER_SERIAL defaults to TIM7 so we'll override it here -// -#define STEP_TIMER 10 -#define TEMP_TIMER 14 -#define TIMER_SERIAL TIM9 +// TIMER_SERIAL defaults to TIM7 and must be overridden in the platformio.h file if SERVO will also be used. +// This will be difficult to solve from the Arduino IDE, without modifying the RUMBA32 variant +// included with the STM32 framework. + +#define STEP_TIMER 10 +#define TEMP_TIMER 14 #define HAL_TIMER_RATE F_CPU // diff --git a/buildroot/share/PlatformIO/boards/LERDGE.json b/buildroot/share/PlatformIO/boards/LERDGE.json index 21df8db48e7e..011814a13361 100644 --- a/buildroot/share/PlatformIO/boards/LERDGE.json +++ b/buildroot/share/PlatformIO/boards/LERDGE.json @@ -15,7 +15,8 @@ ] ], "mcu": "stm32f407zgt6", - "variant": "LERDGE" + "variant": "LERDGE", + "ldscript": "LERDGE.ld" }, "debug": { "jlink_device": "STM32F407ZG", diff --git a/buildroot/share/PlatformIO/boards/malyanM200v2.json b/buildroot/share/PlatformIO/boards/malyanM200v2.json index 9e301ee79f31..765a0c0a0006 100644 --- a/buildroot/share/PlatformIO/boards/malyanM200v2.json +++ b/buildroot/share/PlatformIO/boards/malyanM200v2.json @@ -4,7 +4,7 @@ "extra_flags": "-DSTM32F070xB", "f_cpu": "48000000L", "mcu": "stm32f070rbt6", - "variant": "MALYANM200_F070CB", + "variant": "MALYANMx00_F070CB", "vec_tab_addr": "0x8002000" }, "debug": { diff --git a/buildroot/share/PlatformIO/boards/fysetc_s6.json b/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json similarity index 94% rename from buildroot/share/PlatformIO/boards/fysetc_s6.json rename to buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json index 489a15b9efe0..286e46ffbd20 100644 --- a/buildroot/share/PlatformIO/boards/fysetc_s6.json +++ b/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json @@ -4,7 +4,7 @@ "extra_flags": "-DSTM32F446xx", "f_cpu": "180000000L", "mcu": "stm32f446ret6", - "variant": "FYSETC_S6" + "variant": "MARLIN_FYSETC_S6" }, "connectivity": [ "can" @@ -32,4 +32,4 @@ }, "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html", "vendor": "FYSETC" -} \ No newline at end of file +} diff --git a/buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py b/buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py deleted file mode 100644 index f6598ede6543..000000000000 --- a/buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py +++ /dev/null @@ -1,33 +0,0 @@ -from os.path import join -Import("env") - -import os,shutil -from SCons.Script import DefaultEnvironment -from platformio import util - -env = DefaultEnvironment() -platform = env.PioPlatform() -board = env.BoardConfig() - -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32") -#FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32@3.10500.190327") -CMSIS_DIR = os.path.join(FRAMEWORK_DIR, "CMSIS", "CMSIS") -assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir(CMSIS_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") - -mcu_type = board.get("build.mcu")[:-2] -variant = board.get("build.variant") -series = mcu_type[:7].upper() + "xx" -variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) - -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) -assert os.path.isdir(source_dir) - -if not os.path.isdir(variant_dir): - os.mkdir(variant_dir) - -for file_name in os.listdir(source_dir): - full_file_name = os.path.join(source_dir, file_name) - if os.path.isfile(full_file_name): - shutil.copy(full_file_name, variant_dir) diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/FYSETC_S6/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h similarity index 99% rename from buildroot/share/PlatformIO/variants/FYSETC_S6/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h index da6a8249eed7..ee4b1ef29608 100644 --- a/buildroot/share/PlatformIO/variants/FYSETC_S6/variant.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h @@ -115,7 +115,7 @@ extern "C" { #define NUM_ANALOG_FIRST 80 // PWM resolution -#define PWM_RESOLUTION 12 +// #define PWM_RESOLUTION 12 #define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans #define PWM_MAX_DUTY_CYCLE 255 diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan-tests new file mode 100644 index 000000000000..20bd111fa9c0 --- /dev/null +++ b/buildroot/tests/STM32F070CB_malyan-tests @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F070CB Malyan M200 v2 +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 +opt_set SERIAL_PORT -1 +exec_test $1 $2 "Malyan M200 v2 Default Config" + +# cleanup +restore_configs diff --git a/platformio.ini b/platformio.ini index e3ff6c152634..f46e60996917 100644 --- a/platformio.ini +++ b/platformio.ini @@ -661,13 +661,10 @@ board = nxp_lpc1769 # HAL/STM32 Base Environment values # [common_stm32] -platform = ststm32@~6.1.0 -platform_packages = framework-arduinoststm32@>=4.10700,<4.10800 -lib_ignore = SoftwareSerial +platform = ststm32@~8.0 build_flags = ${common.build_flags} - -IMarlin/src/HAL/STM32 -std=gnu++14 + -std=gnu++14 -DUSBCON -DUSBD_USE_CDC - -DUSBD_VID=0x0483 -DTIM_IRQ_PRIO=13 build_unflags = -std=gnu++11 src_filter = ${common.default_src_filter} + @@ -676,7 +673,7 @@ src_filter = ${common.default_src_filter} + # HAL/STM32F1 Common Environment values # [common_stm32f1] -platform = ${common_stm32.platform} +platform = ststm32@~6.1 build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py ${common.build_flags} -std=gnu++14 -DHAVE_SW_SERIAL build_unflags = -std=gnu11 -std=gnu++11 @@ -828,7 +825,6 @@ platform = ${common_stm32.platform} extends = common_stm32 board = armed_v1 build_flags = ${common_stm32.build_flags} - '-DUSB_PRODUCT="ARMED_V1"' -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing # @@ -1008,20 +1004,29 @@ lib_ignore = ${common_stm32f1.lib_ignore} platform = ${common_stm32.platform} extends = common_stm32 board = malyanM200v2 -build_flags = ${common_stm32.build_flags} -DSTM32F0xx -DUSB_PRODUCT=\"STM32F070RB\" -DHAL_PCD_MODULE_ENABLED - -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing -std=gnu11 -std=gnu++11 +build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED + -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing -DCUSTOM_STARTUP_FILE -lib_ignore = SoftwareSerial + +# +# Malyan M200 v2 (STM32F070CB) +# +[env:STM32F070CB_malyan] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanm200_f070cb +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -DCUSTOM_STARTUP_FILE # # Malyan M300 (STM32F070CB) # [env:malyan_M300] -platform = ststm32@>=6.1.0,<6.2.0 +platform = ${common_stm32.platform} +extends = common_stm32 board = malyanm300_f070cb -build_flags = ${common.build_flags} - -DUSBCON -DUSBD_VID=0x0483 "-DUSB_MANUFACTURER=\"Unknown\"" "-DUSB_PRODUCT=\"MALYAN_M300\"" - -DHAL_PCD_MODULE_ENABLED -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED src_filter = ${common.default_src_filter} + # @@ -1074,13 +1079,11 @@ platform = ${common_stm32.platform} extends = common_stm32 board = STEVAL_STM32F401VE build_flags = ${common_stm32.build_flags} - -DTARGET_STM32F4 -DARDUINO_STEVAL -DSTM32F401xE - -DUSB_PRODUCT=\"STEVAL_F401VE\" + -DARDUINO_STEVAL -DSTM32F401xE -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py -lib_ignore = SoftwareSerial # # FLYF407ZG @@ -1090,8 +1093,7 @@ platform = ${common_stm32.platform} extends = common_stm32 board = FLYF407ZG build_flags = ${common_stm32.build_flags} - -DSTM32F4 -DUSB_PRODUCT=\"STM32F407ZG\" - -DTARGET_STM32F4 -DVECT_TAB_OFFSET=0x8000 + -DVECT_TAB_OFFSET=0x8000 extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py @@ -1101,14 +1103,13 @@ extra_scripts = ${common.extra_scripts} [env:FYSETC_S6] platform = ${common_stm32.platform} extends = common_stm32 -platform_packages = ${common_stm32.platform_packages} - tool-stm32duino -board = fysetc_s6 +platform_packages = tool-stm32duino +board = marlin_fysetc_s6 build_flags = ${common_stm32.build_flags} - -DTARGET_STM32F4 -DVECT_TAB_OFFSET=0x10000 - -DHAL_PCD_MODULE_ENABLED '-DUSB_PRODUCT="FYSETC_S6"' + -DVECT_TAB_OFFSET=0x10000 + -DHAL_PCD_MODULE_ENABLED extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/fysetc_STM32S6.py + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py debug_tool = stlink upload_protocol = dfu upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" @@ -1123,12 +1124,10 @@ platform = ${common_stm32.platform} extends = common_stm32 board = blackSTM32F407VET6 build_flags = ${common_stm32.build_flags} - -DTARGET_STM32F4 -DARDUINO_BLACK_F407VE - -DUSB_PRODUCT=\"BLACK_F407VE\" + -DARDUINO_BLACK_F407VE -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -lib_ignore = SoftwareSerial # # BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) @@ -1138,8 +1137,7 @@ platform = ${common_stm32.platform} extends = common_stm32 board = BigTree_SKR_Pro build_flags = ${common_stm32.build_flags} - -DUSB_PRODUCT=\"STM32F407ZG\" - -DTARGET_STM32F4 -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py #upload_protocol = stlink @@ -1151,14 +1149,13 @@ debug_init_break = # Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) # [env:BIGTREE_GTR_V1_0] -platform = ststm32@>=5.7.0,<6.2.0 +platform = ${common_stm32.platform} extends = common_stm32 board = BigTree_GTR_v1 extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py build_flags = ${common_stm32.build_flags} - -DUSB_PRODUCT=\"STM32F407IG\" - -DTARGET_STM32F4 -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 # # BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) @@ -1168,8 +1165,7 @@ platform = ${common_stm32.platform} extends = common_stm32 board = BigTree_Btt002 build_flags = ${common_stm32.build_flags} - -DUSB_PRODUCT=\"STM32F407VG\" - -DTARGET_STM32F4 -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 + -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 -DHAVE_HWSERIAL2 -DHAVE_HWSERIAL3 -DPIN_SERIAL2_RX=PD_6 @@ -1226,10 +1222,10 @@ platform = ${common_stm32.platform} extends = common_stm32 build_flags = ${common_stm32.build_flags} -Os - "-DUSB_PRODUCT=\"RUMBA32\"" -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED + -DTIMER_SERIAL=TIM9 board = rumba32_f446ve upload_protocol = dfu monitor_speed = 500000 From 40fdf8f0873c07f074094de556928b0642d8f80a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 9 Sep 2020 00:12:44 +0000 Subject: [PATCH 482/483] [cron] Bump distribution date (2020-09-09) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 1d14b8e086bd..0ef5c28f7e47 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-09-08" + #define STRING_DISTRIBUTION_DATE "2020-09-09" #endif /** From bc7720c0cd3917f44200c0b78e1b635e4c7b6797 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 8 Sep 2020 22:14:59 -0500 Subject: [PATCH 483/483] Minor HAL cleanup --- .../dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp | 2 +- Marlin/src/HAL/STM32F1/SoftwareSerial.cpp | 2 +- Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.h | 6 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 11 +- Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp | 2 +- .../src/HAL/shared/backtrace/unwmemaccess.cpp | 236 +++++++++--------- 7 files changed, 135 insertions(+), 126 deletions(-) diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp index 2ef7011b1c65..28e82d70d454 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -147,4 +147,4 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va #endif // HAS_GRAPHICAL_LCD -#endif //__SAM3X8E__ +#endif // __SAM3X8E__ diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp index 3641c9fdf037..993403cf720d 100644 --- a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp +++ b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp @@ -57,4 +57,4 @@ void SoftwareSerial::stopListening() { listening = false; } -#endif //__STM32F1__ +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp index 6fe81819ab85..ebd0b4cee7d0 100644 --- a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp @@ -72,7 +72,7 @@ static SPISettings spiConfig; */ void spiBegin() { #if !defined(SS_PIN) || SS_PIN < 0 - #error SS_PIN not defined! + #error "SS_PIN not defined!" #endif OUT_WRITE(SS_PIN, HIGH); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 890930f7f8be..ad095cba83cc 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -44,8 +44,10 @@ //#undef MOTHERBOARD //#define MOTHERBOARD BOARD_TEENSY31_32 -#define IS_32BIT_TEENSY defined(__MK20DX256__) -#define IS_TEENSY32 defined(__MK20DX256__) +#ifdef __MK20DX256__ + #define IS_32BIT_TEENSY 1 + #define IS_TEENSY32 1 +#endif #define NUM_SERIAL 1 diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 5442ae2d3b5f..96be08d7b7ca 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -45,9 +45,14 @@ // Defines // ------------------------ -#define IS_32BIT_TEENSY (defined(__MK64FX512__) || defined(__MK66FX1M0__)) -#define IS_TEENSY35 defined(__MK64FX512__) -#define IS_TEENSY36 defined(__MK66FX1M0__) +#ifdef __MK64FX512__ + #define IS_32BIT_TEENSY 1 + #define IS_TEENSY35 1 +#endif +#ifdef __MK66FX1M0__ + #define IS_32BIT_TEENSY 1 + #define IS_TEENSY36 1 +#endif #define NUM_SERIAL 1 diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp index 0b1ae4afa45c..812aa90c83b3 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp @@ -31,7 +31,7 @@ static SPISettings spiConfig; void spiBegin() { #if !PIN_EXISTS(SS) - #error SS_PIN not defined! + #error "SS_PIN not defined!" #endif OUT_WRITE(SS_PIN, HIGH); SET_OUTPUT(SCK_PIN); diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index 8cf31cadf556..02a6ad34f0c7 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -20,124 +20,126 @@ /* Validate address */ #ifdef ARDUINO_ARCH_SAM -// For DUE, valid address ranges are -// SRAM (0x20070000 - 0x20088000) (96kb) -// FLASH (0x00080000 - 0x00100000) (512kb) -// -#define START_SRAM_ADDR 0x20070000 -#define END_SRAM_ADDR 0x20088000 -#define START_FLASH_ADDR 0x00080000 -#define END_FLASH_ADDR 0x00100000 -#endif - -#ifdef TARGET_LPC1768 -// For LPC1769: -// SRAM (0x10000000 - 0x10008000) (32kb) -// FLASH (0x00000000 - 0x00080000) (512kb) -// -#define START_SRAM_ADDR 0x10000000 -#define END_SRAM_ADDR 0x10008000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00080000 -#endif - -#if 0 -// For STM32F103CBT6 -// SRAM (0x20000000 - 0x20005000) (20kb) -// FLASH (0x00000000 - 0x00020000) (128kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20005000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00020000 -#endif -#if defined(__STM32F1__) || defined(STM32F1xx) || defined(STM32F0xx) -// For STM32F103ZET6/STM32F103VET6/STM32F0xx -// SRAM (0x20000000 - 0x20010000) (64kb) -// FLASH (0x00000000 - 0x00080000) (512kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20010000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00080000 -#endif - -#if defined(STM32F4) || defined(STM32F4xx) -// For STM32F407VET -// SRAM (0x20000000 - 0x20030000) (192kb) -// FLASH (0x08000000 - 0x08080000) (512kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20030000 -#define START_FLASH_ADDR 0x08000000 -#define END_FLASH_ADDR 0x08080000 -#endif - -#if MB(THE_BORG) -// For STM32F765 in BORG -// SRAM (0x20000000 - 0x20080000) (512kb) -// FLASH (0x08000000 - 0x08100000) (1024kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20080000 -#define START_FLASH_ADDR 0x08000000 -#define END_FLASH_ADDR 0x08100000 -#endif + // For DUE, valid address ranges are + // SRAM (0x20070000 - 0x20088000) (96kb) + // FLASH (0x00080000 - 0x00100000) (512kb) + // + #define START_SRAM_ADDR 0x20070000 + #define END_SRAM_ADDR 0x20088000 + #define START_FLASH_ADDR 0x00080000 + #define END_FLASH_ADDR 0x00100000 + +#elif defined(TARGET_LPC1768) + + // For LPC1769: + // SRAM (0x10000000 - 0x10008000) (32kb) + // FLASH (0x00000000 - 0x00080000) (512kb) + // + #define START_SRAM_ADDR 0x10000000 + #define END_SRAM_ADDR 0x10008000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00080000 + +#elif 0 + + // For STM32F103CBT6 + // SRAM (0x20000000 - 0x20005000) (20kb) + // FLASH (0x00000000 - 0x00020000) (128kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20005000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00020000 + +#elif defined(__STM32F1__) || defined(STM32F1xx) || defined(STM32F0xx) + + // For STM32F103ZET6/STM32F103VET6/STM32F0xx + // SRAM (0x20000000 - 0x20010000) (64kb) + // FLASH (0x00000000 - 0x00080000) (512kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20010000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00080000 + +#elif defined(STM32F4) || defined(STM32F4xx) + + // For STM32F407VET + // SRAM (0x20000000 - 0x20030000) (192kb) + // FLASH (0x08000000 - 0x08080000) (512kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20030000 + #define START_FLASH_ADDR 0x08000000 + #define END_FLASH_ADDR 0x08080000 + +#elif MB(THE_BORG) + + // For STM32F765 in BORG + // SRAM (0x20000000 - 0x20080000) (512kb) + // FLASH (0x08000000 - 0x08100000) (1024kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20080000 + #define START_FLASH_ADDR 0x08000000 + #define END_FLASH_ADDR 0x08100000 + +#elif MB(REMRAM_V1) + + // For STM32F765VI in RemRam v1 + // SRAM (0x20000000 - 0x20080000) (512kb) + // FLASH (0x08000000 - 0x08200000) (2048kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20080000 + #define START_FLASH_ADDR 0x08000000 + #define END_FLASH_ADDR 0x08200000 + +#elif defined(__MK20DX256__) + + // For MK20DX256 in TEENSY 3.1 or TEENSY 3.2 + // SRAM (0x1FFF8000 - 0x20008000) (64kb) + // FLASH (0x00000000 - 0x00040000) (256kb) + // + #define START_SRAM_ADDR 0x1FFF8000 + #define END_SRAM_ADDR 0x20008000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00040000 + +#elif defined(__MK64FX512__) + + // For MK64FX512 in TEENSY 3.5 + // SRAM (0x1FFF0000 - 0x20020000) (192kb) + // FLASH (0x00000000 - 0x00080000) (512kb) + // + #define START_SRAM_ADDR 0x1FFF0000 + #define END_SRAM_ADDR 0x20020000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00080000 + +#elif defined(__MK66FX1M0__) + + // For MK66FX1M0 in TEENSY 3.6 + // SRAM (0x1FFF0000 - 0x20030000) (256kb) + // FLASH (0x00000000 - 0x00140000) (1.25Mb) + // + #define START_SRAM_ADDR 0x1FFF0000 + #define END_SRAM_ADDR 0x20030000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00140000 + +#elif defined(__SAMD51P20A__) + + // For SAMD51x20, valid address ranges are + // SRAM (0x20000000 - 0x20040000) (256kb) + // FLASH (0x00000000 - 0x00100000) (1024kb) + // + #define START_SRAM_ADDR 0x20000000 + #define END_SRAM_ADDR 0x20040000 + #define START_FLASH_ADDR 0x00000000 + #define END_FLASH_ADDR 0x00100000 -#if MB(REMRAM_V1) -// For STM32F765VI in RemRam v1 -// SRAM (0x20000000 - 0x20080000) (512kb) -// FLASH (0x08000000 - 0x08200000) (2048kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20080000 -#define START_FLASH_ADDR 0x08000000 -#define END_FLASH_ADDR 0x08200000 -#endif - -#ifdef __MK20DX256__ -// For MK20DX256 in TEENSY 3.1 or TEENSY 3.2 -// SRAM (0x1FFF8000 - 0x20008000) (64kb) -// FLASH (0x00000000 - 0x00040000) (256kb) -// -#define START_SRAM_ADDR 0x1FFF8000 -#define END_SRAM_ADDR 0x20008000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00040000 -#endif - -#ifdef __MK64FX512__ -// For MK64FX512 in TEENSY 3.5 -// SRAM (0x1FFF0000 - 0x20020000) (192kb) -// FLASH (0x00000000 - 0x00080000) (512kb) -// -#define START_SRAM_ADDR 0x1FFF0000 -#define END_SRAM_ADDR 0x20020000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00080000 -#endif - -#ifdef __MK66FX1M0__ -// For MK66FX1M0 in TEENSY 3.6 -// SRAM (0x1FFF0000 - 0x20030000) (256kb) -// FLASH (0x00000000 - 0x00140000) (1.25Mb) -// -#define START_SRAM_ADDR 0x1FFF0000 -#define END_SRAM_ADDR 0x20030000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00140000 -#endif - -#ifdef __SAMD51P20A__ -// For SAMD51x20, valid address ranges are -// SRAM (0x20000000 - 0x20040000) (256kb) -// FLASH (0x00000000 - 0x00100000) (1024kb) -// -#define START_SRAM_ADDR 0x20000000 -#define END_SRAM_ADDR 0x20040000 -#define START_FLASH_ADDR 0x00000000 -#define END_FLASH_ADDR 0x00100000 #endif static bool validate_addr(uint32_t addr) { @@ -177,4 +179,4 @@ bool UnwReadB(const uint32_t a, uint8_t *v) { return true; } -#endif +#endif // __arm__ || __thumb__

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